在本地进行变基后更新git拉取请求

6
最近,我遇到了这样一种情况,当我从本地的上游重建时,我的错误修复的拉取请求出了问题,然后试图将其推送到github上的本地PR。
我想知道我是否正确操作或者我的工作流需要改变。
基本上,我按照以下工作流程操作:
1. 在github上fork代码库 2. 将代码库克隆到本地。设置自动产生的原点和上游来源。 3. 创建"fix"分支。 4. 编辑文件。 5. "git push -u origin fix" ,并在此分支上提交拉取请求。 6. 同时,我发现我修改的某个文件在主代码库中已经更新。所以我用"git fetch upstream; git merge upstream/master"来更新。 7. 我更新了我的origin/master:"git push"。 8. 然后我在本地对我的"fix"分支进行了"git rebase master",手动合并了它们,因为有一个冲突;最后使用"git add ; git rebase --continue"。 9. 然后我尝试了"git push",事情就出错了。似乎没有一种好的方式可以将这个重建的"fix"分支放入我的PR中。
所以我想知道我是否漏掉了什么步骤,或者是否需要更改步骤。我不确定"git push origin"是否正确,或者它是否需要更具体的指定(例如使用分支名称)。在最后一步中是否应该/可以尝试"git push --force"(PR的一部分在我的github仓库中,但很可能没有在其他地方拉取)?
2个回答

14

不要在拉取请求中引入合并。适当的工作流程如下:

  • 复刻
  • 克隆
  • 分支
  • [极端编码工作]
  • [提交]
  • 变基(到上游/主分支),例如使用git pull --rebase upstream master
  • 推送
  • 创建一个拉取请求。

这样,您就可以避免合并提交,并以当前上游仓库的master为基础使您的拉取请求具有干净的提交记录。

如果在变基之前已经推送了,由于在变基过程中更改了历史记录,因此您必须使用-f执行强制推送以在变基后再次推送。

值得注意的一点是:简单修复/功能分支中不应发生合并(不是快进式合并或变基)- 就像您不应该在其他人可能基于自己的工作的“主”分支上重写历史记录一样。


一个旁边的问题:您是说我永远不应该在本地存储库上运行 git fetch upstream; git merge upstream/master 吗?因为可能会出现合并提交,所以应该使用变基?通常情况下,我的主分支只跟随上游(然后推送到源),在那里不会发生任何其他事情,所以我想实际上合并和变基效果相同? - user707650
1
如果您在master分支上运行此命令,它将始终快进 - 因为您肯定不会在分叉中提交任何内容,对吧?无论如何,出于简洁起见,我没有包含这个。在实际开发过程中,我偶尔会执行以下操作:git checkout master; git pull --ff-only upstream master; git push - 拉取操作结合了获取和合并。 - ThiefMaster
当您需要根据PR中的评论进行进一步更改时,该怎么办?您是否只接受任何进一步更改无法重新基于原始提交并仅提交和推送它们以更新PR的事实? - Chris B
1
你强制推送到PR分支。 - ThiefMaster
1
@ChrisB,现在你可以在合并之前squash PR提交。如果需要保留多个(干净整洁的)提交记录,则可以像ThiefMaster指出的那样对它们进行修改和强制推送。我认为在开放式PR范围内重写历史是可以的。是的,它会清除提交记录并在某种程度上破坏讨论,但我更喜欢Git日志的干净而不是GitHub讨论的完整性/可读性。 - Alex
我发现“Merge pull request” Considered Harmful这篇文章与 GitHub 的 UI 和工作流相关,它促使不那么挑剔的用户产生所有那些讨厌的合并提交。因为只需一个按钮点击就可以“更新”,所以非常容易。 - Alex

2

在最后一步中,我应该尝试使用git push --force吗?(PR的一部分在我的github存储库中,但很可能没有其他地方拉取)

是的。如果您的本地分支不是远程分支的后代,则需要强制推送分支,而在您重新定义之后它并不是。

您应该意识到强制推送的后果,因为其他开发人员可能已经覆盖了更改,我不建议这样做:最好使用简单的pull来引入上游更改。


我确实想避免使用 push -f。但是在专为(小型)PR 创建的分支上使用它有多糟糕呢?因为我预计大多数人会使用普通分支而不是从别人的 PR 中开始工作。尽管我可以想象一个大的 PR 可能会在某些时候被其他人接手。 - user707650
@Evert 如果只有一个开发人员的简单临时分支,这可能是可行的,但不要让它成为你经常做的事情。 - TimWolla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接