拉动后的Git推送错误--rebase

时间:2017-04-27 08:26:41

标签: git github git-rebase merge-conflict-resolution

我将更改从远程仓库upstream master重新定位到我的本地dev分支,然后尝试使用以下命令将更改推送到我的仓库:

git pull --rebase upstream master
git push origin dev

但后来的命令导致了这个错误:

error: failed to push some refs to 'https://github.com/m-adil/some_repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这是我第三次面对的,但还没有找到完美的解决方案。按照第二行最后一行中的建议执行git pull ...会导致再次产生所有冲突,从而破坏最近的git pull --rebase ...。在这种情况下,git reset --hard HEAD@{1}会补救,但在这种情况下推动更改的最佳方法是什么?

我对此进行了探讨,并在此处发现了几个类似的问题,但只有一些细微的区别,我不会向我澄清这个问题。大多数selected answers建议做git push --force origin my_branch,但它也有缺点,并且可以丢失他在遥控器中的更改,因此无法提出建议。 我所知道的最好的事情是create & checkout to a new branch,这比许多其他答案/解决方案更好。但这更像是摆脱这个问题的伎俩而不是处理这种情况的正确方法。那么,在这种情况下,请通过分享正确的方法澄清任何一个机构吗?

1 个答案:

答案 0 :(得分:3)

由于您的dev分支是私有的,并且您是目前唯一使用它的分支,因此重写其历史记录然后进行强制推送没有任何内在错误。正如您所指出的,解决您遇到的错误的方法是强制推送到遥控器,例如

git push --force origin dev

这将使用您在本地拥有的内容覆盖远程dev分支。但是,由于除了你自己以外没有其他人可以看到这一点,所以应该是安全的。

通过图表的方式,考虑dev从远程开始,只有master以外的一个额外提交:

master: ... A -- B -- C
                       \
dev:                    D

现在,其他人在master做了一些工作,推动了这项工作。让我们说这只是一次提交,让我们留下这个:

master: ... A -- B -- C -- E
                       \
dev:                    D

在本地,您在dev上进行了master的变基,它为我们提供了以下分支(请注意,一个dev被标记为本地):

master:    ... A -- B -- C -- E
                          \    \
dev:                       D    \
                                 \
local-dev:                        D'

但现在,当您尝试将local-dev推送到远程dev时,Git会感到困惑。它很混乱,因为远程是D提交C提交。但是您尝试推送的本地分支已在E--D'之上提交C。它无法自动解决此问题,因此失败。做推力可以解决这个问题,在你的情况下这应该是可以接受的。