284

我在 github 上创建了一个项目,并成功地对我的本地 master 进行了更改,并在 github 上推送到 origin。我想发送一个拉取请求,但只想包含最后一次提交。github.com 上的拉取请求 UI 显示了最后 9 次提交,我不知道如何过滤掉它。

我试图了解是否应该创建一个新的本地分支,检查并以某种方式重置或重新定位到上游?然后将我的最后一次提交从我的主人通过 id 应用到新的本地分支并将其用于拉取请求?

我正在尝试正确理解概念并找出正确的命令行来做我需要的事情。

4

7 回答 7

309

您基本上需要创建一个新分支并挑选您想要添加到其中的提交。

注意:您可能在 checkout/cherry-pick 命令之前需要这些

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

之后,您将<new-branch-name>在 github 上看到分支,切换到它并可以提交包含您想要的更改的拉取请求。

于 2011-03-11T05:49:28.747 回答
59

从最新的提交开始创建一个新分支,该提交也在原始存储库中:

git branch new-branch origin/master
git checkout new-branch

然后用于git cherry-pick获取您想要拉取请求的单个提交。如果调用了这个提交的分支feature并且你想要的提交是这个分支中的最新提交,这将是

git cherry-pick feature

假设这个补丁应用没有冲突,你现在有一个分支,你可以为它做你的拉取请求。

在第二步中,您现在需要决定如何处理您的feature分支。如果您尚未在此分支上发布您的更改,最好的过程可能是将此分支重新基于 new-branch (并删除最后一次提交,如果这不是由 自动完成的git rebase)。

于 2011-03-10T06:34:02.847 回答
26

我最终遇到了一种情况,我已经分叉了一个分支,并想向原始项目提交一个拉取请求。

我有:

  • 原始项目
  • forked_project(从 SHA 的原始项目创建:9685770)
  • my_fork(从 SHA 的分叉项目创建:207e29b)
  • 我想提交回原始项目的 fork (SHA: b67627b) 中的提交

为此,我:

  1. 从原始项目分叉的 SHA 创建了一个新分支
  2. 从原始项目中提取所有内容
  3. 樱桃选择了我想作为拉取请求提交的提交
  4. 把它全部推到github

git 命令类似于:

  1. git 分支我的功能请求 9685770
  2. git checkout 我的功能请求
  3. git 拉https://github.com/original_project/original_project.git
  4. git 樱桃挑选 b67627b
  5. git push origin my-feature-request

然后我选择了 my-feature-request 作为我对原始项目的拉取请求的分支。

于 2013-02-27T17:38:51.960 回答
6

这几乎对我有用:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

唯一的区别是:

git push origin upstream:upstream

我需要更改最后一行,以便 git push 在我的 GitHub 存储库中创建上游分支,以便我可以从中进行 PR。

于 2015-07-26T10:47:03.840 回答
6

我已经提交了我希望能够作为拉取请求隔离回当前分支的提交。

所以我检查了一个新的分支

git checkout -b isolated-pull

这就是我的解决方案与@Kevin Hakanson's 不同的地方,因为我需要将此分支重置为我想要区分的历史记录

git reset --hard [sha-to-diff-by]

并挑选我要从中创建独立拉取请求的提交

git cherry-pick [my-isolated-commit-sha]

最后推到遥控器上

git push origin isolated-pull

并拉取请求 dat shi。

于 2016-07-01T12:57:00.253 回答
1

创建一个新的(临时)分支、cherry-pick 并为该分支创建拉取请求的解决方案并不让我满意。我不想更改我的存储库以提供一组提交,所以我想出了以下替代方案:

首先为所有感兴趣的提交创建补丁文件:

git format-patch -1 <sha>

如果感兴趣的提交恰好是您可以使用的最后HEAD一个<sha>

现在,您可以将补丁发送给源存储库的维护者,他们可以应用它们:

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

最后,这应该看起来就像一个临时分支被拉取请求合并,但在 fork-repository 中没有那个额外的分支。

于 2016-03-15T09:35:23.580 回答
0

根据@kevin-hakanson 的回答,我编写了这个小 bash 脚本来简化这个过程。如果上游 repo 尚不存在(提示您输入 URL),它将添加上游 repo,然后提示输入要创建的新分支的名称和提交的 tag / SHA 以将樱桃选择到该分支。它检查您当前所在的分支或提交,然后存储任何更改,以便您可以签出新分支。合并策略保留来自精心挑选的提交的更改。将新分支推送到origin(假设是您的远程仓库的名称)后,您之前所在的分支或提交将再次签出,并且您之前的更改从存储中弹出。

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

(这在几个简单的测试中对我有用,但我不是 bash 程序员或 git 专家,所以如果我错过了可以更好地自动化的案例,请告诉我!)

于 2019-07-03T14:19:01.747 回答