我想通过一次提交创建PR,所以我用commit SHA签出一个新分支,
git checkout -b new-branch 8517c80183607461ea
如何从此处创建PR?
答案 0 :(得分:3)
由于Git分支的工作方式,仅凭一次提交就不足以创建分支。您可能会拖入更多提交。
例如,假设您的存储库如下所示。
A - B - C [master]
\
D - E - F [feature]
master
和feature
只是指向提交的标签。 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-branch
将git rebase -i master
改成母版,并删除所有提到的行8517c80183607461ea
。重新设置基准之后,您的分支new-branch
将直接在主节点上包含具有新提交ID的重新基准的8517c80183607461ea
,并且您可以推送分支/发出拉取请求。
答案 2 :(得分:0)
我在使用Schwern's answer时遇到了一些麻烦,因为在进行提交时出现了在派生项目的主控器上出错(here,我称之为菜鸟错误) 。
根据Schwern的图表,假设我已经在C
分叉了一个项目,并继续进行其他提交。在这里,我添加一个星号来表示叉上正在发生新的更改:
A - B - C - D* - E* - F* [master]
如果您只想挑选一些提交内容(例如D
和E
),则不应该执行以下操作:
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]
此后,您就可以仅使用选定的提交进行拉取请求。