通过特定的提交创建PR

时间:2018-12-28 20:44:21

标签: git github

我想通过一次提交创建PR,所以我用commit SHA签出一个新分支,

git checkout -b new-branch 8517c80183607461ea

如何从此处创建PR?

3 个答案:

答案 0 :(得分:3)

由于Git分支的工作方式,仅凭一次提交就不足以创建分支。您可能会拖入更多提交。

例如,假设您的存储库如下所示。

A - B - C [master]
         \
          D - E - F [feature]

masterfeature只是指向提交的标签。 master指向提交C。feature指向提交F。

Git提交不是孤立存在的。他们把整个历史都带走了。没有E,D,C,B和A的情况下F不能存在。如果按feature,则F会将E和D一起带来(假设C已经被推动)。

假设您要发送仅E的PR。因此您在E上建立了一个分支。

$ git checkout -b new-branch E

A - B - C [master]
         \
          D - E [new-branch]
               \
                F [feature]

完成的所有操作都会创建一个名为new-branch的标签,该标签指向提交E。提交的结构保持不变。如果然后按new-branch,它将与之一起拖动D。这就是为什么有时在您认为只推送少量提交时,PR包含更多提交的原因。


要真正只推送一个提交,您需要将其与历史分离。您可以使用git cherry-pick进行此操作。这基本上就是提交,将其变成补丁,然后在其他地方对其进行补丁。

返回到原始存储库...

A - B - C [master]
         \
          D - E - F [feature]

您将在master上建立一个新分支。

$ git checkout -b new-branch master

          [new-branch]
A - B - C [master]
         \
          D - E - F [feature]

(请注意,除了指向C的新分支标签外,其他都没有更改。)

然后选择E。这将把E复制为C上的新提交。可能存在冲突,请按常规解决。

$ git cherry-pick E

          E1 [new-branch]
         / 
A - B - C [master]
         \
          D - E - F [feature]

现在您可以按new-branch,并且PR中仅E1。

答案 1 :(得分:2)

您需要将new-branch推送到Github,然后打开提取请求。这将包括8517c80183607461ea可以到达的所有提交,但master的历史记录中尚未包括。

如果您只想包含 8517c80183607461ea,则需要使用new-branchgit rebase -i master改成母版,并删除所有提到的行8517c80183607461ea。重新设置基准之后,您的分支new-branch将直接在主节点上包含具有新提交ID的重新基准的8517c80183607461ea,并且您可以推送分支/发出拉取请求。

答案 2 :(得分:0)

我在使用Schwern's answer时遇到了一些麻烦,因为在进行提交时出现了在派生项目的主控器上出错(here,我称之为菜鸟错误) 。

根据Schwern的图表,假设我已经在C分叉了一个项目,并继续进行其他提交。在这里,我添加一个星号来表示叉上正在发生新的更改:

A - B - C - D* - E* - F* [master]

如果您只想挑选一些提交内容(例如DE),则不应该执行以下操作:

git checkout -b new-branch upstream/master
git cherry-pick <hash of commit D>
git cherry-pick <hash of commit E>
git push -u origin new-branch

在这种情况下,您尝试在F*分支出主服务器,而樱桃选择先前的提交将给您警告

  

“由于冲突解决,以前的选择已变为空。”

因为要在新分支上添加相同的旧提交。

您应该做的是:

git checkout -b new-branch <hash of commit E>
git push -u origin new-branch

A - B - C - D* - E* - F* - G* [master]
                  \
              D* - E* [new-branch]               

此后,您就可以仅使用选定的提交进行拉取请求。