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

Git merge reports “Already up-to-date” though there is a difference

我有一个Git存储库,有两个分支:master和test。

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

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

如果我这样做:

1
2
git checkout master
git diff test

出现一个充满变化的屏幕,显示差异。我要合并测试分支中的更改,因此执行以下操作:

1
git merge test

但要知道"已经是最新的"

但是,检查每个不同分支下的文件明显显示出差异。

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


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

使用gitk查看存储库。"测试"分支的标签应该在"主"分支标签的下面。

你的分支机构与它的母公司是最新的。根据合并,自上次合并以来,父级中没有新的更改。这并不意味着分支是相同的,因为你可以在你的工作分支中有很多变化,听起来就像你做的一样。


当我知道远程主机上有更改时,经常会发生这种情况,因此我尝试使用git merge master合并它们。但是,这不会与远程主机合并,而是与本地主机合并。

所以在进行合并之前,先签出master,然后在那里执行git pull。然后您将能够将新的更改合并到您的分支中。


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

1
A -- B -- C -- D

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

1
2
3
                 E -- F -- G -- H
                /
A -- B -- C -- D

master的头指向d,test的头指向h。

当要合并的分支的负责人是要合并的分支提交链的父级时,将显示"已更新"消息。就是这样,这里:DE的父母。

testmaster没有什么可合并的,因为从那时起master没有任何变化。你在这里要做的就是告诉Git让master的头指向H,所以师父的分支机构有以下承诺历史:

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

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

1
git reset --hard H


对我有用的是,假设你有一个分支1,你想把它合并成一个分支2。

打开git命令行,转到Branch2的根文件夹并键入:

1
2
3
4
5
git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

如果你有交感,你不需要做git push,但首先解决冲突,然后push。


A merge is always between the current HEAD and one or more commits (usually, branch head or tag),
and the index file must match the tree of HEAD commit (i.e. the contents of the last commit) when it starts out.
In other words, git diff --cached HEAD must report no changes.

The merged commit is already contained in HEAD. This is the simplest case, called"Already up-to-date."

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


这是因为要合并的分支的本地副本已过期。我有一个分支叫MyBranch,我想把它合并到ProjectMaster中。

1
2
3
4
5
6
7
8
_>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获取任何更改。然后我跳到我想合并的分支,看看那里发生了什么…

1
2
3
4
5
6
_>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次,这解释了一切!现在,我将丢失的更改记录下来,然后跳到MyBranch并再次尝试合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
_>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.

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


这发生在我身上是因为奇怪的是Git认为本地分支与远程分支不同。这在分支图中可见:它显示了两个不同的分支:远程/源/分支名称和分支名称。

解决方案只是删除本地repo并从远程重新克隆它。这样,Git就可以理解远程/源/分支名称>和分支名称确实是相同的,我可以发布git merge branch_name

1
2
3
4
5
6
7
rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>


以东十一〔6〕相反,以东十一〔7〕为我工作。因此,要将主控形状合并到功能分支,可以使用:

1
2
git checkout feature_branch
git merge origin/master

我不知道我是否有同样的场景,而是我试图"重新合并"那个"测试"分支。

所以我以前合并过它,但在合并过程中我故意排除了一些特定的更改,所以很明显它在分支之间有一些不同。我当时正试图重新合并它,因为我意识到/忘记了我应该并且想要添加一个我以前排除的特定更改/文件,我希望如果我再次进行合并,将显示我以前排除的所有更改,但我错了,我收到了"已经是最新的"消息斯特德

在阅读了@bombe的评论/答案后,他是对的,我认为Git的行为就是这样的,所以我所做的就是在测试分支上对文件进行硬备份,然后签出主分支并手动粘贴其中的文件,然后像提交新的更改一样提交它。

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


确保先签出要合并的分支,然后将其拉出来(这样本地版本与远程版本匹配)。

然后签回要进行合并的分支,您的Git合并就可以工作了。


使用Git-Bash面对这种情况。

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

旧的_分支被更新为需要与新的_分支合并的一些更改

正在使用不带任何分支的下面的pull命令从所有分支获取所有源。

git pull origin

奇怪的是,这并不能从所有分支中提取所有的提交。已经考虑过了,因为指示显示了几乎所有的分支和标签。

所以为了解决这个问题,老分支使用了

git checkout Old_Branch

git pull origin Old_Branch

现在签出了新的分支机构

git checkout New_Branch

一定要拉着

git pull origin New_Branch

git merge Old_Branch

维奥拉从旧的分支机构到新的分支机构都有冲突需要解决,这是意料之中的。


如果将分支A合并为分支B报告"已经是最新的",则反向并不总是正确的。只有当分支B是分支A的后代时才是这样,否则分支B可以有不在A中的更改。

例子:

  • 在master上创建分支A和分支B
  • 您在master中做了一些更改,并且只将这些更改合并到branch b中(不更新或忘记更新branch a)。
  • 您在分支A中做了一些更改,并将A合并到B。
  • 此时,合并A到B报告"已经是最新的",但是分支是不同的,因为分支B有来自主服务器的更新,而分支A没有。


    我也有同样的问题。我在遥控器上做了一些改动,它仍然显示"已经更新了"。重新打开存储库为我解决了这个问题。


    我也一样。但情况有点不同,我有主分支,我从中刻出了版本1(比如说)。在版本1分支中做了一些更改,并将其合并到了原始版本中。然后我在远程服务器上执行ssh和我再次使用命令git checkout-b release_1签出释放_1,这实际上是一个新的分支释放_uuu!从主版本而不是从源版本签出已经存在的分支版本"1"。通过拆除"-B"开关解决了这个问题