我在github上创建了一个项目,并成功地对本地主机进行了更改,并将其推到了github上。我想发送拉取请求,但只想包含上一次提交。github.com上的pull request UI显示了最后9次提交,我不知道如何过滤掉。
我试图了解是否应该创建一个新的本地分支,检查并以某种方式重置或重置为上游?然后将我的主ID提交的最后一次提交应用于新的本地分支,并将其用于请求请求?
我正在尝试正确理解概念并找出正确的命令行来执行我需要的操作。
我在github上创建了一个项目,并成功地对本地主机进行了更改,并将其推到了github上。我想发送拉取请求,但只想包含上一次提交。github.com上的pull request UI显示了最后9次提交,我不知道如何过滤掉。
我试图了解是否应该创建一个新的本地分支,检查并以某种方式重置或重置为上游?然后将我的主ID提交的最后一次提交应用于新的本地分支,并将其用于请求请求?
我正在尝试正确理解概念并找出正确的命令行来执行我需要的操作。
Answers:
您基本上需要创建一个新分支,然后选择要添加的提交。
注意:在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请求。
git remote add upstream <git repository>
并git remote update
在运行git checkout -b上游上游/主之前。
从最新提交开始创建一个新分支,该分支也在原始存储库中:
git branch new-branch origin/master
git checkout new-branch
然后使用git cherry-pick
来获取您想要拉取请求的单个提交。如果调用了该提交的分支,feature
而您想要的提交是该分支中的最新提交,则将
git cherry-pick feature
假设此补丁程序无冲突地适用,您现在获得了一个分支,可以对其执行请求请求。
第二步,您现在需要决定如何处理feature
分支。如果尚未在此分支上发布所做的更改,最好的过程可能是在新分支上重新建立该分支(并删除上一次提交,如果不是通过自动完成的话git rebase
)。
feature
已经提交了origin/master
,则在期间不会发生任何事情cherry-pick
。新分支应该来自upstream/master
(即Kevin Hakanson的答案)
我最终遇到了一个我叉了岔路口,想向原始项目提交拉动请求的情况。
我有:
为此,我:
git命令类似于:
然后,我选择了我的功能请求作为对原始项目的拉取请求的分支。
这几乎对我有用:
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。
创建一个新的(临时)分支“挑选”并为该分支创建拉取请求的解决方案令我不满意。我不想更改存储库以使一组提交可用,所以我想出了以下替代方案:
首先为所有感兴趣的提交创建补丁文件:
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中没有那个额外的分支。
基于@ 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专家,所以让我知道是否有我错过的情况可以更好地自动化!)