在与主服务器合并之前,是否可以将分支上的提交压缩为单个提交?我认为这是一个相当普遍的情况,但也许我没有使用正确的搜索条件。
我将更详细地解释这个场景。通常,我希望在分支机构进行更改时进行许多本地提交,以确保我拥有全面的更改历史记录。但是一旦通过分支中的更改,当我合并到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,我是新手。如果我在使用条款时犯了错误,我会道歉。
答案 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