Git合并报告“已经更新”;尽管有区别

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

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

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

如果我这样做:

git checkout master
git diff test

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

git merge test

But get the message "Already up-to-date"

However, examining files under each different branch clearly shows differences.

What's the problem here and how do I resolve it?

348937 次浏览

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

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

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

编辑10/12/2019:

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

git checkout master
git reset --hard test

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

然后做:

git push --force origin master

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

merge总是在当前HEAD和一个或多个提交(通常是分支头或标签)之间,
并且索引文件必须在开始时匹配HEAD提交树(即上次提交的内容) 换句话说,git diff --cached HEAD必须报告没有变化。< / p >

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

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

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

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

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

解决了这个问题

假设你有一个分支master,其提交历史如下:

A -- B -- C -- D

Now, you create a branch test, work on it, and do 4 commits:


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

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

当你要合并的分支的HEAD是你想要合并的分支的提交链的父节点时,就会显示"Already - updated "消息。 这里的情况就是这样:DE的父类 没有东西要从test合并到master,因为从那时起master上没有任何变化。 你在这里要做的就是告诉Git让master的头指向H,这样master的分支就有如下的提交历史:

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

This is a job for Git command reset. You also want the working directory to reflect this change, so you'll do a hard reset:

git reset --hard H
如果将分支A合并到分支B报告“Already up to date”,则相反并不总是正确的。只有当分支B是分支A的后代时才成立,否则 分支B可以有a中没有的变化

例子:

  1. 在master上创建分支A和B
  2. 您在master中做了一些更改,并只将这些更改合并到分支B中(不更新或忘记更新分支A)。
  3. 你在分支A中做了一些改变,并将A合并到B。

在这一点上,合并A到B报告“已经更新”,但分支是不同的,因为分支B有来自主的更新,而分支A没有。

使用Git Bash面对这个场景。

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

的父类

Old_Branch更新了一些更改,需要与New_Branch合并

正在使用下面的拉命令,没有任何分支,从所有分支获得所有来源。

Git拉源

奇怪的是,这并没有从所有分支中拉出所有的提交。曾经认为它正如所示显示几乎所有的分支和标签。

所以要解决这个问题,已经检查出Old_Branch拉了最新的使用

git checkout Old_Branch

git拉原点Old_Branch

现在查看New_Branch

git checkout New_Branch

拉了一下,确认一下

git拉原点New_Branch

git合并Old_Branch

viola得到了从Old_Branch到New_Branch的冲突来修复:),这是预期的

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

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

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

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

这对我来说很有效。假设你有branch1,你想把它合并到branch2中。

你打开git命令行,进入branch2的根文件夹,输入:

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

如果有冲突,在git push之前解决它们。

发生这种情况是因为您要合并的分支的本地副本已经过期。我有我的分支,名为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.

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

我用git merge origin/master代替git merge master。所以要合并master到feature分支,你可以使用:

git checkout feature_branch
git merge origin/master

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

然后签出到你想要合并的分支,你的git合并应该可以工作。

我也有同样的问题。我在遥控器上做了修改,它仍然显示“已经更新”。重新克隆存储库为我解决了这个问题。

这很傻,但可能会发生。假设你的分支名称前缀是一个问题引用(例如#91-fix-html-markup),如果你这样合并:

$ git merge #91-fix-html-markup

它不会像预期的那样工作,因为#之后的所有内容都会被忽略,因为#开始了一个内联注释。

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

我在当前分支中提交了更改,然后来自Origin分支的合并工作正常。

我已经修复了这样的问题,重新基于当前的分支本身。

我不确定在我的情况下到底是什么问题,但问题的根源似乎是branchB检查出来,我无法从branchA中提取最新的更改…

我必须签出branchApull,然后checkout branchBmerge branchA,让它像预期的那样工作。

尝试以下命令

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


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

大多数与rebase或已经采取合并分支有影子历史,与清除或重置分支

嗨,我已经创建了一个git别名,我称之为git remerge,这有助于解决这个问题。

  1. 它将首先git merge <FEATURE-BRANCH-NAME>
  2. 然后将强制重新计算分支之间不同文件的所有冲突。

你可以使用它这里!< / >

如果你有任何建议,或者你想为这个项目做出贡献,欢迎你!

这可能看起来微不足道,但我看到许多人错过了它,而只是在父分支上执行git merge。这将自动生成< >强“已经up-to-date" < / >强消息。

合并命令应该是git merge branchNametoMergeFrom

例如,假设你有2个分支branchA &你需要先checkout to BranchA,然后使用merge命令,同时指定要合并的分支(在这种情况下是branchB)。

因此,命令应该是git merge,而应该是 git merge branchB

我有一种重新合并它的方法,我的场景是我需要合并一个发布分支。

条件:发布分支代码是金的。意思是master是不正确的而release分支是正确的。

现象:将发布版本合并到主版本时,主版本中不正确的部件没有与发布版本中的部件一起更新。

以下是步骤,免责声明:我对git的了解有限,一定有更好的方法来实现它。

  1. 结帐释放分支,做拉。(提交#)
  2. 合并最新的master以发布[提交#B](错误的文件将写入发布分支)
  3. 对[commit #B]进行反向提交,但将其保持在阶段(如果保留提交作为[commit #C]提交,则进行软重置到commit #B)(这本质上逆转了不正确的文件)
  4. 编辑文件,检查是否正确,丢弃不需要的文件(如果有)
  5. 在第4步[stash {X}]中保存更改
  6. 重置释放回提交#A(与远程相同)
  7. 合并最新的master以再次发布[提交#D] (diff哈希应该相同,但提交哈希不同于b)
  8. 应用stash {x}
  9. 提交并合并到master。

编辑:第9步可以发生在本地,只是看看预期的部分是否已应用,如果你碰巧不得不使用一个公关在远程。

下面是不管合并历史如何从另一个分支获取更改的方法(小心:这将清除工作树,因此Git隐藏或提交更改之前尝试这个)

// stash changes to ensure you don't lose any edits
git checkout your-branch-that-won't-simply-merge
git stash




git checkout branch-with-changes -- .

——。参数将检出其他分支的所有文件,同时仍检出到同一分支。然后您可以按照自己的意愿添加和提交。

我也使用这个与 git add -p 这将使你能够在“大块”的任何变化;它会问y/n你是否想要上演任何发生变化的行块,这意味着你可以在下次提交时保留不想要的变化

这是我找到的原始答案的链接,去点赞吧。: https://stackoverflow.com/a/15536640/8272035

< p > 89问题 .:

git checkout other-branch-name -- .

这个操作类似于切换HEAD到另一个分支而不签出文件,但只是从“其他方向”。

正如@김민준提到的,这将覆盖任何未提交的更改。如果需要的话,记得先把它们藏起来或交给某个地方。”由@Kache