我已向Github上的一个开源项目提交了更改,并收到了一位核心团队成员的代码审阅意见。重新提交。最佳的工作流程是什么?根据我对git / github的有限了解,我可以执行以下任何操作:


将代码更新为新提交,并将初始提交和更新提交都添加到我的请求中。
以某种方式(??)从存储库中回滚旧提交,并创建一个包含所有内容的新提交,然后对此请求提出拉取请求?
git commit具有修改功能,但是我听说过将提交推送到本地存储库之外后,您不应该使用它吗?在这种情况下,我已经在本地PC上进行了更改并将其推送到项目的github分支。可以使用'amend'吗?
还有别的吗?

选项2/3似乎不错,因为开源项目在其历史记录中只有一个提交,将实现所有内容,但我不确定如何执行。

注意:我不知道这是否会影响答案,但我没有在单独的分支中进行更改,我只是在master

上进行过一次提交

#1 楼

只需向pull请求中使用的分支添加新提交,然后将该分支推送到GitHub。拉取请求将通过其他提交自动更新。

#2和#3是不必要的。如果人们只想查看分支的合并位置(而不是其他提交),则可以使用git log --first-parent在日志中仅查看合并提交。

评论


master也是一个分支,因此从技术上来说没关系:)

–戳
2011年10月30日在22:16

@OrionEdwards-正如戳所提到的,master是一个分支,因此,对其进行更新将导致所有基于它的拉取请求也会被更新。 (这是对打算提交请求的任何内容使用单独分支的充分理由。)

–琥珀色
2011年10月30日22:34

由于代码仍在审查中,通常最好修复提交而不是引入只会使历史混乱的附加修复提交...

– mgalgs
2013年9月14日下午3:49

@mgalgs这是一个优先事项。

–琥珀色
2013年9月17日的15:00

我不喜欢这个答案,原因是我刚刚写的博客文章中解释的原因;我相信其他答案会更好。

–亚当·斯派尔斯
15年3月24日在14:12

#2 楼

要更新拉取请求

要更新拉取请求(第1点),您唯一需要做的就是签出拉取请求所在的同一分支,然后再次将其推入:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push


可选-清除提交历史记录

可能会要求您将提交压缩在一起,以使存储库历史记录干净,或者您自己想删除中介提交会分散您的拉取请求中的“消息”(第2点)。例如,如果您的提交历史记录看起来像这样: >
$ git remote add parent git@github.com: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


这将提示您选择如何重写请求请求的历史记录,以下内容将出现在您的编辑器中:

$ git rebase -i parent/master 


>对于任何您想成为上一个提交的提交-更改为壁球:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments


并关闭编辑器。然后,Git将重写历史记录,并提示您提供一个合并提交的提交消息。相应地进行修改,现在您的提交历史记录将变得很简洁: >并且您的拉取请求将包含一个提交,其中包含以前拆分为几个提交的所有更改。在可能已被其他人克隆的分支上,这是一件坏事-它导致存储库的历史记录和结帐的历史记录不一致。您建议将其集成到存储库中-是一件好事。因此,毫无保留地将“噪音”从您的拉取请求中挤出来。

关于分支的说明

在上面的示例中,我将拉取请求显示为来自您的fork的git push -f分支,这并没有错,但确实会造成某些限制,例如,如果这是您的标准技术,则每个只能打开一个PR资料库。不过,最好为要提出的每个更改创建分支:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments


评论


+1表示如何清理提交而不是推送其他修正提交。

– mgalgs
2013年9月14日下午3:50

我在挑选/压榨时遇到了一些问题,这个答案帮助了我。还注意到Github在我执行git push -f之后删除了先前的对话。没有太多评论,但这是我没想到的。

–希特什
2013年12月4日19:31

需要明确的是,在改组以拥有清晰的历史记录时,您实际上是在更改公共提交,只是假设没人在乎,因为它是一个分支。

–brita_
2015年2月7日在11:02

后续行动:最佳实践是在PR期间更改主控?

–凯文·索特尔
2015年6月4日16:09

考虑到已审核(或通常有评论/引用代码的)拉取请求的重写历史记录可能会导致混乱,因为该历史记录将不再与注释所指的内容匹配。没有简单的解决方案:有人会关闭PR并将其引用到新的PR中(以不重写历史记录);我的想法是仅在执行强制推送后,备份正在重置/重写的最新提交SHA,并在PR的注释中引用它。如果修剪没有删除该分离的提交,则其历史记录仍将与PR的注释匹配。

–卡马羽
18年7月24日在9:25