在GitHub上仅为最近一次提交发送拉请求

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

我试图理解我是否应该创建一个新的本地分支,检查出来,以某种方式重置或重基到上游?然后应用我的最后一次提交从我的主人通过id到新的本地分支,并使用它的拉请求?

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

93427 次浏览

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

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

然后使用git cherry-pick来获得你想要的拉请求的单个提交。如果带有此提交的分支被称为feature,并且您想要的提交是该分支中最新的提交,则该分支将为

git cherry-pick feature

假设这个补丁没有冲突地应用,那么您现在就有了一个可以执行pull请求的分支。

在第二步中,你现在需要决定如何处理你的feature分支。如果你还没有在这个分支上发布你的更改,最好的方法可能是在new-branch上重新基于这个分支(并删除最后一次提交,如果这不是由git rebase自动完成的话)。

你需要创建一个新的分支;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>分支,切换到它,可以提交你想要的更改的拉请求。

我最终遇到了这样的情况:我已经分叉了,想要向原始项目提交一个拉请求。

我有:

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

为此,我:

  1. 从原来项目分叉的SHA创建了一个新的分支
  2. 都是从原项目中提取的
  3. cherry选择了我想作为拉请求提交的提交
  4. 都放到github上了

git命令是这样的:

  1. Git分支my-feature-request 9685770
  2. Git checkout my-feature-request
  3. git拉https://github.com/original_project/original_project.git
  4. Git选择b67627b
  5. Git推送源my-feature-request

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

这对我来说几乎管用:

git checkout -b upstream upstream/master


git cherry-pick <SHA hash of commit>


git push origin upstream

唯一的区别是:

git push origin upstream:upstream

我需要改变最后一行,以便git推送将使上游分支在我的GitHub回购,这样我就可以从中制作PR。

创建一个新的(临时)分支的解决方案,并为该分支创建拉请求并不能让我满意。我不想改变我的存储库以使一组提交可用,所以我提出了以下替代方案:

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

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

最后,这看起来就像一个临时分支被一个pull请求合并了一样,但是在fork-repository中没有额外的分支。

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

所以我去了一家新分店

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

并拉请求dat shi。

根据@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专家,所以如果我遗漏了可以更好地自动化的情况,请告诉我!)