pull --rebase 后 Git 推送错误

标签 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}补救措施,但在这种情况下 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/

相关文章:

git - 即使在添加 ssh key 后也无法克隆任何 git repo

git - 如何压缩和编辑同一个提交?

github - 如何直接从 GitHub 安装 npm 包

python - Visual Studio 中的一个项目有多个团队 - 不好的做法?

添加到 .gitignore 后,git 仍然显示已修改的文件

git - 在 Julia 中提交包时出错

github - 在 github 存储库的子目录中获取包

git - git merge-git : what is the correct merging or rebasing workflow to modify a maintenance branch and apply those patches to another branch?

git - 使用 git rebase 时自动跳过空提交

Git忽略除某个目录的所有子目录中的某种类型的所有文件?