在GitHub上发送拉取请求仅用于最新提交

时间:2011-03-10 05:54:40

标签: git github pull-request

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

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

我正在努力使这些概念正确,并找出正确的命令行来完成我需要的工作。

7 个答案:

答案 0 :(得分:285)

你需要基本上创建一个新的分支& cherry-pick 您想要添加的提交。

  

注意:您可能需要在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>

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

答案 1 :(得分:56)

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

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

然后使用git cherry-pick获取您想要拉取请求的单个提交。如果具有此提交的分支被称为feature并且您想要的提交是此分支中的最新提交,那么这将是

git cherry-pick feature

假设此补丁适用且没有冲突,您现在可以获得一个分支,您可以为其执行拉取请求。

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

答案 2 :(得分:26)

我最终遇到了叉子并且想要将拉取请求提交回原始项目的情况。

我有:

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

要做到这一点,我:

  1. 从原始项目分叉的SHA创建了一个新分支
  2. 从原始项目中取出所有内容
  3. cherry选择了我想提交的提交作为拉取请求
  4. 把它全部推到了github
  5. git命令类似于:

    1. git branch my-feature-request 9685770
    2. git checkout my-feature-request
    3. git pull https://github.com/original_project/original_project.git
    4. git cherry-pick b67627b
    5. git push origin my-feature-request
    6. 然后我选择了my-feature-request作为我对原始项目的拉取请求的分支。

答案 3 :(得分: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。

答案 4 :(得分:5)

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

所以我检查了一个新分支

git checkout -b isolated-pull

这里我的解决方案与@Kevin Hakanson的有所不同,因为我需要将此分支重置为我想要与之分享的历史中的位置

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

并且选择我想要创建一个孤立拉取请求的提交

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

最后将它推到遥控器

git push origin isolated-pull

拉请求数据shi。

答案 5 :(得分:1)

创建一个新的(临时)分支,樱桃挑选和创建该分支的拉取请求的解决方案并不能让我满意。我不想更改我的存储库以提供一组提交,因此我想出了以下替代方案:

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

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中有那个额外的分支。

答案 6 :(得分:0)

基于@ kevin-hakanson的回答,我编写了这个小bash脚本来简化此过程。如果上游存储库尚不存在,它将添加上游存储库(提示您输入URL),然后提示输入要创建的新分支的名称以及要对该分支进行樱桃选择的提交的标记/ 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专家,所以让我知道是否有我错过的情况可以更好地实现自动化!)