在开始和结束SHA时,如何将一系列git提交压缩在一起

时间:2015-11-24 18:52:20

标签: git squash

我有一个大约有20个提交的分支。

分支上的第一个SHA是bc3c488...
分支上的最后一个SHA是2c2be6...

如何将所有提交合并在一起?

我想在没有使用交互式rebase的情况下这样做,因为有很多提交。

我需要这个github Pull Request,我被要求合并我的提交。

需要这样做而不进行git merge --squash因为我需要在本地压缩而另一个开发人员进行合并并希望我在合并之前先进行压缩。

4 个答案:

答案 0 :(得分:3)

如果拳头SHA是HEAD,您也可以使用以下方法:

git reset --soft $OLD_SHA; git add -A; git commit --amend --no-edit

请注意,此命令将更改存储库的历史记录。

如果您要压缩历史记录中的提交:

|---* --- 0 --- 1 ---- 2 --- 3 --- * --- * --- * --- HEAD

就像在这种情况下一样,提交1、2和3

我真的建议使用rebase -i

答案 1 :(得分:0)

互动式变基在这里可以提供帮助。

让我们说你的分支机构是基于你上游的主分支机构。 (并且让我们说你的上游由"上游"远程定义)

这样做:

git rebase -i upstream/master

"上游/主"如果您需要更精确,可以用任何SHA替换。

    git rebase -i bc3c488

您将被置于由$ EDITOR环境变量定义的编辑器中。改变"选择"到"壁球" (或者说" s"简称)除了最顶层之外的每一行。这是将所有这些提交压缩成一个。

与针对其他工作线的任何合并或重组相比,存在代码冲突的可能性。如果发生这种情况,请执行" git status"要查看哪些文件存在冲突,请编辑这些文件(冲突将使用<<<<>>>>符号)分隔并执行" git rebase --continue"

Rebasing一次重播一次提交,如果你发现自己一遍又一遍地修复相同的冲突,请记住这一点(还有一些工具可以帮助解决这个问题)。

然后,您将有机会为新的压缩提交编辑提交消息。

使用-f推送到远程分支(这会重写您想要的历史记录,但要小心这个。)

这是一个非常好的交互式变基教程:https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase-i

答案 2 :(得分:0)

你可以使用git rebase中的交互式shell来有选择地选择要重组的提交。

git rebase -i bc3c488...

然后更改您要压缩的提交以说壁球而不是选择

结帐https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/

答案 3 :(得分:0)

分支上的第一个SHA是bc3c488 ...
分支上的最后一个SHA是2c2be6 ...

# non dangerous implementation that creates a new branch.
git checkout 2c2be6
git rebase -i bc3c488~
git checkout -b your_new_squashed_branch
# then squash the commits by replacing the pick with s

提交末尾的tilda(〜)表示先前的提交;
确保提交bc3c488在交互式资源库中可见。

# dangerous implementation that rewrites history
git checkout -b new_branch_with_rewritten_history
git reset --hard 2c2be6
git rebase -i bc3c488~
# then squash the commits by replacing the pick with s