我知道有几个类似的问题,但我认为我的情况有点不同。
让我们说有一个我想贡献的GitHub存储库。 我将该存储库分叉到我的GitHub帐户,然后从我的PC中的帐户克隆分支。细
在处理问题之前,我首先想要将我的前叉与原始'同步。库。我转到我的帐户分支,单击New Pull请求,确保我选择我的作为基础并且原始主服务器作为主叉,我看到差异(人们在原始存储库中做的所有提交都不在我的下面) 。
然后我在我的fork上创建了pull请求,并在fork中合并了这些更改。
我去了我的本地仓库并做了git pull
,我把所有东西都同步了。细
问题出现了,现在我的GitHub帐户中总是说“这个分支是X提前提交”,其中' X'是我执行上述同步过程的次数。因此,每次我向原始存储库(而不是我的分支)执行拉取请求时,表明我提交了我的代码加上 X更多提交,这就是我在我的上做的合并fork与原始存储库同步。
当然,我不想将这些更改推送到原始存储库,因为他们已经有了这些更改,所以我不明白为什么GitHub一直跟我说我已经更改了提交。
我认为这是必须在我的GitHub帐户上解决的问题,因为在我的本地存储库中没有任何更改或问题,实际上我甚至将其删除并重新克隆。
你有什么想法吗?
答案 0 :(得分:52)
正如您所猜测的,这些额外提交可能是您创建的Pull请求的合并提交。
将来,有一种更简单的方法可以将fork与原始存储库同步。在您的本地仓库中,在初始克隆之后执行:
git remote add upstream https://github.com/upstream/repo.git
然后,只要您想同步上游的更改,请执行以下操作:
git pull --rebase upstream master
git push --force-with-lease origin master
(仅当您有未合并到上游仓库的提交时,才需要--rebase
和--force-with-lease
选项。)
强制性警告:由于rebase会重写历史记录,因此对于在此分支上工作的其他人来说,这可能会造成危险/破坏。确保您清楚地告知您与您合作的任何人所做的事情。由于这是一个私人分支,我认为这对你来说不是问题。
现在要解决当前问题。
重置您的本地分支以匹配upstream
:
git checkout master
git reset --hard upstream/master
如果您在fork中创建了任何提交,则可以cherry-pick
将它们添加到master
的更新版本中。如果你不记得或需要帮助找到它们,比如
git log --oneline master origin/master
应该显示任何不在上游的提交。
上面我假设您只使用一个分支master
。如果您还没有,我强烈建议您为您使用的每个功能/错误修复创建一个新分支。除了其他好处之外,这还允许您在等待较早的PR合并时开始处理另一个功能/错误修复。如果您从未直接提交master
,那么您可以在没有--rebase
或--force-with-lease
的情况下进行同步:
git checkout master
git pull upstream master
git push origin master
要在更新master
后更新功能分支,请执行:
git checkout myfeature
git rebase master
git push --force-with-lease origin myfeature # if you have already pushed
答案 1 :(得分:1)
在处理问题之前,我首先要将叉子与“原始”存储库同步。我转到我的帐户分支,单击“新提取”请求[...]
如果要更新/同步github分支,则应该不使用“拉取请求”。
拉取请求引入合并提交,这是错误消息的来源。 (默认情况下,拉取请求不是fast-forward
)。合并提交存在于您的fork中,但不在源存储库中。
您不想将分支与分支合并...您想更新分支以指向与他们的分支相同的提交。您希望分叉之间的分支相同。
您可以通过多种方式执行此操作,最好在其他答案中加以说明:
答案 2 :(得分:0)
我和你有同样的问题,只是解决了这个问题。
要解决此问题:
1)“重置”您本地的仓库到大量提交之前的那一刻
2)使用此修改后的本地仓库创建一个新分支
3)将此修订后的本地存储库“发布”到您的github存储库
4)在修改后的本地存储库中将要PR更改到github
5)“提交”此本地存储区
6)'将'提交提交到您的github存储库
7)在您的github repo new分支上,向上游repo提交拉取请求
希望这个答案会有所帮助。