如何将我的修改压缩到一个提交中,并选择合并到主分支?

11

假设我需要执行一些平均长度(数天)的重构工作。

我从主分支创建“mybranch”,进行工作,有时从主分支合并到“mybranch”(其他团队成员将继续工作,我可能需要获取他们的更改)。经过一段时间后,我准备将我的更改合并回主分支。

我是否能够压缩仅我的更改(不包括与主分支合并的变更集,因为它们不是我的),并将单个结果提交挑选到主分支中?这是一个可行的情况吗?

2个回答

7

没错,你可以通过一个小的测试仓库来确认。只需要执行以下命令:

git rebase --interactive master mybranch

选择squash,除第一行外所有行都要选择。然后你只需检出master并进行常规快进合并mybranch


哦,这甚至会是一个快进吗?没有挑选的要求吗?“除第一行外的所有行”---在这种情况下,“第一行”是什么?我能压缩除合并以外的所有内容吗(我想我会在工作过程中从主分支进行几次合并)? - zerkms
正确。Rebase总是产生一个可快进的历史记录。本质上,您在合并之前解决所有冲突,而不是之后。 - Karl Bielefeldt
“--interactive”选项会在您的编辑器中弹出一个列表。只需将其放在顶部的提交留为“pick”。合并提交可能甚至不会显示出来,但即使它们显示出来也没有问题,因为您最终还是要将其合并回“master”分支。 - Karl Bielefeldt
另外,不要忘记使用 git config --global rerere.enabled 1 启用 rerere。这将有助于避免您不得不两次解决任何合并冲突的情况。 - Karl Bielefeldt
“这不是问题,因为你最终还是会将其合并回主分支。”——是的,这不是问题,但我只是不想有更多的“干净”差异。无论如何,给我一天时间来尝试一下;-) - zerkms

4

在变基之后,“mybranch”中之前的这些提交记录将不再有任何引用。

更为安全的做法是:

git checkout mybranch

创建一个分支(实际上是为了重新定位目的而创建的临时分支)
git checkout -b movingToMaster

尝试将 movingTomaster 变基到 master
git rebase -i master

一个编辑器会弹出,询问您应该选择哪个提交进行挑选、合并或编辑...

编辑该文件,在您的情况下,第一行应保持不变,而其他行应将“pick”更改为“squash”,如果需要,您可以修改提交消息。在对该文件进行足够的更改后保存它。

例如:

pick 0a81405 Bug Fix 1
pick 91be655 Bug Fix 2
pick 1200fc7 Bug Fix 3
pick 1211fb7 Bug Fix 4
pick ba77fdf Bug Fix 5

更改为

pick 0a81405 Bug Fix 1
squash 91be655 Bug Fix 2
squash 1200fc7 Bug Fix 3
squash 1211fb7 Bug Fix 4
squash ba77fdf Bug Fix 5

保存它。然后。
git checkout master

使用快速合并将您的master分支移动到movingTomaster分支

git merge movingTomaster

注意:这只是一个快进合并,不会对你的历史记录造成任何影响。
如果您想的话,可以删除您的movingTomaster分支。
git branch -D movingTomaster

好的,明白了。谢谢。但是无法理解这句话:“将您的主分支移动到movingTomaster分支”。 - zerkms
@zerkms: 在那个时候,你的主分支仍然没有那个“单一”的提交。你的movingTomaster分支现在应该比主分支多一个提交。(你可以通过gitk命令进行可视化) 你需要将你的主分支移动到与movingTomaster相同的提交点。 - TheOneTeam
这个“移动”怎么执行?难道不只是一个合并(在这种情况下快进)吗? - zerkms
@zerkms:是的,git merge movingTomaster,这只是一个快进合并,所以它不会影响您的提交历史记录。 - TheOneTeam

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