前几天我发生了一件我无法解释的非常奇怪的事情,这几乎肯定会导致我对 git 和 GitHub 的理解存在缺陷。
我正在使用 GitHub flow 在 GitHub 上开展一个项目模型。有两个功能分支正在积极工作——我们称它们为 A 和 B。两者都愉快地进行了自己的提交,直到分支 A 上的一个提交如下:
Merge remote-tracking branch 'origin/b into b'
自从那次提交后,分支 A 的 pull 请求显示了 A 和 B 的提交。我没有注意到,当将 A 的 pull 请求 merge 到 master 时,它同时关闭了 B 的 pull 请求在 GitHub 中。关闭后回顾 B 的 pull 请求,看起来它“丢失”了除两个之外的所有提交。
这是怎么发生的?哪些 git 命令可以以这种方式链接分支(和 PR)?我希望能够从一个干净的存储库开始重现这一点,作为团队的学习示例。
最佳答案
B 的提交如何进入 A?
这听起来像是您将分支 B 的更改 pull 或 merge 到分支 A,然后将分支 A(现在包含来自 A 和 B 的提交)推送到 GitHub。这是一个最小的可行示例:
git clone <your repo clone url>; cd <reponame>
git commit --allow-empty -m "first commit guarantees shared history"
git checkout -b B
touch bar; git add bar; git commit -m "commit on branch B"
git push origin B
git checkout master
git checkout -b A
touch foo; git add foo; git commit -m "Commit on branch A"
git push origin A
# Create PR from A into master using GitHub UI
git status
On branch A
nothing to commit, working directory clean
git merge B
# your editor opens and you make a commit
git push origin A
现在,当您输入 git merge B
时,分支 B 上的所有提交被 merge 到分支 A。当您将它们推送到分支 A 时,它们将出现在从 A 到 master 的 pull 请求中,因为 GitHub 假定对分支的后续提交是为了解决关于公关。
为什么从 B 到 master 的 PR 关闭了?
虽然您可能习惯于通过 UI 中的按钮 merge PR,但在命令行上执行 merge 的效果完全相同。 GitHub 决定是否手动 merge PR 的方式是将 PR 中的提交 ID 与创建 PR 所针对的分支(在本例中为 master)中的提交 ID 进行比较。由于来自分支 B 的所有提交都作为来自分支 A 的 PR 的一部分 merge 到 master 中,它在 GitHub 上看起来完全一样,就好像分支 B 已经被手动 merge 一样,所以 PR 被标记为“merge ”并且不再显示为“打开”。
哪些 git 命令可以“链接”分支/PR?
-
git merge otherbranch; git push remotename PRbranch
-
git pull remotename branchname; git push remotename PRbranch
-
git cherry-pick <commit range>; git push remotename PRbranch
如果你从其他 PR 中挑选所有提交 -
git apply <patchfile>; git push remotename PRbranch
如果出于某种原因,另一个 PR 的全部内容已作为补丁通过电子邮件发送给您
基本上,任何将来自另一个分支的提交带入您的历史记录的命令都有可能导致您看到的行为。
关于git - git中怎么两个分支变成 "linked"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31497652/