在编写新代码时,我会进行许多小的提交来跟踪我的更改。但是,我的公司更喜欢将每个功能作为单个提交提交。所以解决方案是将我的整个(本地)分支压缩为单个提交。
如何在不使用 git rebase --interactive
然后将所有提交的 pick
更改为 squash
的情况下压缩整个分支?
最佳答案
我的首选方法是双线(不包括下面的步骤 1 和 4)。好处是您不需要知道/记录任何提交 ID,您可以编写一个简单的别名来执行所有涉及的步骤,并且您实际上将整个分支移动到 origin/master 以便实际 merge 到 master 可以快进,不会有任何冲突。
首先,我的假设:
- 您正在处理名为
my-feature-branch
的分支。这个分支已经从master
中分离了几次提交;这是 checkout 的分支。 - 你的本地
master
跟踪远程分支origin/master
- 您想将所有来自
my-feature-branch
的提交压缩到 origin/master 的当前状态之上的单个提交(不是您的本地master
,可能已过时) - 您的所有更改都已提交,您没有未暂存的更改(它们将在
git reset --hard
期间丢失)
我的流程如下:
获取,所以
origin/master
是当前的:$ git fetch
通过将本地分支重置为指向
来丢弃本地分支上的所有提交origin/master
$ git reset --mixed origin/master
将分支先前状态的所有旧更改 merge 到索引中
$ git merge --squash HEAD@{1}
提交您的更改 - Git 将在您的编辑器中预先填充一条提交消息,其中包含压缩提交中的所有提交消息
我提到的简单别名是:
alias squash="git fetch; git reset --mixed origin/master; git merge --squash HEAD@{1}"
关于Git - 压缩整个分支 - 一行压缩命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27693286/