【发布时间】:2014-05-27 15:49:51
【问题描述】:
我想使用git rebase 进行一系列提交并将它们应用于不同的根提交。例如,
git rebase --onto root start finish
根据root 获取从start 到finish 的提交。
当 git 无法干净地应用提交时,它会更新文件以显示这样的冲突(来自 git 手册的示例):
Here are lines that are either unchanged from the common
ancestor, or cleanly resolved because only one side changed.
<<<<<<< yours:sample.txt
Conflict resolution is hard;
let's go shopping.
=======
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.
程序员将文件编辑为新分支中应有的内容,然后运行git --rebase continue 以继续从源添加提交。
但是,当root 和start 之间的文件有很多更改时,可能会有很多这样的行并且它们可能难以解释。在这种情况下,人们可能更喜欢将“失败的大块”输出到文件中,以便可以阅读原始提交中的更改(手动对正在更改的文件进行必要的更改,然后运行 git rebase --continue 到继续添加提交)。
git apply 的 --reject 选项执行此操作:
--reject
For atomicity, git apply by default fails the whole patch and does
not touch the working tree when some of the hunks do not apply.
This option makes it apply the parts of the patch that are
applicable, and leave the rejected hunks in corresponding *.rej
files.
这也是patch 程序的行为——所以我可以通过首先使用git show 输出提交,然后使用patch 应用它来获得我想要的。但是,当涉及到许多提交时,这并不方便。
有没有办法使用git rebase(或其他 git 命令)来做到这一点?
【问题讨论】:
-
您是否考虑过使用视觉差异/合并工具来帮助您解释冲突标记?我使用 Beyond Compare,我发现它为我节省了很多时间来修复合并冲突。
-
我不知道它们是什么。它们是否允许您指定大块适用于文件中的哪个位置? (我已经重新组织了文件并且 git 或 patch 不知道将这些大块应用到哪里,这就是为什么我想手动完成所有操作。)
-
您使用的是什么操作系统,Windows、OS X 还是 Linux?
-
Beyond Compare 有一个 Linux 版本,您可以尝试一下。 Linux 可能还有其他差异/合并工具。
vimdiff是您的 Linux 发行版可能附带的另一个工具,但在我看来,它不如 Beyond Compare 之类的工具好。阅读功能或查看屏幕截图,看看它是否能帮助您更轻松地解决合并冲突。 -
我对批量拒绝这样的拒绝持谨慎态度,因为您对早期拒绝的解决可能很容易影响以后出现的冲突。一旦你的工具为你工作,交互式 rebase 就会变得非常快。 Git 只是盒子里的一个工具,你的编辑器是另一个。