Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何撤销一个';s已经被拉/合并了?_Git_Git Merge_Git Rebase - Fatal编程技术网

Git 如何撤销一个';s已经被拉/合并了?

Git 如何撤销一个';s已经被拉/合并了?,git,git-merge,git-rebase,Git,Git Merge,Git Rebase,我陷入了一个奇怪的困境——我们让一个开发人员多次跨分支执行“git拉-再基”,而我正试图修复损坏。我们的图表最初是这样的: [master] A--B (origin/master) ___\________________________ [branch] \ C--D--E (origin/branch) [master] A--B---------------H--I (origin/master) \ / C--D--E-

我陷入了一个奇怪的困境——我们让一个开发人员多次跨分支执行“git拉-再基”,而我正试图修复损坏。我们的图表最初是这样的:

[master]
A--B (origin/master)
___\________________________
[branch]
     \
      C--D--E (origin/branch)
[master]
A--B---------------H--I (origin/master)
    \             /
     C--D--E--F--G
____________\_______________ 
[branch]     \
              J--K--L (origin/branch)
在错误合并之后,我们的图形现在看起来如下所示:

[master]
A--B (origin/master)
___\________________________
[branch]
     \
      C--D--E (origin/branch)
[master]
A--B---------------H--I (origin/master)
    \             /
     C--D--E--F--G
____________\_______________ 
[branch]     \
              J--K--L (origin/branch)
提交F和G真正属于master,而C、D和E属于分支

恢复图形的最佳方法是什么?Commit I已经被拉到其他分支和本地存储库上。是否是恢复单个提交的唯一选项?上面的图表被简化了——有40多个提交被错误地合并

我尝试了一些方法,包括将F和G重设为B,但这就产生了H'和I',我不确定如何处理已经被拉/合并的旧H和I

更新


如果我只是想git将master和cherry pick上的特定提交还原到分支上,那么如何“预先”提交到分支上?在这种情况下,我该如何挑选C和D成为J的父母呢?

+1接受CharlesB的建议。将F和G重设为B似乎可以解决问题。您可能还需要重新设置H和I的基址,直到结束。您可能需要按-f(force)将其放入origin,但一旦origin看起来应该这样做,随着用户的拉动,他们的存储库也应该自行更正


在Git中,原始节点将始终存在(直到Git gc发现它们被放弃了一段时间),但在新的F、G、H和I节点链结束时使用主标签,它将建立正确的沿袭。

将F和G重定为B是正确的方法。旧的H和I不再有效,将被H'和I'取代,所以我不完全理解你的问题