我读过一些关于
--squash
ing 提交的内容,但它们似乎都与 --rebase
齐头并进。
我有一个功能分支,其中有一组这样的提交:
(Feature) A --> B --> C --> D --> E --> F --> G
/
(Master) M1 --> M2 --> M3
假设我想合并回
Master
分支,但我想先清理我的功能上的提交。
是否可以:
或
无论哪种方式,我可以直接在我的功能上做一个壁球,而不用它立即初始化
Merge
或 Rebase
吗?
如果是这样,我怎样才能用 Git 做到这一点?
在我团队的工作流程中,我们经常在一堆提交的中间与上游合并,而变基可能会变得很丑陋。我发现这有助于将 master 之前的所有提交压缩为一个:
# Commit any working changes on branch "mybranchname", then...
git checkout master
git checkout -b mybranchname_temp
git merge --squash mybranchname
git commit -am "Message describing all squashed commits"
git branch -m mybranchname mybranchname_unsquashed
git branch -m mybranchname
# Optional cleanup:
git branch -D mybranchname_unsquashed
# If squashing already-pushed commits...
git push -f
是和否。
是的,您可以避免更改提交“A”的父项,但我相信您无法避免
git rebase
。您可以在同一个根上进行交互式变基:
git rebase -i M2 Feature
然后你可以做任何你想做的事,在结束分支
Feature
仍然会从提交M2开始。
如果提交是本地的并且尚未推送,则此方法有效:
git reset --soft HEAD~x
git commit -m "whatever"
其中 x 是您要压缩的提交数
不确定如果您要压缩的提交也在远程上,这将如何工作 - 如果是这种情况,您“可能”需要:
git push -f
运行上述命令后。
git push -f
的常见警告适用 - 如果需要强制推送,请确保先使用 git log 进行完整性检查!
解决方案:无需变基即可将多个提交压缩为一个提交。最好的选择是从 master 创建一个新的临时分支,然后将仅在一次提交中压缩的混乱分支合并到临时分支中,然后在您的工作分支中指向它,然后删除临时分支。
让我们假设:
master
是你的主分支,feature
是你凌乱的工作分支temp
是您的临时分行怎么做?
git checkout -b <temp> <master>
git merge --squash <feature>
git commit -m "your single message"
git checkout <feature>
git reset --hard <temp>
git push -f
git branch -D <temp>
之前:
(Feature) A --> B --> C --> D --> E --> F --> G
/
(Master) M1 --> M2 --> M3
之后:
AG -->
/
(Master) M1 --> M2 --> M3
几乎所有你提到的东西看起来都是可行的,除了压缩被其他人分开的提交(在你的例子中是 B E 和 F)。
我看到它可以这样做:
找出 Feature branch base commit (M2) 的 hash
git merge-base Feature Master
然后在这个散列上rebase Feature分支(实际上是在同一个base上rebase)
git rebase -i <hash you got on previous step>
现在您可以编辑将要变基的提交列表。
对于您的示例(挤压 A、B 和 C),它可能是这样的:
pick <A hash> <A commit description>
squash <B hash> <B commit description>
squash <C hash> <C commit description>
pick <D hash> <D commit description>
pick <E hash> <E commit description>
pick <F hash> <F commit description>
pick <G hash> <G commit description>