我有一个包含2个分支的git存储库:master和test。
主分支和测试分支之间存在差异。
两个分支都已提交所有更改。
如果我这样做:
git checkout master
git diff test
显示充满变化的屏幕,显示差异。我想合并测试分支中的更改,所以:
git merge test
但是收到消息“已经是最新的”
然而,检查每个不同分支下的文件清楚地显示了差异。
这里有什么问题,如何解决?
答案 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是要合并的分支的提交链的父级时,会显示“已经是最新的”消息。
在这种情况下,D
是E
的父级。
从test
到master
无法合并,因为此后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中的变化。
示例:
此时合并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 分支的合并成功了。