如何在`git merge`后使用`git rebase-i`而不搞砸呢? [英] How do I use `git rebase -i` after `git merge` without messing things up?

查看:62
本文介绍了如何在`git merge`后使用`git rebase-i`而不搞砸呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下情况:

  1. 我对本地存储库进行了一些提交,然后将另一个分支(大约150个提交)巨大地合并到主存储库中。其中有很多冲突。

  2. 现在,我要将合并前所做的提交移动到它之后,然后再推送。

正常情况下,我会使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆