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


280

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

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

我正在尝试正确理解概念并找出正确的命令行来执行我需要的操作。


如果您对所有其他提交都发出请求请求,会发生什么?我以为git足够聪明,可以忽略(或通过)它已经引入的提交?
jayarjo 2012年

3
大概上游尚未接受或不希望介入的提交。
Michael Scott Cuthbert 2014年

例如,@ jayarjo我做了其他不想发送给上游的更改。例如,对git的更改将忽略主存储库。git没什么容易的。
马丁

相关:关于Git(软件)和GitHub(Web服务)中的拉取请求如何不同的一些详细信息
RBT

Answers:


302

您基本上需要创建一个新分支,然后选择要添加的提交。

注意:在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上看到分支,切换到该分支,然后可以提交包含所需更改的pull请求。


32
我还需要git remote add upstream <git repository>git remote update在运行git checkout -b上游上游/主之前。
plainjimbo

6
这可行,但不是您应该做的那样,因为现在您的上游分支和上游/主服务器是不同的,并且如果合并您的拉取请求不是上游的第一件事,那么总会有所不同。出于这个原因,您应该更喜欢stackoverflow.com/a/5256304/1904815
JonnyJD

2
详细说明:这不是技术问题,而是合乎逻辑的问题。当您想对上游做任何事情(例如从那里合并)时,您需要添加一个分支“真实上游”或重置上游(不为任何其他更改的拉取请求保留本地分支)。
JonnyJD

15
为什么我到底需要一个额外的分支,只为一条更改的代码行创建PR ?!github上的人有没有考虑过这个问题?
CodeManX

2
@JonHanna不...为什么要完全合并一个分支?您为什么不能仅合并提交?
凯文·克鲁姆维德

57

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

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

然后使用git cherry-pick来获取您想要拉取请求的单个提交。如果调用了该提交的分支,feature而您想要的提交是该分支中的最新提交,则将

git cherry-pick feature

假设此补丁程序无冲突地适用,您现在获得了一个分支,可以对其执行请求请求。

第二步,您现在需要决定如何处理feature分支。如果尚未在此分支上发布所做的更改,最好的过程可能是在新分支上重新建立该分支(并删除上一次提交,如果不是通过自动完成的话git rebase)。


我在摘樱桃后收到此消息。没有添加任何内容来提交但存在未跟踪的文件(使用“ git add”进行跟踪)。一切都在我的主人中,但是我需要从上游创建我的分支。
Kevin Hakanson

5
如果feature已经提交了origin/master,则在期间不会发生任何事情cherry-pick。新分支应该来自upstream/master(即Kevin Hakanson的答案)
ohho,2013年

26

我最终遇到了一个我叉了岔路口,想向原始项目提交拉动请求的情况。

我有:

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

为此,我:

  1. 在SHA上创建了一个新分支,在该分支上分叉了原始项目
  2. 从原始项目中全部撤出
  3. Cherry选择了我想作为请求请求提交的提交
  4. 将其全部推送到github

git命令类似于:

  1. git branch我的功能请求9685770
  2. git checkout我的功能请求
  3. git pull https://github.com/original_project/original_project.git
  4. 吉特樱桃挑选b67627b
  5. git push origin我的功能请求

然后,我选择了我的功能请求作为对原始项目的拉取请求的分支。


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。


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

并拉要求达施。


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


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专家,所以让我知道是否有我错过的情况可以更好地自动化!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.