繁体   English   中英

从特定提交创建 PR

[英]Creating a PR from a specific commit

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

git checkout -b new-branch 8517c80183607461ea

我如何从这里创建 PR?

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

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

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

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

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]

完成的所有操作均创建了一个名为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 ,只有E1会出现在PR中。

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

如果你想包括8517c80183607461ea ,那么你需要重订new-branch上使用主git rebase -i master ,并删除除一个提到的所有行8517c80183607461ea 在重新设置8517c80183607461ea之后,分支的new-branch将直接在主8517c80183607461ea上包含重新设置的8517c80183607461ea及其新的提交ID,您可以推送分支/发出拉取请求。

我在使用Schwern的答案时遇到了一些麻烦,因为在进行提交时犯了一个在派生项目的主人身上的错误( 这里我称之为菜鸟错误)。

遵循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*分支出master节点,然后选择先前的提交会警告您

“以前的挑剔现在是空的,可能是由于解决冲突的缘故。”

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

相反,您应该做的是:

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]               

之后,您就可以仅使用选定的提交来发出拉取请求。

直接在github上编辑特定文件即可。 Github 会自动做一个补丁分支,所以你可以从你的分支中 PR 一个文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM