如何在`git merge`后使用`git rebase-i`而不搞砸呢? [英] How do I use `git rebase -i` after `git merge` without messing things up?
本文介绍了如何在`git merge`后使用`git rebase-i`而不搞砸呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下情况:
我对本地存储库进行了一些提交,然后将另一个分支(大约150个提交)巨大地合并到主存储库中。其中有很多冲突。
现在,我要将合并前所做的提交移动到它之后,然后再推送。
正常情况下,我会使用rebase -i
。
不幸的是,默认行为是破坏我所做的一次合并提交,该提交实际上将150多个提交添加到单独的提交中(我理解这就像我一开始使用REBASE而不是MERGE)-这对我来说是不好的行为,原因有几个。
我非常高兴地发现了REBASE的-p
标志,它保留了合并。
不幸的是,这实际上再次应用了相同的合并,忘记了我在解决冲突方面所做的所有努力。又来了-行为不端!
我想要的有解决方案吗?合并后使用rebase -i
重新排序或编辑特定提交,而不必重复合并后操作?
谢谢!
推荐答案
下面是我在注释中提到的rerere-train.sh脚本的功能-本质上它重做合并,使用您的分辨率,然后让我们重新查看它。如果您愿意,您可以仅针对您的单次提交手动执行此操作:
git checkout <parent of merge commit>
git merge <merged commit> # if this goes cleanly, we're done
git rerere # done automatically if rerere.enabled is true
git checkout <merge commit> -- . # check out the files from the result of the merge
git rerere # done automatically if rerere.enabled is true
git reset --hard # wipe away the merge
# and you'd want to follow with git checkout <branch> to return to where you were
但是您也可以将rerere.enabled
设置为true,然后执行这些步骤,减去对git rerere
的直接调用-这样您就可以在将来进行设置,每当您解决冲突时就会自动运行Rerere。这就是我的工作-太棒了。
如果您想要直接运行该脚本,您可能需要使用rerere-train.sh ^<commit before the merge> <current branch>
这样的参数来运行它。(^commit
表示不要越过它进入历史记录(&q;),因此它不会费心为您的Repo中的所有合并提交操作。)
rebase -i
,当您遇到冲突时,Rerere将重用记录的解决方案。提醒一下:它仍然会将索引中标记为冲突的文件保留下来,这样您就可以检查它们并确保它所做的事情是有意义的。完成后,请使用git add
签入它们,就像您自己解决了冲突一样,然后照常继续!
git-rerere
manpage包含了对reerere的正常使用的非常好的、冗长的描述,它从来不涉及实际调用reerere-这一切都是自动完成的。注意,它没有强调:它都是基于冲突块的,所以它可以重用解决方案,即使冲突最终出现在完全不同的地方,只要它仍然是相同的文本冲突。
这篇关于如何在`git merge`后使用`git rebase-i`而不搞砸呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文