不同哈希值的提交如何合并

3

情节: 我有一个本地的developmaster分支。developmaster超前约90个提交,从大约6个月前开始。

我运行了一个git filter-branch -f --index-filter 'git rm --force --cached --ignore-unmatch media/*' -- --all命令,重写了比我预期更多的git历史记录,在两个分支上都进行了操作。由于该命令的作用,造成了极多的git操作,这使得我的git reflog无用了。

我通过简单的git reset --hard origin/master命令轻松地恢复了master分支,但是我的develop分支处于非常糟糕的状态。

现在,显然,masterdevelop之间的提交哈希值不匹配,这使得git认为我有无数个提交需要推送和拉取到/自己的remote/develop(应该没有需要拉取的提交,需要推送约90个提交)。

是否有一种方法可以使git "协调"所有来自masterdevelop的提交?应该是像这样的:

for commit in commits_in_master:
    tmp = search_by_commit_autor_and_date_and_message_in_develop(commit)
    tmp.hash = commit.hash
    tmp.save()

编辑:

如果我所要求的操作不可行,那么我能否(以某种方式)仅提取未推送到origin/develop的大约90个提交,然后重置我的develop分支为origin/develop,最后应用这些大约90个提交?

2个回答

1
git fetch -u . '+refs/original/*:*'
git reset --hard

将所有内容放回过滤分支之前的提交状态。

运行 fetch 命令后,我只得到了 zsh: no matches found: +refs/original/*:* 的提示。 - alexandernst
你已经配置好了你的zsh,以拒绝那些可能是通配符但没有匹配任何内容的东西。你可以引用它,这样zsh就不会像审问者一样对你进行全面的审查,我已经加入了防御措施。 - jthill
实际上,zsh的配置是问题所在。不管怎样,这似乎并没有解决问题,因为git仍然认为我有很多提交要推送/拉取。 - alexandernst

1
在运行filter-branch之前,Git会备份所有当前分支的头部,并将它们存储在refs/original命名空间中。您可以将分支重置为指向旧的头部(在重置分支之前备份整个存储库不会有任何损失,安全第一)。
git branch -f develop original/refs/heads/develop
< p > original 命名空间与您的常规引用目录具有相同的布局。


我收到了“致命错误:无法强制更新当前分支”的消息。 - alexandernst
1
这意味着develop是您当前的分支(您已经检出的分支)。只要您不介意覆盖索引和工作树内容,您可以使用git reset --hard refs/original/refs/heads/develop而不是git branch -f - torek
名称或引用存在问题。fatal: ambiguous argument 'refs/original/refs/heads/develop': unknown revision or path not in the working tree. - alexandernst
@alexandernst 抱歉,是我的错。前导的 refs 不应该在那里(Git 已经隐式添加了它)。已更新答案,现在应该可以工作了。 - knittl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接