是否有任何Git命令将所有丑陋的提交合并为一个?

时间:2011-09-07 10:20:15

标签: git

当我在本地编写代码时,有时我会提交不干净的代码,或者使用丑陋的消息作为临时修订。

然而,当我希望我的代码与其他代码合并时,我想要另一个可以看到的唯一最终快照,(隐藏看起来难看的修订版)

实施例。 我将0分叉到我的本地存储库,我进行更改并测试并使用不干净的代码提交

0-> 1-> 2-> 3-> 4-> 5-> 6(最终代码)

当其他人拉代码时,是否有可能让其他人看到最终状态?而不是从1..5

看到树

我希望用户看到

0 -------------------→6

我能想到的一种方法是制作一个补丁文件,但如果有一些文件需要删除或创建,那就不够了。

5 个答案:

答案 0 :(得分:5)

您可以使用reset --soft将多个提交压缩为一个新的干净提交。如果您的分支机构在最终代码中没有分阶段更改,您可以执行以下操作:

git reset --soft <sha1-of-0>
git commit

git commit提示时,提供一个明确的提交消息,描述正在引入的完整更改。

答案 1 :(得分:3)

最灵活的方法是执行交互式rebase来压缩或修改提交。但是,您需要注意不要重写任何已公开的历史记录。例如,如果您正在使用master分支,并且想要重写和线性化所有不在origin/master中的提交(这通常意味着您尚未推送的工作)你可以这样做:

git rebase -i origin/master

这将启动一个文本编辑器,其中显示了您从原始/主站的每个提交,从最旧到最新。如果您想要将任何提交与前一个提交相结合,您只需将该行的开头从pick更改为squash即可。或者,如果您想以某种方式修改该提交,可以将pick更改为edit

使用交互式rebase是做你要求的最灵活的方式,它是一个非常有用的工具来了解,但在你描述的确切情况下,它可能是过度的。首先,检查git status的输出是否干净,以确保您的暂存区域与HEAD表示相同的状态。然后,您可以将“软重置”返回到0,这会将HEAD重置为该提交,但会使您的工作树和索引(即暂存区域)保持不变。如果您随后进行提交,则您的索引将用于创建与6具有相同状态的新提交,但使用0作为父提交。即。

 git status # Check that your status is clean
 git reset --soft 0
 git commit -m 'Work that is totally flawless'

答案 2 :(得分:2)

是的,使用git rebase -i,然后压缩提交。请查看this以获取更多信息和一些示例。

答案 3 :(得分:2)

假设您还没有将提交推送到遥控器,那么有几种方法可以做到这一点。

一种选择是使用

git rebase -i 

为您提供交互式rebase编辑器。然后,您可以将除最后一个提交之外的所有提交标记为'squash'

答案 4 :(得分:0)

Git南瓜合并是为此目的而设计的。这样做的方法是创建一个分支,进行所有更改,然后使用壁合并合并回去。

How to use git merge --squash?

但是,通常不建议这样做,因为这样会丢失历史记录。