我有一个git仓库,有2个分支:master和test。

主分支和测试分支之间存在差异。

两个分支都提交了所有更改。

如果我这样做:

git checkout master
git diff test

屏幕上会出现一个充满变化的屏幕,显示不同之处。我想合并测试分支中的更改,这样做:

git merge test

但是得到的信息是"Already - updated "

但是,检查每个不同分支下的文件可以清楚地显示出差异。

这里的问题是什么,我如何解决它?


当前回答

这种情况发生在我身上,因为GIT奇怪地认为本地分支与远程分支不同。 这在分支图中可见:它显示了两个不同的分支:remotes/origin/branch_name和branch_name。

解决方案是简单地删除本地回购并从远程重新克隆它。这样GIT就会理解remotes/origin/branch_name>和branch_name确实是相同的,并且我可以发出GIT合并branch_name。

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>

其他回答

Git merge origin/master而不是Git merge master为我工作。所以要合并master到feature分支,你可以使用:

git checkout feature_branch
git merge origin/master

同样的事情也发生在我身上。 但是这个场景有点不同,我有一个master分支,我从它中分离出release_1(比如说)。 在release_1分支中做了一些更改,并将其合并到origin中。然后我在远程服务器上使用ssh 我再次使用命令git checkout -b release_1签出release_1,这实际上是一个新的分支release_!而不是从origin签出已经存在的分支release_1。 通过移除“-b”开关解决了问题

“已经是最新的”消息意味着您试图合并的分支的所有更改都已经合并到您当前所在的分支。更具体地说,它意味着您试图合并的分支是当前分支的父分支。恭喜你,这是你做过的最简单的合并。:)

使用gitk查看您的存储库。“test”分支的标签应该在“master”分支标签的下方。

您的分支相对于其父分支是最新的。根据合并,自上次合并以来父节点中没有新的变化。这并不意味着分支是相同的,因为您可以在工作分支中进行大量更改,而且听起来确实如此。

编辑10/12/2019:

根据Charles Drake对这个答案的评论,解决这个问题的一个解决方案是:

git checkout master
git reset --hard test

这又回到了“测试”层面。

然后做:

git push --force origin master

为了迫使中央回购的变化。

假设你有一个具有以下提交历史的分支master:

A -- B -- C -- D

现在,你创建了一个分支测试,处理它,并执行4次提交:


                 E -- F -- G -- H
                /
A -- B -- C -- D

主人的头指向D,测试者的头指向H。

当你要合并的分支的HEAD是你想要合并的分支的提交链的父节点时,就会显示“Already - updated”消息。 这里的情况就是这样:D是E的父结点。

从测试到主服务器没有什么需要合并的,因为从那时起主服务器上没有任何变化。 你在这里要做的就是告诉Git让master的head指向H,所以master的分支有如下的提交历史:

A -- B -- C -- D -- E -- F -- G -- H

这是一个Git命令重置的作业。 你也想让工作目录反映这个变化,所以你要做一个硬重置:

git reset --hard H

尝试以下命令

git checkout master
git pull
git fetch --all
git rebase --abort

git checkout test
git pull
git reset --hard  
git merge origin master

大多与重基或已采取合并分支有影子历史,与清除或重置分支 将有助于在文件中合并东西。