从特定提交创建PR

Mel*_*art 1 git github

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

git checkout -b new-branch 8517c80183607461ea
Run Code Online (Sandbox Code Playgroud)

如何从这里创建PR?

Sch*_*ern 5

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

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

A - B - C [master]
         \
          D - E - F [feature]
Run Code Online (Sandbox Code Playgroud)

master并且feature仅仅是指向提交的标签。master指向提交C。feature指向提交F。

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

假设您只想发送PR的PR。因此您在E建立分支。

$ git checkout -b new-branch E

A - B - C [master]
         \
          D - E [new-branch]
               \
                F [feature]
Run Code Online (Sandbox Code Playgroud)

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


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

回到您的原始存储库...

A - B - C [master]
         \
          D - E - F [feature]
Run Code Online (Sandbox Code Playgroud)

你会开一个新的分支master

$ git checkout -b new-branch master

          [new-branch]
A - B - C [master]
         \
          D - E - F [feature]
Run Code Online (Sandbox Code Playgroud)

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

然后选择E。这会将E复制为C之上的新提交。可能存在冲突,请按正常方式解决它们。

$ git cherry-pick E

          E1 [new-branch]
         / 
A - B - C [master]
         \
          D - E - F [feature]
Run Code Online (Sandbox Code Playgroud)

现在您可以按入new-branch,只有E1会出现在PR中。