【问题标题】:How to "pull request" a specific commit如何“拉请求”特定的提交
【发布时间】:2015-12-01 18:50:06
【问题描述】:

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

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

【问题讨论】:

标签: git github


【解决方案1】:

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

# If you haven't set up your remote yet, run this line:
# git remote add upstream https://github.com/konradjk/exac_browser.git
git fetch --all                                   # Get the latest code
git checkout -b my-single-change upstream/master  # Create new branch based on upstream/master
git cherry-pick b50b2e7                           # Cherry pick the commit you want
git push -u origin my-single-change               # Push your changes to the remote branch

然后从该分支创建 PR。

【讨论】:

  • 第二行是做什么的?它是否在上游创建分支?我们通常无权在上游创建分支。所以我不明白第二行的意思。
  • @NullByte08 - git checkout -b my-single-change upstream/master 创建一个名为 my-single-change 的新 本地 分支 基于 上游 master 分支(意味着它开始指向与upstream/master 相同的提交)。当您向 my-single-change 添加其他提交时,它们只会添加到您的本地分支。
  • @NullByte08 - upstream 通常是您没有写入权限的原始存储库。 origin 通常是你自己的分叉,你可以将任何你想要的东西推到它上面。 git push -u origin my-single-change 将您的本地 my-single-change 分支推送到您的 fork。创建 PR 时,您要求原始存储库从您自己的 fork 中的 my-single-change 分支中提取您的更改。
  • @NullByte08 - 如果您将第二行从upstream/master 更改为origin/master,您的新分支将基于您的fork 的master,而不是原始存储库的master。如果您刚刚创建了分叉,那么它们可能是相同的。但是,如果您在前一段时间创建了分叉,则原始存储库的 master 可能会有您在分叉的 master 中还没有的其他更改。
  • 如果在步骤之前没有设置上游,git fetch --all应该在之后而不是之前运行,否则你无法创建分支。
【解决方案2】:

我有同样的错误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]

Cherry-pick 您的特定提交并推送更改:

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]

菜鸟失误

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

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* 处分支出 master,并且樱桃选择以前的提交会给您警告:

之前的樱桃选择现在是空的,可能是由于冲突解决。

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

你应该做的是:

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

【讨论】:

    【解决方案3】:

    我不熟悉cherry-pick,并且在尝试Joseph 的方法时遇到了问题(关于cherry-pick 是空的)。我找到了一个似乎效果很好的解决方法:

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

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

    【讨论】:

    • 只有当您的特定提交是已经推送到原点后的第一个提交时,它才会起作用?换句话说,如果您有提交 a、b 和 c,并且您从提交 b 创建分支,则提交 a 也将被包括在内。
    • 我也尝试了cherry-pick,最初收到“空提交”错误。原因是我的新分支基于包含我想要提交的分支cherry-pick,因此新分支在技术上已经有了提交。我必须从另一个分支(如master)创建我的分支,然后才能成功地将cherry-pickbranch-with-commit-I-want 转换为branch-with-cherry-pick
    猜你喜欢
    • 2017-03-28
    • 2018-06-07
    • 2022-01-01
    • 2018-06-21
    • 2011-05-05
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多