我们的工作流程就是这样。我们有一个叫做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 ?通常当你强迫做某事时,那是因为你做错了某事,或者至少违反了标准做法。我是否可以这样做,或者它是否会在远程分支中搞砸一些东西,或者为最终必须将我的东西合并到开发中的人制造麻烦?


当前回答

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

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

步骤1。重置到HEAD~N

$  git reset --soft HEAD~N

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

$  git pull origin master

其他回答

我是这样解决问题的:

让我们假设上游分支是您派生的分支,原点是您的存储库,您想要向上游分支发送一个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

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

git pull origin master

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

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

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

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

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

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

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

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

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

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

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

git push origin NameOfMyBranch:NameOfMyBranch