Flatten在树枝上提交

时间:2012-07-30 15:33:28

标签: git

在与主服务器合并之前,是否可以将分支上的提交压缩为单个提交?我认为这是一个相当普遍的情况,但也许我没有使用正确的搜索条件。

我将更详细地解释这个场景。通常,我希望在分支机构进行更改时进行许多本地提交,以确保我拥有全面的更改历史记录。但是一旦通过分支中的更改,当我合并到main时,我想将分支上的提交减少为单个,然后将其合并到main。我确实理解Git中的提交很便宜,但在某些情况下,我可能更喜欢这样做。

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit 2 on branch
| * commit 1 on branch
|/
*   branch from main

看起来像

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit on branch (branch commits flattened to one)
|/
*   branch from main

对于git,我是新手。如果我在使用条款时犯了错误,我会道歉。

4 个答案:

答案 0 :(得分:22)

我建议学习使用交互式rebase,但如果它对你来说太复杂了,你可以简单地使用

git reset --soft <diverging-commit>

在不改变索引的情况下撤消所有提交到分歧点的提交,

git commit -s

对所有更改进行一次提交。

答案 1 :(得分:14)

使用互动式变基。找到你的分支与master分歧的提交(可以使用git merge-base;让我们调用commit <diverge>),然后

git rebase -i <diverge>

将弹出一个编辑器,允许您以交互方式重写历史记录。你想要压缩提交。

答案 2 :(得分:10)

您还可以使用git merge --squash <branch>合并分支而不执行任何提交:

$ git checkout master
$ git merge --squash mybranch
...
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git commit

当然,如果你能提供帮助,你应该抵制这样做的冲动。有关原因的讨论,请参阅Thou Shalt Not Lie: git rebase, amend, squash, and other lies

答案 3 :(得分:2)

看看git rebase-i选项使您有机会编辑,压缩(您想要的),甚至删除提交。

例如,我使用它的方式通常是:

git rebase -i origin/master
....
git push