我们的工作流程就是这样。我们有一个叫做dev的分支,我可以在origin/dev找到它。当我们进行更改时,我们创建了一个开发分支:

git checkout -b FixForBug origin/dev

现在我有一个名为FixForBug的分支,它正在跟踪(我认为这是正确的词)origin/dev。因此,如果我做了一个git拉,它将带来来自origin/dev的新变化,这是很棒的。现在,当我完成修复后,我将推到一个名为相同内容的远程分支。

首先,我从origin/dev中删除任何更改,并进行rebase:

git pull --rebase

然后我将更改推到同名的远程分支:

git push origin FixForBug

现在,远程服务器上有一个分支,我可以创建一个pull请求,以批准该更改并将其合并回dev分支。我自己从来没有把任何东西推向原始/开发阶段。我猜这是非常常见的工作流程。

我第一次执行git推送时,它工作得很好,并创建了远程分支。然而,如果我第二次推送(比如在代码审查期间,有人指出了一个问题),我会得到以下错误:

错误:无法推送一些引用 “https://github.mydomain.info/Product/product.git” 提示:更新被拒绝,因为当前分支的尖端落后于远程分支。在再次推送之前整合远程更改(例如:提示:'git pull…')。 详见“git push—help”中的“关于快进的说明”。

然而,如果我做一个git状态,它说我领先于origin/dev 1提交(这是有意义的),如果我遵循提示并运行git pull,它说一切都是最新的。我认为这是因为我推到了一个不同于上游分支的分支。我可以通过运行以下命令来解决这个问题:

git push -f origin FixForBug

在这种情况下,它会将更改推送到远程分支,并表示(强制更新)并且远程分支上的一切看起来都很好。

我的问题:

为什么在这种情况下需要-f ?通常当你强迫做某事时,那是因为你做错了某事,或者至少违反了标准做法。我是否可以这样做,或者它是否会在远程分支中搞砸一些东西,或者为最终必须将我的东西合并到开发中的人制造麻烦?


-f实际上是必需的,因为它是变基的。每当你做一个rebase,你都需要做一个强制推送,因为远程分支不能快进到你的提交。你总是想要确保你在推送之前做了一个拉,但如果你不喜欢强制推送到master或dev,你可以创建一个新的分支来推送,然后合并或进行PR。


如果你想避免使用-f,那么你可以使用just

git pull

而不是

git pull --rebase

非rebase将从origin/dev获取更改,并将它们合并到FixForBug分支中。然后,你就能跑了

git push origin FixForBug

不使用-f。


为了确保您的本地分支FixForBug没有领先于远程分支FixForBug,在推送之前拉取并合并更改。

git pull origin FixForBug
git push origin FixForBug

当我遇到“更新被拒绝,因为当前分支的尖端落后”的消息时,我在Azure DevOps中使用的命令是/是这个命令:

git pull origin master

(或者可以从一个新文件夹开始克隆)…

这个答案并没有解决所提出的问题,具体来说,Keif已经回答了这个问题,但它确实回答了问题的标题/标题文本,这将是Azure DevOps用户的一个常见问题。

我注意到Keif的回答:“你总是想确保你在推之前做了一个拉!”

除了Git命令行工具,我还使用过Git GUI工具。

(我不确定如何在git GUI中执行命令行命令“git pull origin master”,所以我回到命令行来执行此操作)。

下面的图表显示了你可能想要执行的各种操作的各种Git命令:


这一定是因为提交在当前的推送之前。

Git拉源码“你想推的分支名称” git变基 如果git rebase成功,那么很好。否则,您必须在本地解决所有合并冲突,并保持它继续,直到与remote的重基成功。 Git rebase—继续


我是这样解决问题的:

让我们假设上游分支是您派生的分支,原点是您的存储库,您想要向上游分支发送一个MR/PR。

假设您已经提交了大约四次,并且由于当前分支的尖端落后,您正在获得被拒绝的更新。

以下是我所做的

首先,压缩所有四个提交:

git rebase -i HEAD~4

您将得到一个包含选择的提交列表(在编辑器中打开)。

例子

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

to

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

之后,您可以保存合并提交

Next

你需要把承诺藏起来。

方法如下:

git reset --soft HEAD~1
git stash

现在用你的上游分支重新建立基地:

git fetch upstream beta && git rebase upstream/beta

现在弹出你的存储提交:

git stash pop

提交这些更改并推动它们:

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f

这件事刚刚发生在我身上。

昨天我向我们的主人提出了请求。 我的同事今天正在审查它,发现它与我们的主分支不同步,所以为了帮助我,他将master合并到我的分支。 我不知道他会那样做。 然后我在本地合并master,尝试推它,但是失败了。为什么?因为我的同事合并与主人创建了一个额外的提交,我没有在本地!

解决方案:拉下我自己的分支,这样我就能获得额外的提交。然后把它推回我的远程分支。

在我的树枝上,我真的做了:

git pull
git push

我在尝试通过Visual Studio Code进行重基时遇到了这个问题。我的问题通过从Git输出窗口复制命令并在Visual Studio Code的终端窗口中执行就解决了。

在我的例子中,命令是这样的:

git push origin NameOfMyBranch:NameOfMyBranch

*“当前分支的尖端落后于远程分支的尖端”*意味着远程分支上有您在本地没有的更改。Git告诉您从REMOTE导入新的更改,并将其与您的代码合并,然后将其推送到REMOTE。

您可以使用此命令强制使用本地存储库()对服务器进行更改。远程回购代码将被本地回购代码取代。

git push -f origin master

使用-f标记,您将使用本地回购代码覆盖远程分支代码。


您必须在提交中添加了尚未推送的新文件。检查文件,再次推动该文件,然后尝试拉/推。

它会起作用的。这对我很管用……


我帮助下:

git stash
git pull origin master
git apply
git commit -m "some comment"
git push

设置当前分支名称,如master:

Git pull -rebase origin master Git push origin master

或分支名称develop

Git pull -rebase origin develop Git推送源码


如果您尝试了前面的所有答案,但问题仍然没有解决,那么请确保推送的分支名称是惟一的,并且在远程中不存在。

错误消息可能具有误导性。


推送被拒绝,因为您当前分支的尖端落后。

当我遇到这样的情况时,我就这样跑:

git push -f origin main

事情就这样完成了。


由于我试图提交的分支是master下的子分支,所以我首先从存储库中删除了它(由于回溯引用问题)。然后我重新尝试推,它再次工作!

注意:作为删除初始分支的一部分,我在推送中有所有之前的更改,所以没有代码丢失。


这取决于权限。

您可能没有直接推送到主分支(master, development)的权限。如果您在一个企业项目中,您应该将自己的主题分支推到其远程并提交合并请求(MR)。


我们可以使用以下命令强制更改GitHub使用本地存储库:

git push -f origin main

在我的例子中,远程存储库已经有一个与我正在处理的开发分支同名的分支。我只是重命名了分支并推送了代码。这对我很管用。

git checkout -b new-branch-name
git push origin new-branch-name

如果你真的担心任何其他方法,这些步骤可以帮助你没有任何困难

1:将您的更改保存在您想要推送的本地分支中

2:重命名你的本地分支为未来的备份

3:从你的远程创建一个同名的分支,它将有所有的更改

4:签出这个新分支作为你的新本地分支

5:在这个分支中进行并保存更改

6:承诺和推动


如果你使用TortoiseGit推送对话

引用来源:https://tortoisegit.org/docs/tortoisegit/tgit-dug-push.html#id692368

known changes - This allows remote repository to accept a safer non-fast-forward push. This can cause the remote repository to lose commits; use it with care. This can prevent from losing unknown changes from other people on the remote. It checks if the server branch points to the same commit as the remote-tracking branch (known changes). If yes, a force push will be performed. Otherwise it will be rejected. Since git does not have remote-tracking tags, tags cannot be overwritten using this option. This passes --force-with-lease option of git push command. unknown changes - This allows remote repository to accept an unsafe non-fast-forward push. This can cause the remote repository to lose commits; use it with care. This does not check any server commits, so it is possible to lose unknown changes on the remote. Use this option with Include Tags to overwrite tags. This passes the traditional --force option of git push command.


首先,你必须从远程获取更改,只有这样你才能推送更改,为了做到这一点,你必须写命令

git pull 

在此之后,您将发现一些冲突,解决您的冲突,然后编写命令

git push

这个修复是为我工作,给它一个尝试,我认为由于在远程上的冲突,我们无法推送代码


检查远程分支是否被锁定。


我只在自动化环境中遇到过这个问题,即Gitlab管道和Github动作,在发布期间,分支被自动合并和推送。对我来说,唯一有效的手动解决方案是创建一个具有相同更改的新分支,并在新分支上运行管道。

我还没有想出如何在Gitlab和Github管道永久修复它。


你的本地主分支:->头~N ->更新&新文件(不能推到github!)

你的github主分支:-> HEAD~N -> AheadNewCommit1 -> AheadNewCommit2…

步骤1。重置到HEAD~N

$  git reset --soft HEAD~N

step2: pull AheadNewCommit1 -> AheadNewCommit2…到您本地的主分支

$  git pull origin master

在这里,当你试图从主分支中重新建立一个dev-feature分支时(Git版本参考>> Git版本Git版本2.37.1 (Apple Git-137.1))

1.Git签出开发功能

签出特性分支

2. git拉

将报头更新为最新提交

3.Git pull -rebase origin master

设置从主回购中提取的rebase标志

4. Git配置拉。变基真 如果调和方法没有设置,因为你有2个分支 5. git拉 成功重基并更新refs/heads/dev-feature** 如果您收到上面的消息,这意味着分支已被重新基于

6. Git push origin dev-feature 将这些更改推到远程