Preferred Github workflow for updating a pull request after code review
我已经在Github上提交了对开源项目的更改,并收到了其中一个核心团队成员的代码审查意见。
我想考虑审核评论更新代码,然后重新提交。这样做的最佳工作流程是什么?根据我对git / github的有限知识,我可以做以下任何一项:
将代码更新为新提交,并将初始和更新的提交添加到我的pull请求中。
不知怎的(??)从我的存储库回滚旧的提交,并创建一个包含所有内容的新提交,然后为此提出拉取请求?
别的什么?
看起来选项2/3会很好,因为开源项目在他们的历史中只有一个提交将实现一切,但我不知道如何做到这一点。
注意:我不知道这是否会影响答案,但我没有在单独的分支中进行更改,我只是在master之上做了一次提交
更新拉取请求
要更新拉取请求(第1点),您唯一需要做的就是检查拉取请求来自的同一分支并再次推送到它:
1 2 3 4 5 | cd /my/fork git checkout master ... git commit -va -m"Correcting for PR comments" git push |
可选 - 清除提交历史记录
可能会要求您将提交压缩在一起,以便存储库历史记录清晰,或者您自己想要删除中间提交,这些提交会分散拉动请求中的"消息"(第2点)。例如,如果您的提交历史记录如下所示:
1 2 3 4 5 6 7 | $ git remote add parent [email protected]:other-user/project.git $ git fetch parent $ git log --oneline parent/master..master e4e32b8 add test case as per PR comments eccaa56 code standard fixes as per PR comments fb30112 correct typos and fatal error 58ae094 fixing problem |
将事物压缩在一起是个好主意,因此它们只显示为一次提交:
1 | $ git rebase -i parent/master |
这将提示您选择如何重写拉取请求的历史记录,以下内容将在您的编辑器中:
1 2 3 4 | pick 58ae094 fixing actual problem pick fb30112 correct typos pick eccaa56 code standard fixes pick e4e32b8 add test case as per PR comments |
对于任何提交,您希望成为之前提交的一部分 - 更改选择以进行压缩:
1 2 3 4 | pick 58ae094 fixing actual problem squash fb30112 correct typos squash eccaa56 code standard fixes squash e4e32b8 add test case as per PR comments |
并关闭你的编辑器。然后,Git将重写历史记录并提示您为一个组合提交提供提交消息。相应修改,您的提交历史现在将简明扼要:
1 2 | $ git log --oneline parent/master..master 9de3202 fixing actual problem |
把它推到你的前叉:
1 2 3 4 5 6 7 8 | $ git push -f Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (11/11), 978 bytes, done. Total 11 (delta 9), reused 7 (delta 6) To [email protected]:me/my-fork.git f1238d0..9de3202 HEAD -> master |
并且您的pull请求将包含一个提交,其中包含先前拆分为多个提交的所有更改。
改变公共回购的历史是件坏事
重写历史记录并在可能已经克隆其他人的分支上使用
但是,修改fork的历史记录以纠正您建议集成到存储库中的更改 - 这是一件好事。因此,毫无保留地压低你的拉动请求中的"噪音"。
关于分支的说明
在上面我展示了拉请求来自你的fork的
1 2 3 4 5 6 7 | $ git branch feature/new-widgets $ git checkout feature/new-widgets ... Hack hack hack ... $ git push # Now create PR from feature/new-widgets |
只需向pull请求中使用的分支添加新提交,然后将分支推送到GitHub。拉取请求将自动使用附加提交进行更新。
#2和#3是不必要的。如果人们只想查看合并分支的位置(而不是其他提交),则可以使用
我对最佳实践的看法:一旦你准备打包拉取请求,它应该在一开始就得到它自己独特的主题分支,特别是为此目的。首先将该分支推送到您的github存储库,例如
1 | git push origin name-of-pull-request-branch |
并将拉取请求基于该分支。完成此操作后,您推送到该分支的任何提交都将自动附加到拉取请求中。你只使用那个分支。
有些人更喜欢用你的github userid命名这样的分支。通过这种方式,他们可以在当地免费查看,以便尝试一下
- 减少对分支名称冲突的恐惧
- 更容易记住它是什么
我通常将我的拉请求分支命名为
1 | claybridges-do-the-things |