我有一个本地分支,我们正在使用带有Pull请求的git-flow,我希望在收到PR反馈后压缩一些提交。
如何将我的所有提交(例如PR)压缩到同一个分支中?
我想它会是这样的:
git checkout master # For master
git pull # Get all branches up-to-date
git checkout feature1 # Checkout the branch
git checkout -b feature1_squash # Make a copy of the branch
git branch -D feature1 # Delete original branch
git checkout master # (?) Branch off latest master for safety
git checkout -b feature1 # Make new (empty) original branch
git merge --squash feature1_squash # Merge with squash into it
git push -f feature1 # Push, force will be required
但我不确定 通过这么多步骤,使用函数将它们绑定在一起并将分支名称作为参数传递似乎也是一个很好的例子。当然,自动化它意味着确保处理错误,异常,边缘情况等。
我不想使用交互式rebase,因为对我训练的新手来说,这是一个小问题。我也不想知道提交的数量,我只想做这个分支上存在的所有提交。
答案 0 :(得分:4)
VonC的回答几乎就在那里。但是知道你想要做出3次提交是很困难的。
相反,您应该使用merge-base
git reset --soft $(git merge-base YOUR_BRANCH WHERE_YOU_BRANCHED_FROM)
git commit
并编辑您的消息(或使用git commit -m代替)
如果您在该分支上,您可以使用HEAD并假设您从master分支您的命令将是(使用origin / master,因为本地master可能已过期)
git reset --soft $(git merge-base HEAD origin/master)
git commit
如果你无法记住你从何处分支,你合并PR的地方可能是正确的
答案 1 :(得分:1)
我认为你所暗示的是非传统的,对于新手而言比使用rebase -i
压制更为棘手。
git rebase -i HEAD~N
有什么困难(N
是要进行压缩的提交次数)?您只需阅读列表,然后根据需要压缩提交。 “Rewriting History”指南有更多细节,我认为它非常适合新用户。
您可以随时为您的学员制作演示分支。简单地为分支做5-6次提交以进行演示,然后让受训者用交互式rebase压缩提交,然后向你做一个PR以证明他们可以在现场分支上处理它。
答案 2 :(得分:0)
用于压缩提交的交互式rebase(尤其是分支上的连续提交)的替代方法是git reset --soft
。
请参阅“Squash my last X commits together using Git”
git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
这是我之前提到过的“Practical uses of git reset --soft
”之一。