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


当前回答

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

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

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

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

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

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

6:承诺和推动

其他回答

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

git pull 

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

git push

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

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

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

这取决于权限。

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

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

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

git push -f origin master

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

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

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