前几天我发生了一件非常奇怪的事情,我无法解释,这几乎肯定会导致我对git和GitHub的理解不足。
我正在使用GitHub flow模型在GitHub上开展项目。有两个功能分支正在积极处理 - 我们将它们称为A和B.两者都很乐意进行自己的提交,直到在分支A上提交一个读取:
将远程跟踪分支' origin / b合并到b'
自从提交以来,分支A的pull请求显示了A和B的提交。我没有注意到这一点,并且当将A的pull请求合并到master中时,它同时关闭了pull请求对于GitHub中的B.回顾B关闭后的拉动请求,它看起来像是"丢失"所有提交除了两个。
这是怎么发生的?什么git命令可以用这种方式链接分支(和PR)?我希望能够以一个干净的存储库作为团队的学习示例来重新启动它。
答案 0 :(得分:0)
B的提交是如何进入A的?
听起来你将分支B的变化拉到或合并到分支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上的所有提交都是合并到分支A中。当您将它们推送到分支A时,它们将显示在分支中请求从A到master,因为GitHub假定后续提交分支机构是为了解决PR的审核反馈。
为什么从B到主人的PR被关闭?
虽然您可能习惯于从UI中的按钮合并PR,但在命令行上执行合并会完全相同。 GitHub决定PR是否被手动合并的方式是将PR中提交的ID与您创建PR的分支中的提交ID(在本例中为master)进行比较。由于来自分支B的所有提交都作为PR的一部分从分支A合并到master中,它看起来与GitHub完全相同,就像分支B已经手动合并一样,因此PR被标记为“合并”而不再显示为“开放”。
什么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
如果出于某种原因,其他公关的全部内容已通过电子邮件发送给您作为补丁基本上,任何将来自另一个分支的提交带入您的历史记录的命令都有可能导致您看到的行为。