11

我有一个本地分支,我们正在使用带有拉取请求的 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,因为对于我训练的新手来说,这有点棘手。我也不想知道提交的数量,我只想完成这个分支上存在的所有提交。

4

3 回答 3

6

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 合并回的位置可能是正确的

于 2015-12-09T20:33:36.907 回答
1

我认为你的建议是非常规的,对新手来说比用rebase -i壁球更棘手。

有什么困难git rebase -i HEAD~NN作为要返回到压缩的提交数量)?您只需阅读列表,并根据需要压缩提交。“重写历史”指南更详细,我认为它非常适合新用户。

你总是可以为你的学员制作一个演示分支来练习。只需为演示目的向分支提交 5-6 次提交,并让受训人员使用交互式 rebase 压缩提交,然后向您提交 PR 以证明他们可以在实时分支上处理它。

于 2015-12-04T13:48:18.130 回答
0

用于压缩提交(尤其是分支上的连续提交)的交互式 rebase 的替代方案是git reset --soft.
请参阅“使用 Git 将我最后的 X 提交压缩在一起

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

这是我之前提到的“实际用途”之一。git reset --soft

于 2015-12-07T13:44:16.033 回答