如何“拉取请求”特定的提交

时间:2015-12-01 18:50:07

标签: git github

我有一个特定的提交,我想贡献给我在github上分叉的存储库。 我认为这样做的机制是“拉取请求”。 但是,当我尝试这个时,我只能请求我的整个分支。 我不希望提出其他提交请求,因为它们不相关。 知道如何做到这一点。

repo I wish to pull request to.

最后一次提交b50b2e7是我希望提取请求的唯一提交。 无论如何,我可以做到这一点,或者所有提交都是相互依赖的?

commit I wish to pull request

3 个答案:

答案 0 :(得分:53)

仅使用该更改创建一个新分支:

$ git fetch --all
$ git checkout -b my-single-change upstream/master
$ git cherry-pick b50b2e7
$ git push -u origin my-single-change

然后从该分支创建PR。

以上假设您已将upstream设置为遥控器。如果没有,请先执行此操作:

$ git remote add upstream https://github.com/konradjk/exac_browser.git

答案 1 :(得分:0)

我遇到了与alwaysCurious相同的错误,因此我做了一些挖掘工作。 1

常规情况

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

您正在处理一个项目,您使用一个单独的分支(feature)来进行已提交的更改(D-E-F-G),并且想要创建一个请求请求。但是,您只希望在提交请求中包含某些提交(EF

这里的过程是Joseph's answer

中的过程
# optional: set upstream as remote if it's not
git remote add upstream https://github.com/<upstream_github_username>/<upstream_github_repo_name>.git
# fetch changes
git fetch --all
# create specific branch for your partial pull request
git checkout -b partial-change upstream/master

现在这是它的样子:

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

用樱桃选择您的特定提交并推送更改:

git cherry-pick <hash of commit E>
git cherry-pick <hash of commit F>
git push -u origin partial-change

解决所有冲突后,您将获得以下信息:

          E1 - F1 [partial-change]
         / 
A - B - C [master]
         \
          D - E - F - G [feature]

连续案件

如果相反,您只想将所有连续的提交应用到最后一个(或两个或三个),则可以从特定的提交分支出来。例如,在这里我只希望提交到E的提交,而不是随后的提交:

git checkout -b partial-consecutive-changes <hash of commit E>
git push -u origin partial-consecutive-changes

A - B - C [master]
         \
          D - E [partial-consecutive-changes]
               \
                F - G [feature]

菜鸟错误

如果您只是对母版应用了连续的更改而没有使用特定的分支,那么最后一个过程也可以为您提供帮助,现在您想在之后进行挑选。如果您已经在C分叉了一个项目并继续进行其他提交,则这是很重要的。在这里,我添加一个星号来表示叉上正在发生新的更改:

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

您不应该做的是:

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

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

  

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

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

您应该做的是:

git checkout -b partial-change <hash of commit E>
git push -u origin partial-change

A - B - C - D* - E* - F* - G* [master]
                  \
              D* - E* [partial-change]               

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


注意:

  1. 在这里,我要从Schwern扩展此great answer

  2. 要获取最后的n次提交哈希,可以使用以下方法:git log --pretty=oneline --abbrev-commit | head -n

答案 2 :(得分:-1)

我不熟悉樱桃采摘,在尝试约瑟夫的方法时遇到了问题(关于樱桃采摘是空的)。我发现一种变通的方法似乎效果很好:

# Create new branch directly from specified commit:
$ git checkout -b my-single-change b50b2e7
$ git push --set-upstream origin my-single-change

您现在可以在GitHub中选择此分支并创建拉取请求。