Git merge报告“已经最新”,尽管有所不同


286

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

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

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

如果我做:

git checkout主
git diff测试

出现变化的屏幕,显示差异。我想合并测试分支中的更改,然后这样做:

git合并测试

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

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

这是什么问题,我该如何解决?


您有未提交的修改后的代码吗?
ozma

Answers:


146

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

用于gitk查看您的存储库。“测试”分支的标签应位于“主”分支标签下方的某处。

您的分支机构相对于其父分支是最新的。根据合并,自上次合并以来,父项中没有新的更改。这并不意味着分支是相同的,因为您可以在工作分支中进行很多更改,听起来就像您所做的那样。

编辑10/12/2019:

根据Charles Drake在对此答案的评论中,解决该问题的一种解决方案是:

git checkout master
git reset --hard test

这使它回到“测试”级别。

然后做:

git push --force origin master

为了迫使更改返回中央仓库。


2
神圣的cr * p!你是对的!我认为发生的事情是另一个分支(不稳定的开发)被错误地与master合并,而test分支是不稳定的子集。我试图进行的合并是使主服务器回到“测试”级别。
查尔斯·达克

2
对。该操作没有任何意义,因此Git拒绝执行任何操作。:)
孟买,2009年

24
我现在要做的是:git checkout master; git reset-硬测试; 这使它回到“测试”级别。然后,我做了一个“ git push --force origin master”,将更改强制返回到中央存储库。
查尔斯·达克

22
如果git有警告说“试图与父级合并”,那就太好了。
查尔斯·达克

1
推送不属于远程已存在分支的后代的分支被认为是一件坏事:请参见手册页上有关git-push和git-pull的讨论。
孟买

131

当我知道远程主服务器上有更改时,通常会发生这种情况,因此我尝试使用进行合并git merge master。但是,这不会与远程主服务器合并,而是与您的本地主服务器合并。

因此,在进行合并之前,请先检出母版,然后再进行git pull那里。然后,您将能够将新更改合并到您的分支中。


7
有没有一种方法可以避免分支的切换,比如在仍然要合并到分支中然后合并的情况下对要合并的分支进行拉动?
Japheth Ongeri-inkalimeva '16

啊,很好。我以为git fetch即使我现在在另一个分支上,也会更新master分支。事实并非如此。谢谢!我很确定有一个选项fetch可以让您指定要获取的分支。
Raik

1
@Raik您可以这样做git fetch --all,但这只会获取分支,而不会提取它们。
IngoBürk'17

6
@ JaphethOngeri-inkalimeva您可以做git fetch --all && git merge origin/master。无需更新本地master以合并远程更改。
IngoBürk'17

@IngoBürk我有2个分支,分别用更新了1 git merge mastergit merge origin/master。我也已经签出mastergit pull更新2个分支之前。即使它们共享相同的内容,但在两个分支之间创建PR仍显示了一些差异文件。我git pull将目标分支固定为功能分支,该分支显示:Already up to date! Merge made by the 'recursive' strategy.这导致合并提交没有更改,但从PR中删除了意外的diff文件。任何想法为什么合并“等效”本地分支和远程分支之间会有区别?
wrapperapps

45

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

A -- B -- C -- D

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


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

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

当您要合并的分支的HEAD是您要合并的分支的提交链的父级时,将显示“已经更新”消息。是这样,这里D是:的父项E

test到没有要合并的内容master,因为从那以后没有任何变化master。您在这里要做的实际上是告诉Git master的头指向H,因此master的分支具有以下提交历史记录:

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

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

git reset --hard H

3
过去我被告知,使用git reset --hard是一件很艰巨的事情,它会丢失提交吗?有进行这些更改的更安全方法,还是git reset --hard夸大其词的危险?
Graham R. Armstrong

1
这个命令是理智的,不用担心。我要说的是,该--hard选项唯一要注意的是它实际上会修改您的工作目录,因此,您将丢失未提交的更改。就个人而言,我git status在每个手动运行的git命令之前和之后都要执行一次操作,以确保我的存储库是干净的或处于预期状态。
Marek Stanley

这将产生“您的分支机构和'来源/主机构'已分开”状态消息,我该如何解决?
Eido95年

1
希望我能给您多个赞成票。谢谢!
KMC

是否需要该--hard选项?我现在已经遇到过这种情况了两次,并且始终不进行重置--hard。它工作得很好,没有丢失任何未提交的更改的风险。
卡西米尔

16

对我有用的是,假设您有branch1,并且想要将其合并到branch2。

您打开git命令行转到branch2的根文件夹,然后键入:

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

如果您有冲突,则无需执行git push,但首先要解决冲突,然后再进行推送。


6

合并总是在当前HEAD与一个或多个提交(通常是分支头或标签)之间进行,
并且索引文件在启动时必须与HEAD提交树(即最后一次提交的内容)相匹配。
换句话说,git diff --cached HEAD必须报告无变化。

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

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


6

发生这种情况是因为您要合并的分支的本地副本已过期。我有我的分支机构,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检查分支是否过时,并使用uh来获取所有更改(如果有的话)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.

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


5

这发生在我身上,是因为奇怪的是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>

这与阿卡特的答案不完全相同吗?
安德鲁C

我认为Acarter实际上错了重点-遥控器上没有任何更改-根本不是问题。我需要先进行“ git checkout master”,然后再进行“ git merge <branch_name>”,以强制进行快速合并。相反,由于分支先于master,所以什么也没做。Bombe的回答是一个很好的解释,但从未回答问题的“我该如何解决”这一部分。
MrMas

5

git merge origin/master而是git merge master为我工作。因此,要将master合并到功能分支中,可以使用:

git checkout feature_branch
git merge origin/master

5

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

然后签出回到要进行合并的分支,并且git merge应该可以正常工作。


1
对我来说就是这样-我在高手时做过一次拉扯;知道我在“分支”中有了新的提交。试图将“分支”合并到母版中-“已更新”。git checkout“ branch”-获得了“您的分支在后面...并且可以快速转发。”,这意味着我需要通过git pull在“ branch”中运行来更新“ branch”
sdbbs

3

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

因此,我之前进行了合并,但是在合并过程中我有意排除了一些特定的更改,因此显然分支之间存在一些差异。然后,我尝试重新合并它,因为我意识到/忘记了我应该拥有的,并想添加一个以前不包含的特定更改/文件,并且希望再次进行合并将显示之前排除的所有更改。 ,但我错了,而是收到了“已经最新”消息。

阅读@Bombe的评论/答案后,他是对的,我认为git就是这种行为,所以我要做的是对test分支上的文件进行硬备份,然后检出master分支并手动将文件粘贴到其中并提交好像是新的变化。

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


同样的情况。场景是我想将“集成”分支拆分回多个“功能”分支。
Yadli

2
您可以直接将文件从一个分支签出到当前分支:中,而不必手动粘贴git checkout srcBranch -- path/to/file。也可以使用文件全局。
Todd

谢谢,我用的验证方法,但我把checkout srcBranch -- *,然后看了看我的diff文件
portforwardpodcast

2

如果将分支机构A合并到分支机构B时报告“已经更新”,则反向并不总是正确的。仅当分支B是分支A的后代时才是正确的,否则分支B可以简单地进行不在A中的更改。

例:

  1. 您在主节点上创建分支A和B
  2. 您在master中进行一些更改,并将这些更改仅合并到分支B中(而不是更新或忘记更新分支A)。
  3. 您在分支A中进行一些更改,然后将A合并到B。

此时,将A合并到B会报告“已经更新”,但是分支是不同的,因为分支B具有来自主服务器的更新,而分支A没有。


2

使用Git Bash面对这种情况。

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

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

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

git pull起源

奇怪的是,这并没有从所有分支中提取所有提交。曾以为如此,所以所显示的几乎显示了所有分支和标签。

因此,要解决此问题,请检查出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 :)


0

我也一样。但是情况有所不同,我有master分支,然后从中剔除了release_1(例如)。在release_1分支中进行了一些更改,并将其合并为原始文件。然后我做了ssh,然后在远程服务器上我再次使用命令git checkout -b release_1签出release_1,实际上是切出了一个新的分支release_!而不是从原始数据库中检出已经存在的分支release_1。通过删除“ -b”开关解决了该问题



0

愚蠢但可能会发生。假设您#91-fix-html-markup执行此合并,则您的分支名称以问题参考作为前缀(例如):

$ git merge #91-fix-html-markup

它不会按预期工作,因为后面的所有内容都会#被忽略,因为会#启动内联注释。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.