我从远程存储库重新调整了更改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}
补救措施,但在这种情况下 push 更改的最佳方法是什么?
我对此进行了探索,并在这里发现了几个类似的问题,但有一些细微的区别,这些区别并没有向我澄清这个问题。大部分selected answers建议这样做git push --force origin my_branch
但它也有缺点,人们可能会丢失远程更改,因此不能建议这样做。
我所知道的最好的事情就是create & checkout to a new branch这比许多其他答案/解决方案更好。但这更像是逃避问题的伎俩,而不是处理这种情况的正确方法。那么,任何机构都可以通过分享这种情况下的正确方法来澄清吗?
最佳答案
由于您的 dev
分支是私有(private)的,并且您是目前唯一使用它的人,因此重写其历史记录然后进行强制推送并没有本质上的错误。正如您所指出的,解决您遇到的错误的方法是强制推送到远程,例如
git push --force origin dev
这会用您本地的分支覆盖远程 dev
分支。但由于除了您自己之外没有其他人可以看到这一点,因此这样做应该是安全的。
通过图表,考虑 dev
在远程启动时除了 master
之外还进行了一次额外提交:
master: ... A -- B -- C
\
dev: D
现在,其他人已经在 master
中完成了一些工作,并 push 了该工作。假设这只是一次提交,留给我们的是:
master: ... A -- B -- C -- E
\
dev: D
在本地,您在 master
上对 dev
进行了 rebase ,这为我们提供了以下分支(请注意,一个 dev
被标记为本地):
master: ... A -- B -- C -- E
\ \
dev: D \
\
local-dev: D'
但是现在,当您尝试将 local-dev
推送到远程 dev
时,Git 会感到困惑。它很困惑,因为远程的是 C
之上的 D
提交。但是您尝试推送的本地分支已在 C
之上提交了 E--D'
。它无法自动解决此问题,因此会失败。进行强制推送可以解决这个问题,在您的情况下,这应该是可以接受的事情。
关于pull --rebase 后 Git 推送错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43652488/