当我在本地编写代码时,有时我会提交不干净的代码,或者使用丑陋的消息作为临时修订。
然而,当我希望我的代码与其他代码合并时,我想要另一个可以看到的唯一最终快照,(隐藏看起来难看的修订版)
实施例。 我将0分叉到我的本地存储库,我进行更改并测试并使用不干净的代码提交
0-> 1-> 2-> 3-> 4-> 5-> 6(最终代码)
当其他人拉代码时,是否有可能让其他人看到最终状态?而不是从1..5
看到树我希望用户看到
0 -------------------→6
我能想到的一种方法是制作一个补丁文件,但如果有一些文件需要删除或创建,那就不够了。
答案 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?
但是,通常不建议这样做,因为这样会丢失历史记录。