如何压制除了最近的n次提交以外的所有提交?

问题描述 投票:0回答:1

我看到你可以做 git rebase -i HEAD~3 来处理最近的3次提交。有什么办法可以简单地压制每一个提交,比如说,最新的3个提交,而不需要手动检查所有的提交,并指定了 squash?

为方便起见,我从一个分支(originalBranch)上创建了一个分支(testBranch)。我做了很多提交,现在我想把这个分支合并到主分支。问题是,我有 originalBranch 的所有提交,我甚至试过通过以下方式重新归类 git rebase -i HEAD~70 (是的,在 originalBranch 中有很多提交),然后将文件编辑成这样。

r 14133a8 first commit message in originalBranch
s 3cb3a90 message2
s ea61cc4 message3
# ... etc
#commits from testBranch. These should remain after rebase
p a62bff7 first commit message in testBranch
p 4364e1f last commit message in testBranch

我以为原分支的所有提交都会被压缩成一条信息 但我这样做的时候会出现文件冲突的情况 如何才能在保留 testBranch 的提交信息的同时,将 originalBranch 的所有提交信息压缩成一条提交信息,而不发生文件冲突?

git commit rebase squash
1个回答
0
投票

嗯......你可以很容易地压制,但你真的需要这样做吗?

git checkout --detach originalBranch
# set branch pointer at the point where originalBranch and master diverged
git reset --soft $( git merge-base HEAD master ) # all changes are ready to be committed
git commit -m "Squashed originalBranch"
# now we replicate your branch on top of it
git cherry-pick originalBranch..testBranch # replicated all changes on top of squashed revision
# now you can consider moving your branch if you like the result
git branch -f testBranch
git checkout testBranch

但你真的需要这样做吗?这并不优雅 根本. 如果你不这样做 依靠 而你只想移动到主分支的顶部。

git rebase --onto master originalBranch testBranch

这样就会把testBranch上的修订版移到主目录下 不在原分行的 在主站之上。


-1
投票

这就是filter-branch的作用。

git replace --graft HEAD~3
git filter-branch --all

是它的精华所在,每一个追溯到 HEAD~3 会得到一个新的历史记录,可以追溯到新的amnesiac替换提交。 请看filter-branch的文档,你可能需要重写标签名之类的。 要退出一个你不喜欢的过滤分支,你可以使用以下方法 git fetch . +refs/original/*:*;来清理一个你确定要保留结果的过滤分支。git filter-branch -f --setup exit.

© www.soinside.com 2019 - 2024. All rights reserved.