如何使用TortoiseGit进行rebase(合并squash)

55

不知道如何对当前分支执行合并压缩重写操作。控制台命令如下:

git rebase -i HEAD~2

然后像通常一样进行压缩。但是在TGit中如何做到这一点?

初始化该案例的脚本。

git init .
touch 1
git add 1
git commit -m "1"
touch 2
git add 2
git commit -m "2"
touch 3
git add 3
git commit -m "3"

压缩后,我们将只有1个提交包含3个文件。

有什么提议吗?


Tortoisegit 1.7.0.0 的更新日志中有这样一行:修复问题 #784 :交错窗口应该允许更容易选择挑选/压扁/编辑/跳过(按键:空格: 改变状态,s: 跳过,e: 编辑,p: 挑选,q: 压扁)。 - willoller
@willoller:我相信这只是关于向已有的按钮添加快捷方式。 - zerkms
6个回答

68

我使用 TortoiseGit 1.7.12,按照以下步骤进行交互式变基:

  1. 右键单击要进行交互式变基的工作目录,从上下文菜单中选择 TortoiseGit -> Show log
  2. 在弹出的“日志消息”对话框中,右键单击不想变基的最近提交,并从上下文菜单中选择 Rebase master onto this...
  3. 在弹出的“变基”对话框中,选中 Force Rebase 复选框,然后右键单击提交以选择 PickSquash 等,或在您的情况下选中 Squash ALL 复选框。
  4. 按下 Start Rebase 按钮,成功后按钮会变成 Commit,然后变成 Done。全部按下它们。

请注意,在您的示例脚本中,您将压缩 / 修复到根提交,这是一个特殊情况,不像上面描述的那样工作,因为根提交没有父提交可供您在步骤2中选择。


3
警告(TortoiseGit 1.6.5.0):我尝试在一个分支上使用这种方法,将其变基到分支起始提交(即分支第一个提交之前的那个提交),结果是分支 HEAD 指向了分支起始点,分支上的所有提交及其修改都丢失了!请注意。 - mistaecko
那么神秘的--root呢? - ATL_DEV
我并不经常使用TortoiseGit,但我的猜测是TortoiseGit目前还不支持它。然而,我认为在TortoiseGit中实现一些“智能”逻辑来自动使用“--root”选项是可能的,如果你已经选择在GUI中重新设置根提交。 - sschuberth
在我的情况下,这产生了一些“冲突”。为了解决这个问题,我只需选择它们全部并按“使用主分支解决”(而不是远程内容)。最终结果如预期的那样:就好像我在一个提交中进行了所有更改,直接跟随我正在重新定位到的提交。唯一的烦恼是合并提交日期设置为合并提交的最早日期(有一个框可以更改,但我没有费心去做)。 - Venryx
哦,还有,对于像我这样的Git初学者,需要注意:变基(Rebasing)并不能(可靠地)完成“以我正在变基到的提交为基础,将我的工作树合并成一个提交”的任务,而是“采取我的更改序列,并在变基到的提交链中的更改之后应用它们——然后选择标记我的更改以覆盖任何冲突”。对于大多数情况(也可能适用于您),我想要前者而不是后者——因此通常应该使用软重置+提交方法,而不是变基。 - Venryx
显示剩余2条评论

65
您可以使用GUI将两个相邻的提交合并,如下所示。请记住不要合并已经在共享存储库中的提交。 参见: 右键单击 2 个提交

10
将两个(相邻的)提交合并起来是变基/压缩的一个非常特殊的情况。如果需要更通用的解决方案(例如将不相邻的提交压缩),请参阅我的答案。 - sschuberth
4
我使用的是 TortoiseGit 1.8.7 版本,很久以前我曾经看到过这个菜单选项,但现在无论我选择哪个提交版本,都不会出现“合并为一个提交”的选项。其他所有选项都有显示。可能这个选项已被删除,或者我的所有提交存在某些问题,导致无法进行合并(如果是这种情况,我希望他们能够显示并禁用该选项)。 - PandaWood
2
@PandaWood 提交记录需要在图表的“尾部”,没有任何合并等操作,就像图片中一样。 - regisbsb
3
@sschuberth,我认为你可以选择两个以上。 - regisbsb
1
@regisbsb 是正确的。这可以合并任意数量的提交。 - Richard Tingle
如果提交记录中不包含最新的提交,则似乎无法使用此选项。 - robross0606

6
以下是使用Tortoise Git并将仓库存储在Assembla上(一项与GitLab、BitBucket等竞争的服务)所做的内容。
我决定有效地删除整个提交历史,并从头开始重建仓库。我本可以删除本地git文件夹和相应的Assembla仓库,然后重新创建它,但认为最好弄清楚如何以“正确的方式”完成此操作。
这就是我实现它的方法:
1. 使用Tortoise Git,显示仓库的日志。 高亮显示所有提交,右键单击它们,然后选择“合并为一个提交”。
2. 在弹出的对话框中,删除提交注释(它成为所有先前注释的组合),并替换为单个注释,例如REBASE。 然后启动提交。 本地仓库将有效地从头开始(当然,所有文件仍添加到其中),而无需删除和重新创建它。
3. 不幸的是,您不能只将其推送到Assembla。 它会拒绝此操作,并坚持认为您的“head”落后于远程分支。 因此,要解决这个问题,首先进入Assembla仓库的“设置”页面。 启用“允许-强制推送”。
4. 现在执行“强制推送”。 我不知道Tortoise Git是否具有此选项的GUI选项,但是可以通过命令提示符轻松完成:
cd [您的仓库文件夹] git push -f origin
完成!
更新:
要使用TortoiseGit进行“强制推送”,在推送对话框中有复选框可用于强制“已知更改”和“未知更改”。 我不确定它们之间的区别,但它们都会使用git --force开关。 从“已知更改”开始尝试。

3
  • 进入“显示日志”界面,然后在当前提交处打一个标签(例如“tmp”)。
  • 回滚到你不想更改的历史上第一个提交处。
  • 如果没有看到所有提交,请在日志底部切换到“所有分支”。
  • 然后选择所有更新的提交并右键单击它们:选择“选定提交进行挑选...”
  • 现在你已经进入交互式变基模式。在那里你可以做常见的交互式变基操作。

3
你可以在变基窗口完成这个操作。这个视频讲解得很好:https://youtu.be/qrMubRPkkrE?t=490 如视频所示:
1. 右键点击 TortoiseGit/Rebase... 2. 将Upstream:改为FETCH_HEAD 3. 将Pick ALL改为Squash ALL 4. 单击 Start Rebase

0
一种方法是:进入日志对话框,选择“rebase onto *”,然后勾选“Force”复选框,并标记要“squash”的提交(例如通过键入“q”)。

这是正确的答案。对我有用。 - zumalifeguard

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