当 head 被某人移动到新位置时如何推送到 remote master

How to push to remote master when head has moved to new position by some one

我刚开始使用 git。我克隆了主人,做了一些改变,然后提交了。我想将更改推送到远程服务器,但出现错误。

我注意到大师已经被某个人更新了(自从我上次 cloned/checkedout)。现在我无法将我的提交推送给主人。 我的新提交在一个完全不同的目录中,没有触及原始主分支中的任何代码。

我该如何解决?

你试过拉吗?如果你改的文件和远程分支改的文件不一样,Git聪明的应该能看出来

git pull

这是一个简单的图表,大致显示了您当前的情况:

remote master: A -- B -- D
local master:  A -- B -- C

您可以看到您是从克隆 master 开始的,这带来了提交 AB。然后你在此基础上提交了 C。但是其他人做出了他的提交 D 并在你之前将其推送到远程 master

这里有两个主要选项。您可以 git pull,这会将远程 master 合并到您的分支中,或者您可以 git rebase 在远程 master 上。如果您要合并 (git pull),请执行以下操作:

git pull origin master

这将使图表看起来像这样:

remote master: A -- B -- D
local master:  A -- B -- C -- M

如果您键入 git log,您将看到一个新的合并提交 M 出现在您的分支中,其中包含来自远程提交 D 的更改。您可以通过以下方式推送更改:

git push origin master

这将使图表看起来像这样:

remote master: A -- B -- D -- M'
local master:  A -- B -- C -- M

其中 M' 是您引入的远程上的不同合并提交。

您的另一个选择是 rebase 您在远程的本地分支。要变基,请执行以下操作:

git fetch origin
git rebase origin/master

git pull --rebase master

这将使图表像这样:

remote master: A -- B -- D
local master:  A -- B -- D -- C'

其中 C' 是您所做的提交,可能略有改动。现在您可以通过以下方式将您的工作推送到远程:

git push origin master

这将使图表看起来像这样:

remote master: A -- B -- D -- C'
local master:  A -- B -- D -- C'

您会注意到,如果您使用 rebase 选项,远程和本地历史记录是相同的,并且历史记录清晰易读。