如何使用Git扩展处理拉取请求?

9
我在GitHub上有一个公共存储库,在GitExtensions中处理拉取请求时遇到了问题。我已经处理了3个请求,但我认为它们都没有正常工作或者没有按照我的意愿工作。
  1. 19日,我尝试处理Yi Jiang创建的一个pull request。在GitExtensions中,我执行了一个pull操作,将远程仓库作为参数传入,在选择远程分支时选中了master,并将“合并远程分支到当前分支”保留为默认设置。然后点击Pull按钮,操作成功完成。我对其中的一些内容进行了清理,然后在GitExtensions中进行了push操作。它没有填写提交信息,这让我感到惊讶,所以我只好把Yi Jiang的提交URL放进去,因为我不知道该怎么做。结果显示出现了一对提交,一个是Yi Jiang的作者提交,另一个是我的作者提交。

  2. 19日晚些时候,我尝试处理Michael创建的一个pull request。由于第一个操作明显有误,我寻找了其他选项。我运行了here中找到的第一组命令,看起来很顺利。唯一的问题是我必须通过命令行来完成,而不能在GitExtensions中完成。

  3. 又是Yi Jiang的一个pull request。由于上一次通过GitBash而不是GitExtensions似乎行得通,我再次尝试使用GitBash。但这一次,它无法完成,因为存在合并冲突。好吧,我转而使用GitExtensions进行合并,因为我知道这样可以解决冲突。于是,我打开“合并分支”对话框,选择“与...合并”,选择Yi Jiang的主分支,并保留了“如果可能,保持单一分支线(快进)”选项。我解决了冲突并进行了push操作。它自动为我填写了提交信息。结果显示出现了4个条目,其中3个是Yi Jiang的作者提交,1个是我的作者提交。看起来不太对。

所以我的问题是,我应该如何正确地处理这个问题?我有另一个拉取请求,我想确保我正确地处理它。分叉队列说它不会干净地应用,所以我预见需要进行合并。我想确保我正在正确地合并,并且分支和提交被归属于做工作的人。如果需要进行编辑,我是否应该先执行合并/推送,然后再使用单个分支进行第二次提交?这如何影响需要解决合并的情况?
有人能够详细介绍在GitExtensions中正确处理拉取请求的过程吗?
1个回答

7
#1听起来很正常——第一个是你拉取的分支中提交的,第二个是合并提交(实际上将分支合并在一起)。合并提交由执行git pull的人完成,但如果你在git blame中查看文件,你会发现责任行都是原始作者的(除非你解决冲突,否则合并提交不会添加责任行)。
#3也因为同样的原因而显得正常——合并会添加一个实际上合并分支的提交。
我猜想#2中的拉取请求实际上是快进的,因此不需要合并提交,而#1和#3不是快进的(即使它们没有冲突地合并,它们也不是你的HEAD直接后代)。
基本上,我认为你实际上做得对,即使看起来有点奇怪。 :)
如果你想要更详细的关于快进和合并之间区别的解释,这里是另一个人的话:

关于合并和“快进”

你会注意到我们已经多次看到了“快进”这个短语。这是“git merge”执行的特殊操作,其中一个分支可以沿着线性序列前进。每当您拉取建立在您最新提交的相同提交之上的更改时,这就会发生。换句话说,在多个存储库中从未出现分歧或同时创建的并行提交。如果存在并行提交,则“git merge”实际上会引入一个新的合并提交来将两个提交绑定在一起。

当发生非快进合并时,总有可能发生冲突。在这种情况下,“git merge”将在文件中留下冲突标记,并指示您解决冲突。完成后,您将发出“git commit -a”以创建合并提交。

(摘自http://cworth.org/hgbook-git/tour/

编辑

我去看了Github上的实际存储库。最后两次拉取(#2和#3)似乎已经正常工作,并且做了应该做的事情——在#2的情况下快进,在#3中合并(添加了合并提交)。

我不太确定#1发生了什么——某种方式,似乎你把一部分更改放入了一个单独的提交中?没有能够查看实际进行的操作,无法更好地判断。也许你有未提交的更改,并在没有注意到的情况下提交了它们?


1
话虽如此,你可能会考虑学习如何通过命令行解决冲突 - 我一直觉得Git在命令行界面上最自然;所有的GUI似乎都会使某些事情比必要的更难。 - Amber
看到我的编辑。我在第一个问题上进行了编辑,因为我能够清理一些代码。现在我的问题是,我是否应该将其作为完全独立的提交。 - Rebecca Chernoff
有两个选项。#1 是将其作为单独的提交完成 - 说实话,这可能是最好的选择 - 它不会影响历史记录(因此您仍然可以追溯到其他人的存储库的开发路线),并且它清楚地说明了您作为清理的一部分所做的更改。#2 是使用 git commit --amend,它有点像普通提交,但它将您的更改合并到最新的提交中(从而归因于撰写该提交的人),并且不会创建一个新的提交。偶尔会用到这个选项,但它不会提到您进行了更改。 - Amber
相反,它看起来像这些更改“一直都在那里” - 但由于它正在更改提交的内容,因此该提交的SHA将更改,因此它将不匹配您从中拉取的存储库中的SHA。因此,最好的选择是#1-拉取远程分支并合并它,然后在自己的合并之后添加另一个提交以清理代码。 - Amber

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