如何"拉取请求"特定的提交

pon*_*kos 44 git github

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

repo我想拉请求.

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

我希望提出请求

Jos*_*ber 60

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

$ git fetch --all
$ git checkout -b my-single-change upstream/master
$ git cherry-pick b50b2e7
$ git push -u origin my-single-change
Run Code Online (Sandbox Code Playgroud)

然后从该分支创建PR.


以上假定您已将其设置upstream为远程.如果没有,请先执行此操作:

$ git remote add upstream https://github.com/konradjk/exac_browser.git
Run Code Online (Sandbox Code Playgroud)

  • @NullByte08 - `git checkout -b my-single-change upper/master` 创建一个名为 `my-single-change` 的新本地分支,基于上游 `master` 分支(意味着它开始指向与 `my-single-change` 相同的提交)上游/主`)。当您向“my-single-change”添加其他提交时,它们只会添加到您的本地分支。 (2认同)
  • @NullByte08 - “upstream”通常是原始存储库,您没有写入权限。`origin` 通常是你自己的叉子,你可以将任何你想要的东西推送到它。`git push -u origin my-single-change` 将您本地的 `my-single-change` 分支推送到您的分支。当您创建 PR 时,您会要求原始存储库从您自己的分支中的“my-single-change”分支中提取您的更改。 (2认同)
  • 似乎如果在这些步骤之前没有设置上游,则应该在之后而不是之前运行`git fetch --all`,否则您无法创建分支。 (2认同)

gib*_*one 22

我有与alwaysCurious相同的错误,所以我做了一些挖掘。1

常规案例

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

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

这里的程序是约瑟夫的回答

# 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
Run Code Online (Sandbox Code Playgroud)

现在它是这样的:

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

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

git cherry-pick <hash of commit E>
git cherry-pick <hash of commit F>
git push -u origin partial-change
Run Code Online (Sandbox Code Playgroud)

解决任何冲突后,您将获得:

          E1 - F1 [partial-change]
         / 
A - B - C [master]
         \
          D - E - F - G [feature]
Run Code Online (Sandbox Code Playgroud)

连续案例

相反,如果您只想将所有连续提交应用到最后一个(或两个或三个),您可以在特定提交处分支。例如在这里我只想要提交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]
Run Code Online (Sandbox Code Playgroud)

菜鸟的错误

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

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

你不应该做的是:

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您尝试将 master 分支出来,G*然后选择之前的提交会给您警告:

之前的cherry-pick 现在是空的,可能是由于冲突的解决。

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

你应该做的是:

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]               

Run Code Online (Sandbox Code Playgroud)

在此之后,您准备好仅使用选定的提交发出拉取请求。


笔记:

  1. 在这里,我扩展了 Schwern 的这个很棒的答案

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


alw*_*ous 9

我不熟悉樱桃,当我尝试约瑟夫的方法时遇到了问题(樱桃是空的)。我找到了一个似乎运行良好的解决方法:

# Create new branch directly from specified commit:
$ git checkout -b my-single-change b50b2e7
$ git push --set-upstream origin my-single-change
Run Code Online (Sandbox Code Playgroud)

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

  • 我也尝试了“cherry-pick”,最初收到“空提交”错误。原因是我的新分支基于包含我想要“cherry-pick”的提交的分支,因此从技术上讲,新分支已经拥有该提交。我必须从另一个分支(例如“master”)创建分支,然后能够成功地将“cherry-pick”从“branch-with-commit-I-want”转换为“branch-with-cherry-pick” (3认同)
  • 这个答案不起作用,它实际上也拉取了之前的所有提交 (3认同)
  • 仅当您的特定提交是已推送到原点后的第一个提交时,它才有效吗?换句话说,如果您有提交 a、b 和 c,并且您从提交 b 创建分支,那么提交 a 也将被包括在内。 (2认同)