关于git:在代码审查后更新拉取请求的首选Github工作流程

Preferred Github workflow for updating a pull request after code review

我已经在Github上提交了对开源项目的更改,并收到了其中一个核心团队成员的代码审查意见。

我想考虑审核评论更新代码,然后重新提交。这样做的最佳工作流程是什么?根据我对git / github的有限知识,我可以做以下任何一项:

  • 将代码更新为新提交,并将初始和更新的提交添加到我的pull请求中。

  • 不知怎的(??)从我的存储库回滚旧的提交,并创建一个包含所有内容的新提交,然后为此提出拉取请求?

  • git commit有一个修改功能,但我听说你在本地存储库之外推送提交后不应该使用它?在这种情况下,我在我的本地PC上进行了更改并推送到我的项目的github分支。这可以使用'修改'吗?

  • 别的什么?

  • 看起来选项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请求将包含一个提交,其中包含先前拆分为多个提交的所有更改。

    改变公共回购的历史是件坏事

    重写历史记录并在可能已经克隆其他人的分支上使用git push -f是一件坏事 - 它会导致存储库的历史记录和结帐的历史记录发生分歧。

    但是,修改fork的历史记录以纠正您建议集成到存储库中的更改 - 这是一件好事。因此,毫无保留地压低你的拉动请求中的"噪音"。

    关于分支的说明

    在上面我展示了拉请求来自你的fork的master分支,这没有什么不妥,但它确实会产生某些限制,例如,如果这是你的标准技术,只能有一个公关每个存储库打开。虽然为您希望提出的每个单独的更改创建一个分支,但这是一个更好的主意:

    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是不必要的。如果人们只想查看合并分支的位置(而不是其他提交),则可以使用git log --first-parent仅查看日志中的合并提交。


    我对最佳实践的看法:一旦你准备打包拉取请求,它应该在一开始就得到它自己独特的主题分支,特别是为此目的。首先将该分支推送到您的github存储库,例如

    1
    git push origin name-of-pull-request-branch

    并将拉取请求基于该分支。完成此操作后,您推送到该分支的任何提交都将自动附加到拉取请求中。你只使用那个分支。

    有些人更喜欢用你的github userid命名这样的分支。通过这种方式,他们可以在当地免费查看,以便尝试一下

    • 减少对分支名称冲突的恐惧
    • 更容易记住它是什么

    我通常将我的拉请求分支命名为

    1
    claybridges-do-the-things