我们的工作流程就是这样。我们有一个名为 dev
的分支,我可以在 origin/dev
到达。当我们进行更改时,我们会在 dev 之外创建一个分支:
git checkout -b FixForBug origin/dev
现在我有一个名为 FixForBug
的分支正在跟踪(我认为这是正确的词)origin/dev
。因此,如果我执行 git pull
,它将带来 origin/dev
的新变化,这很棒。现在,当我完成修复后,我推送到一个名为相同事物的远程分支。
首先,我从 origin/dev
中提取所有更改并进行变基:
git pull --rebase
然后我将更改推送到同名的远程分支:
git push origin FixForBug
现在,远程服务器上有一个分支,我可以创建一个拉取请求,以便批准该更改并将其合并回 dev 分支。我自己从不向origin/dev
推送任何内容。我猜这是很常见的工作流程。
我第一次执行 git push
时,它工作正常并创建了远程分支。但是,如果我推动 second 时间(假设在代码审查期间,有人指出了问题),我会收到以下错误:
错误:未能将一些引用推送到“https://github.mydomain.info/Product/product.git”提示:更新被拒绝,因为您当前分支的尖端位于其远程对应部分之后。在再次推送之前集成远程更改(例如提示:'git pull ...')。有关详细信息,请参阅“git push --help”中的“关于快进的说明”。
但是,如果我执行 git status
,它会说我领先于 origin/dev
1 次提交(这是有道理的),如果我按照提示运行 git pull
,它会说一切都是最新的。我认为这是因为我正在推送到与上游分支不同的分支。我可以通过运行来解决这个问题:
git push -f origin FixForBug
在这种情况下,它会将更改推送到远程分支,说(强制更新)并且远程分支上的一切似乎都很好。
我的问题:
为什么在这种情况下需要 -f
?通常,当您强制某事时,是因为您做错了事,或者至少违反了标准做法。我是否可以这样做,或者它会在远程分支中弄乱某些东西,或者给最终必须将我的东西合并到开发中的人造成麻烦?
git pull origin FixForBug
?好的,这是有道理的。随意添加作为答案!
develop
分支并克服了这个错误。
由于变基,实际上需要 -f
。每当您进行变基时,您都需要进行强制推送,因为远程分支无法快速转发到您的提交。您总是希望确保在 push 之前先执行 pull,但如果您不喜欢强制 push 到 master 或 dev,您可以创建一个新分支来 push 到然后合并或做PR。
*"The tip of your current branch is behind its remote counterpart"*
表示远程分支上发生了您在本地没有的更改。 Git 会告诉您从 REMOTE
导入新更改并将其与您的代码合并,然后将其 push
到远程。
您可以使用此命令强制更改具有本地存储库的服务器()。远程仓库代码将替换为您的本地仓库代码。
git push -f origin master
使用 -f
标记,您将使用本地存储库代码覆盖 远程分支代码。
git push -f
但它说一切都是最新的。还有其他想法吗?
为了确保您的本地分支 FixForBug 不在远程分支 FixForBug 之前,请在推送之前拉取并合并更改。
git pull origin FixForBug
git push origin FixForBug
设置当前分支名称,如 master:
git pull --rebase origin master git push origin master
或分支名称develop
git pull --rebase origin develop git push origin develop
如果您想避免必须使用 -f
,那么您可以只使用
git pull
代替
git pull --rebase
非变基将从 origin/dev
获取更改并将它们合并到您的 FixForBug
分支中。然后,您将能够运行
git push origin FixForBug
不使用 -f
。
-f
,因为您将上游存储库上的提交替换 提交具有不同(重新定位)历史的不同提交。如果您要使用 Gerrit 之类的产品,那么它支持这种变基代码审查工作流程,而无需在推送时使用 -f
。我们以这种方式在工作中使用 Gerrit,而且效果很好。
我们可以通过以下 cmd 使用本地存储库强制更改 GitHub:
git push -f origin main
当我遇到“更新被拒绝,因为当前分支的尖端落后”消息时,我在 Azure DevOps 中使用的命令是/是这个命令:
git pull origin master
(或者可以从一个新文件夹开始并进行克隆)...
此答案没有解决提出的问题,特别是 Keif has answered this,但它确实回答了问题的标题/标题文本,这将是 Azure DevOps 用户的常见问题。
我在 Keif 的回答中注意到评论:“您总是希望确保在推动之前先拉动”!
除了 Git 命令行工具之外,我还使用了 Git GUI 工具。
(我不确定如何在 Git GUI 中执行相当于命令行命令“git pull origin master”的操作,所以我回到命令行来执行此操作)。
下图显示了您可能想要执行的各种操作的各种 Git 命令:
https://i.stack.imgur.com/TnV5B.png
这一定是因为提交在您当前的推送之前。
git pull origin "你要推送的分支名称" git rebase 如果 git rebase 成功,那么很好。否则,您已经在本地解决了所有合并冲突并保持它继续,直到使用远程的 rebase 成功。 git rebase -- 继续
这就是我解决问题的方法:
假设上游分支是您创建的分支,origin 是您的存储库,并且您希望将 MR/PR 发送到上游分支。
假设您已经有大约四次提交,并且您将获得 Updates were rejected because the tip of your current branch is behind.
这是我所做的
首先,压缩所有四个提交:
git rebase -i HEAD~4
您将获得一个带有 pick
的提交列表(在编辑器中打开)。
例子
pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4
至
pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4
之后,您可以保存合并的提交
下一个
你需要隐藏你的提交。
就是这样:
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 合并到我的分支中。
我不知道他这样做了。
然后我在本地合并master,尝试推送,但是失败了。为什么?因为我的同事与 master 合并创建了一个我在本地没有的额外提交!
解决方案:拉下我自己的分支,以便我获得额外的提交。然后将其推回我的远程分支。
在我的分支上,我确实做到了:
git pull
git push
接下来我帮忙:
git stash
git pull origin master
git apply
git commit -m "some comment"
git push
就我而言,远程存储库已经有一个与我正在处理的 dev 分支同名的分支。我只是重命名了分支并推送了代码。它对我有用。
git checkout -b new-branch-name
git push origin new-branch-name
如果你使用 TortoiseGit 推送对话
https://i.stack.imgur.com/MwE9k.png
引用来源:https://tortoisegit.org/docs/tortoisegit/tgit-dug-push.html#id692368
已知更改 - 这允许远程存储库接受更安全的非快进推送。这可能会导致远程存储库丢失提交;小心使用它。这可以防止丢失遥控器上其他人的未知更改。它检查服务器分支是否指向与远程跟踪分支相同的提交(已知更改)。如果是,将执行强制推送。否则会被拒绝。由于 git 没有远程跟踪标签,因此无法使用此选项覆盖标签。这通过了 git push 命令的 --force-with-lease 选项。未知更改 - 这允许远程存储库接受不安全的非快进推送。这可能会导致远程存储库丢失提交;小心使用它。这不会检查任何服务器提交,因此可能会丢失远程上的未知更改。将此选项与包含标签一起使用以覆盖标签。这通过了 git push 命令的传统 --force 选项。
如果您真的担心任何其他方法,这些步骤可以帮助您轻松
1:将更改存储在要推送的本地分支中
2:将您的本地分支重命名为您未来的备份
3:从您的遥控器创建一个同名的分支,该分支将包含所有更改
4:签出这个新分支作为您的新本地分支
5:在此分支中进行并保存更改
6:提交和推送
我在尝试通过 Visual Studio Code 进行变基后推送时遇到了这个问题。我的问题是通过从 Git 输出窗口复制命令并从 Visual Studio Code 的终端窗口执行它来解决的。
在我的情况下,命令类似于:
git push origin NameOfMyBranch:NameOfMyBranch
您必须在尚未推送的提交中添加了新文件。检查文件,再次推送该文件,然后尝试拉/推。
它会起作用的。这对我有用...
如果您尝试了之前的所有答案,但问题仍然没有解决,那么请确保推送的分支名称是唯一的,并且在远程中不存在。
错误消息可能具有误导性。
推送被拒绝,因为您当前分支的尖端落后。
当我遇到这种情况时,我只是跑了:
git push -f origin main
它已经完成了。
git push -f
将覆盖上游更改,并且在技术上是正确的。大多数情况下,您希望将更改添加到现有代码中,因此您需要做的是 git fetch
获取这些更改,然后 git rebase origin/branchname
在上游重放您的更改。可能存在需要解决的合并冲突,但这样您就不会覆盖其他人的工作。
由于我尝试提交的分支是我在 master 下的子分支,因此我首先从存储库中将其删除(由于反向引用问题)。然后我用 push 重试,它又工作了!
注意:作为删除初始分支的一部分,我在即将执行的推送中进行了所有先前的更改,因此没有丢失任何代码。
这取决于权限。
您可能无权直接推送到主分支(主分支、开发分支)。如果您在企业项目中,您应该将自己的主题分支推送到其远程并提交合并请求(MR)。
首先,您必须从远程获取更改,然后才能推送更改,为此您必须编写命令
git pull
之后,你会发现一些冲突,解决你的冲突,然后编写命令
git push
此修复程序对我有用,试一试,我认为由于遥控器上的冲突,我们无法推送代码
我不知道为什么 git 不在他们的网站上说清楚
首先在不更改代码的情况下清除任何 git 提交:
git reset --soft HEAD~1
git reset --soft HEAD~2
etc
如果 git pull 没有解决问题,创建一个分支并切换到它。这将是您的第一次推送,您需要使用单独的分支...
git checkout -b tempbranch
“结帐”将创建临时分支。使用“git status”查看你是否在 tempbranch
确保你要推到正确的地方......
git remote add origin https://github.com/user/examplerepo.git
git remote set-url origin https://github.com/user/examplerepo.git
在 tempranch 上工作,然后添加新文件或文件夹,虽然你在一个单独的分支上,但文件夹结构与 master 默认分支相同。所以添加....
git add file.txt
添加文件后,现在在声明区域。在这里,您可以使用 git status 查看准备提交的内容。那么你可以提交:
git commit -m "Put some print statements" file.txt
现在文件是本地仓库,你不会使用“git status”看到它。但是您可以使用“git log”和“git ls-files”查看已提交文件的列表
由于这是您第一次推送到原点....
git push -u origin tempbranch
下次你可以只在 master 分支上工作,这样你就可以切换到它
git checkout master
您也可以查看此链接了解更多信息https://practicalgit.com/blog/do-you-always-need-u-in-push.html
不定期副业成功案例分享
git push -f
但它说一切都是最新的。还有其他想法吗?Sorry, force-pushing to main is not allowed