Git:在主分支上压缩提交的最简单方法

60

可能重复:
如何使用git将我的最后X个提交合并在一起?

我有一个托管在GitHub上的项目,并且我有一个本地副本。我有很多小的提交,这些提交已经推送到GitHub。所有这些都是使用默认的*主分支完成的。

我在merge --squash和rebase等之间感到困惑...... 将几个历史提交合并为一个提交的最简单方法是什么,以便将其推送到GitHub?

1个回答

126

开始前,确保git status的状态是干净的(即该命令没有任何输出),以避免丢失工作。最简单的方法可能是:

git reset --soft <LAST-COMMIT-THAT'S-OK>
git commit -m 'Many squashed commits'
git push --force origin master

请谨记,这是重写历史记录(这就是为什么需要使用--force选项向git push),因此,如果其他人可能已经从您的存储库中克隆或拉取了内容,则应避免使用。有关更多替代方案,请参见此问题及其答案:


2
如果其他分支经常从仓库拉取(仅快进),这样做会产生什么后果? - Gabe
1
@whoami:如果其他人拉取该分支,他们将看到“(强制更新)”并且git将拒绝更新他们的分支。然后他们需要(a)确保所有工作都已提交(b)通常使用rebase(例如git rebase origin/master)或将其分支重置为刚刚被强制更新的远程跟踪分支版本(例如git reset --hard origin/master)。除非您乐意向人们解释要做什么,否则最好不要强制推送重写的历史记录。 - Mark Longair
1
@whoami:是的,最好将历史重写限制在尚未推送的提交中。如果您确切地知道要压缩所有最后的N个提交,则使用“reset --soft”和提交可能更容易,但是如果您想有选择地压缩和重新排序提交,则使用“git rebase -i”将为您提供这种灵活性。(还取决于您更熟悉哪些命令...) - Mark Longair
@Gabe 每当我强制推送一个分支时,我会让所有在该分支上工作的人知道。然后他们可以运行 git branch -D branchname && git checkout branchname && git pull 命令,这将删除他们本地的分支副本并检出一个新的副本。我们禁止向 master 分支推送任何更改,并在功能分支上完成所有工作。因此,只有在同一功能分支上工作的人会受到影响。 - styfle
@MarkLongair 你能在选择提交时添加关于 HEAD~5 语法的注释吗? - styfle
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接