尽管存在差异,Git合并报告“已经是最新的”

时间:2009-03-11 13:36:54

标签: git merge

我有一个包含2个分支的git存储库:master和test。

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

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

如果我这样做:

git checkout master
git diff test

显示充满变化的屏幕,显示差异。我想合并测试分支中的更改,所以:

git merge test

但是收到消息“已经是最新的”

然而,检查每个不同分支下的文件清楚地显示了差异。

这里有什么问题,如何解决?

16 个答案:

答案 0 :(得分:117)

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

使用gitk查看您的存储库。 “test”分支的标签应位于“master”分支标签下方的某处。

您的分支机构与其父母的最新信息是最新的。根据合并,自上次合并以来,父母没有新的变化。这并不意味着分支是相同的,因为你的工作分支可以有很多变化,听起来就像你一样。

答案 1 :(得分:108)

当我知道远程主服务器上有更改时,这经常发生在我身上,因此我尝试使用git merge master合并它们。但是,这不会与远程主服务器合并,而是与您的本地主服务器合并。

所以在进行合并之前,请先检查主人,然后再git pull。然后,您将能够将新更改合并到您的分支中。

答案 2 :(得分:34)

假设您的分支master具有以下提交历史记录:

A -- B -- C -- D

现在,您创建一个分支测试,对其进行处理,并执行4次提交:


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

master的头部指向D,而test的头部指向H.

当您要合并的分支的HEAD是要合并的分支的提交链的父级时,会显示“已经是最新的”消息。 在这种情况下,DE的父级。

testmaster无法合并,因为此后master上没有任何变化。 你想要做的就是告诉Git让master指向H,所以master的分支有以下提交历史:

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

这是Git命令 reset 的工作。 您还希望工作目录能够反映此更改,因此您将执行 hard 重置:

git reset --hard H

答案 3 :(得分:6)

  

合并始终在当前HEAD和一个或多个提交之间(通常是分支头或标记),
  并且索引文件在开始时必须与HEAD提交树(即最后一次提交的内容)匹配   换句话说,git diff --cached HEAD必须报告无更改。

     

合并提交已包含在HEAD中。这是最简单的情况,称为“已经是最新的。”

这应该意味着测试中的提交已经在master中合并,但由于其他提交是在master上完成的,git diff test仍会产生一些差异。

答案 4 :(得分:6)

什么对我有用,假设你有branch1,你想把它合并到branch2。

你打开git命令行转到branch2的根文件夹并输入:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

如果你有冲突你不需要做git push,但先解决conflits然后再推。

答案 5 :(得分:5)

这是因为您要合并的分支的本地副本已过期。我有我的分支,名为MyBranch,我想将其合并到ProjectMaster

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

我知道有需要合并的更改!

这就是问题,当我输入git merge ProjectMaster时,git会查看此分支的本地副本,这可能不是最新的。要查看是否是这种情况,我首先告诉Git检查并查看我的分支是否已过期并获取任何更改,如果是这样,使用,嗯,fetch。然后我跳进我要合并的分支,看看那里发生了什么......

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

阿公顷!我的本地副本已经过了85次提交,这解释了一切!现在,我Pull了解我失踪的更改,然后跳到MyBranch并再次尝试合并。

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

现在我还有另一个问题要解决......

答案 6 :(得分:4)

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

解决方案只是删除本地仓库并从远程重新克隆它。这样GIT就会明白,remotes / origin / branch_name>和branch_name确实是一样的,我可以发出git merge 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>

答案 7 :(得分:3)

发生在我身上并被发送到此页面,不确定我是否有相同的情况,但我的是我试图“重新合并”该“测试”分支。

所以我之前合并了它,但我故意在合并期间排除了一些特定的更改,所以它显然在分支之间存在一些差异。然后我试图重新合并它,因为我意识到/忘记我应该拥有并想要添加我之前排除的特定更改/文件,我希望如果我再次合并将显示我之前排除的所有更改,但我错了,我得到了“已经是最新的”消息。

在阅读@Bombe的评论/回答时,他是对的,我觉得git的行为就是这样,所以我做的是在测试分支上对文件进行硬备份,然后检查主分支并手动粘贴文件它并将其提交为好像是新的更改。

我不确定这是否是正确的方法,或者可以帮助其他人解决同样的问题,但它确实为我的特定情况提供了解决方案。

答案 8 :(得分:2)

如果将分支A合并到分支B报告“已经是最新的”,则反转并非总是如此。只有当分支B是分支A的后代时才是如此,否则 分支B只能有不在A中的变化。

示例:

  1. 您可以创建主分支A和B
  2. 您在master中进行了一些更改,并仅将这些更改合并到分支B中(不更新或忘记更新分支A)。
  3. 您在分支A中进行了一些更改,并将A合并到B.
  4. 此时合并A到B报告“已经是最新的”但分支是不同的,因为分支B具有来自主服务器的更新而分支A不具有。

答案 9 :(得分:2)

使用Git Bash面对这种情况。

我们的存储库有多个分支,每个分支都有不同的提交周期,并且偶尔会发生一次合并。 Old_Branch用作New_Branch的父级

Old_Branch已更新,其中包含一些需要与New_Branch合并的更改

使用下面没有任何分支的pull命令来获取所有分支的所有来源。

  

git pull origin

奇怪的是,这并没有从所有分支中提取所有提交。我想是这样,因为指示显示几乎所有的分支和标签。

所以要解决这个问题已经检查出Old_Branch使用

拉出了最新版本
  

git checkout Old_Branch

     

git pull origin Old_Branch

现在检查了New_Branch

  

git checkout New_Branch

拉扯它确定

  

git pull origin New_Branch

     

git merge Old_Branch

并且中提琴从Old_Branch到New_Branch修复了冲突,这是预期的

答案 10 :(得分:2)

git merge origin/master代替git merge master为我工作。因此,可以将master合并到功能分支中:

git checkout feature_branch
git merge origin/master

答案 11 :(得分:1)

请确保先签出要合并的分支,然后再将其拉出(以便您的本地版本与远程版本匹配)。

然后结帐回到要进行合并的分支,并且git合并应该可以工作。

答案 12 :(得分:0)

同样的事发生在我身上。 但是场景有点不同,我有一个主分支,我把release_1(比如说)分出来了。 在release_1分支中进行了一些更改并将其合并为origin。然后我做了ssh并在远程服务器上 我再次使用git checkout -b release_1命令检出release_1 - 它实际上创建了一个新的分支release_!来自主服务器,而不是从原产地检出已存在的分支release_1。 通过删除“-b”开关

解决了这个问题

答案 13 :(得分:0)

我有同样的问题。我在遥控器上进行了更改,但仍显示“已经更新”。重新存储库为我解决了这个问题。

答案 14 :(得分:0)

傻,但是有可能发生。假设您执行此合并,则您的分支名称前面带有问题参考(例如#91-fix-html-markup

$ git merge #91-fix-html-markup

由于#之后的所有内容都将被忽略,因为#会开始内联注释,因此它将无法正常工作。

在这种情况下,您可以重命名分支而省略#或使用单引号将分支名称包围:git merge '#91-fix-html-markup'

答案 15 :(得分:0)

我在当前分支中提交了更改,然后来自 Origin 分支的合并成功了。