【问题标题】:How to solve git push error while pushing to temp_branch on remote repository?推送到远程存储库上的 temp_branch 时如何解决 git push 错误?
【发布时间】:2021-11-28 10:55:30
【问题描述】:

我正在 GitHub 上处理团队项目。 我正面临错误:

更新被拒绝,因为推送的分支提示位于其远程后面 对方。查看此分支并集成远程更改 (e.g. 'git pull ...') 再次推送之前。

情况如下: 我从 GitHub 中提取主分支代码并开始在本地处理它,后来我使用此命令将更改推送到 temp_branch。

git push origin main:temp_branch

与此同时,GitHub 上的主分支中添加了一些其他更改(我在 temp_branch 上的更改尚未合并),我被告知要进行一些其他更改。

现在,我进行了更改并尝试使用这两个命令推送到同一个 temp_branch

git pull --rebase origin main
git push origin main:temp_branch

在执行此操作时,我收到了上述错误。我指的是这个链接,但它并不能完全回答我的问题,它建议使用 -f 强制推送来覆盖我不想的内容。

Updates were rejected because the tip of your current branch is behind its remote counterpart

我想知道这里到底发生了什么以及如何解决这个问题?

【问题讨论】:

  • 您没有集成远程更改。你所做的只是在origin master 上变基,你真正想做的是在origin/main:temp_branch 上变基?
  • origin main :sighs:
  • 整合更改,最终正如链接问题中提到的那样,您需要以某种方式强制它通过--force 或更具限制性的替代方案之一--force-with-lease--force-if-includes.

标签: git branch rebase git-push git-pull


【解决方案1】:

首先,我认为您会发现使用正常语法检查您正在处理的分支并推送到您的分支会更容易:

git fetch # update your copy of the remote branches
git switch temp_branch # checkout temp_branch
git rebase origin/main
git status # make sure your branch is tracking origin/temp_branch and not main

然后推送你可以简单地使用:

# the first time you push
git push
# or for subsequent pushes after a rebase (or amend of a commit)
git push --force-with-lease

您在这里提出了 2 个不同的问题:

我想知道这里到底发生了什么以及如何解决这个问题?

你已经知道“如何解决它”,因为你链接到answers that的问题:

由于变基,实际上需要 -f。

你说你不想使用-f,但是如果你使用rebase,你别无选择。也许如果我们回答您的第一个问题,您会更有信心进行力推。

“到底发生了什么?”

您需要先了解rebasing 的工作原理,然后您会意识到,无论何时重写提交,提交 ID 都会发生变化。更改提交 ID 后,您实际上删除了之前的提交并用新的提交替换了它们。由于旧的仍在远程分支上,除非您“强制”推送,否则 Git 不会允许您将它们吹走并用新的替换它们。请注意,力推有不同的变体。请随时阅读差异,但在此之前,我建议始终使用git push --force-with-lease,而不是更常见的--force-f。它更安全一些,如果失败了,先做另一个git fetch,看看遥控器上你不知道的新提交,确保你仍然可以把它们吹走,然后做再次--force-with-lease

rebase 你自己的分支然后强制推出它是完全没问题的,如果没有其他人与你共享该分支。如果它是一个公共回购,那么你应该考虑在你认为你已经完成它之前不要推出它,如果你打算重新设置它。否则,您必须通知其他人您正在重写他们可能正在处理的分支。请注意,您几乎从不想强制推送共享分支,例如 main

【讨论】:

  • 我已尽力了解并尽我所能。我尝试重新创建场景,并按照这些步骤操作。在我对本地仓库进行第二次更改之后。我做了git fetchgit switch temp_branch - 响应 - 分支'temp_branch' 设置为从'origin' 跟踪远程分支'temp_branch'。 git rebase origin/main - 响应 - 成功地重新设置和更新了 refs/heads/temp_branch。我做了git status,它显示了你所说的,然后我做了git checkout maingit merge temp_branch,当我使用git push origin main:temp_branch时,我做对了吗?
  • 下次推送到远程 temp_branch 时,我想要远程 main 的变化
  • @Charlie 我不清楚您将代码合并到main 的过程是什么。你是在 GitHub 上使用 PR 并完成它们以合并到 main 还是应该自己推送 main 分支?
  • @Charlie 您在评论中执行的最后 3 个命令可能不是必需的。签出main 后,git merge temp_branch 将快进合并并使main 的本地副本与temp_branch 相同。然后您的最后一个命令将您的本地副本main 推送到远程副本temp_branch。你可以简单地推出temp_branch,如果你已经这样做了,那么最后一个命令将无效。但这并没有伤害任何东西。不过,根据您的分支策略,我可能会单独保留您的本地 main 副本,以避免混淆。
【解决方案2】:

如果您有更改,请将它们存储在git add -u && git stash

查看主分支 git checkout main

然后通过git pull获取主分支上的最新更改

然后通过 git checkout temp_branch

然后合并git merge main

合并你的更改,我通常使用 vscode 来合并相同文件中的更改。我建议显示错误以获取更多详细信息。

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 2021-06-07
    • 2020-01-29
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2015-11-05
    • 2012-08-11
    相关资源
    最近更新 更多