我在GitHub上分享了一个回购并提交了拉取请求。该项目的维护者拒绝了拉取请求,但我们在论坛中找到了更好的解决方案。他们指示我使用替代更改创建另一个拉取请求。但是,我在GitHub上的存储库的分支现在已经过时了,因为自从我分叉以来,更新已经被推送到主仓库。此外,GitHub上的存储库还有一个额外的提交(我的拉取请求提交),它不应该存在,因为它不被接受作为项目的一部分。
我发现了这个问题:How do I update a GitHub forked repository?
我按照说明操作,具体来说,我这样做了:
git remote add upstream git://github.com/fuel/core
git fetch upstream
结果导致:
remote: Counting objects: 93, done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 69 (delta 49), reused 40 (delta 20)
Unpacking objects: 100% (69/69), done.
From git://github.com/fuel/core
* [new branch] 1.0/master -> upstream/1.0/master
* [new branch] 1.1/master -> upstream/1.1/master
* [new branch] 1.2/develop -> upstream/1.2/develop
* [new branch] 1.2/master -> upstream/1.2/master
* [new branch] 1.3/develop -> upstream/1.3/develop
* [new branch] 1.3/master -> upstream/1.3/master
* [new branch] 1.4/develop -> upstream/1.4/develop
* [new branch] 1.4/master -> upstream/1.4/master
* [new branch] 1.5/develop -> upstream/1.5/develop
* [new branch] 1.5/master -> upstream/1.5/master
* [new branch] 1.6/develop -> upstream/1.6/develop
* [new branch] feature/better-hmvc -> upstream/feature/better-hmvc
好的,所以看起来一切都很好。我确信我在正确的分支上:
git checkout 1.6/develop
Already on '1.6/develop'
字。好的,现在为此:
git rebase upstream/1.6/develop
First, rewinding head to replay your work on top of it...
Applying: prevent invalid XML node names
等待......什么?为什么要应用“防止无效的XML节点名称”?这是项目维护者拒绝的拉取请求。我显然错过了“反叛”的真正含义。现在,如果我git status
说:
# On branch 1.6/develop
nothing to commit (working directory clean)
当我git log
时,我可以看到我的问题的一半已经解决了。自我分叉以来已经进入项目的更改现在反映在我的git log
中。但是,最近的提交仍然是“防止无效的XML节点名称”。我该如何消除它?
我尝试检查最后一次对项目的提交:
git checkout 5f31a4df55e5b6ca1b2092534063a1fce4a32181
然而,这让我处于一个独立的HEAD状态。它说我可以环顾四周,做出改变并提交它们。我不认为这就是我想要做的。我想我想要HEAD指向提交5f31a4df55e5b6ca1b2092534063a1fce4a32181。我的下一步是什么?
答案 0 :(得分:9)
git rebase
会将您的提交保留在您的分支上。由于您的公关被拒绝,您希望将其删除并使master
分支与upstream/master
相同。
因此,您想要reset
!
git checkout master
git reset --hard upstream/master
然后你将拥有与上游主人完全相同的主人。然后,为您的新PR创建一个新分支,这样您就不会再遇到此问题了。
答案 1 :(得分:1)
由于这个问题有一个已经被接受的答案,但我会用另一种方式告诉你,因为在我的案例中,接受的答案并不顺利。
执行
$git rebase
There is no tracking information....
$git checkout
Already on 'master'
$git reset --hard upstream/master
ambiguous argument upstream/master
如果出现这种情况,请完成以下步骤。
本地重置HEAD。
$git reset HEAD
在服务器存储库上进行相同的更改。
$git reset HEAD^
然后它会显示有关您对原有分叉回购的更改的消息,列出所有文件。 Unstaged已更改为文件名。
现在使用以下方法撤消更改:
$git stash
现在您可以强制将这些更改推送到Sever,以将本地和远程仓库指向同一HEAD。
$git push origin +HEAD
现在你处于叉子时的同一个仓库。现在,您可以再次从原始仓库获取最新代码。