Git合并报告“已经是最新的”,虽然有差异
我有一个2分支的git仓库:主和testing。
主站和testing分支之间有区别。
两个分支都承诺全部变更。
如果我做:
git checkout master
git difftesting
出现一个充满变化的屏幕,显示不同之处。 我想合并testing分支中的更改,所以:
混帐testing
但是得到消息“已经是最新的”
但是,检查每个不同分支下的文件清楚地显示了差异。
这里有什么问题,我该如何解决?
“已经最新”消息表示来自您要合并的分支的所有更改已经合并到您当前所在的分支。 更具体地说,这意味着你正在尝试合并的分支是你当前分支的父项 。 恭喜,这是你做过的最简单的合并。 🙂
使用gitk
来看看你的仓库。 “testing”分支的标签应位于“主”分支标签下面的某处。
您的分支关于其父母是最新的。 根据合并,自上次合并以来,父项没有新的更改。 这并不意味着分支是相同的,因为你的工作分支可以有很多变化,听起来就像你一样。
这经常发生在我知道远程主服务器上有更改时,所以我尝试使用git merge master
来合并它们。 但是,这不会与远程主服务器合并,而是与您的本地主服务器合并。
所以在做合并之前,签出master,然后git pull
那里。 然后,您将能够将新的更改合并到您的分支。
假设你有一个具有以下提交历史logging的分支master
:
A -- B -- C -- D
现在,你创build一个分支testing,在它上面做,并做4个提交:
E -- F -- G -- H / A -- B -- C -- D
master
的头指向D, test
的头指向H.
当您正在合并的分支的HEAD是您要合并的分支的提交链的父级时,显示“已经最新”消息。 情况就是如此: D
是E
的父母。
从test
到master
从没有任何东西可以合并,因为从那时起主板上没有任何变化。 你想在这里做的是从字面上告诉Git有master
的头指向H,所以主人的分支有以下的提交历史:
A -- B -- C -- D -- E -- F -- G -- H
这是Git命令reset
。 你也希望工作目录反映这个改变,所以你会做一个硬重置:
git reset --hard H
合并总是在当前HEAD和一个或多个提交(通常是分支头或标签)之间,
并且索引文件在启动时必须与HEAD提交的树(即最后提交的内容)匹配。
换句话说,git diff --cached HEAD
必须报告没有改变。合并的提交已经包含在
HEAD
。 这是最简单的情况,称为“已经最新”。
这应该意味着testing中的提交已经在master中合并了,但是由于其他提交是在master上完成的,所以git diff test
仍然会有一些差异。
这发生在我身上,因为奇怪的GIT认为本地分支不同于远程分支。 这在分支图中是可见的:它显示了两个不同的分支:远程/原始/分支名称和分支名称。
解决方法是简单地删除本地回购,并从远程重新克隆它。 这样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>
如果将分支A合并到分支B中报告“已经最新”,则反向并不总是如此。 只有分支B是分支A的后代才是真实的,否则分支B只能有不属于A的变化。
例:
- 您创build主分支A和B
- 您在主服务器上进行了一些更改,并将这些更改合并到分支B(不更新或忘记更新分支A)。
- 您在分支A中进行一些更改并将A合并到B.
在这一点上,合并A到B报告“已经最新”,但分支是不同的,因为分支B有主从更新,而分支A没有。
发生在我身上,并被发送到这个页面,不知道如果我有相同的情况,但我是我试图“重新合并”,“testing”分支。
所以我之前合并了它,但是我故意排除了合并期间的一些特定变化,所以显然在分支之间有一些差异。 我当时正在尝试重新合并它,因为我意识到/忘记了我应该有,并希望添加一个我以前排除的特定更改/文件,我希望如果我再次合并将显示所有我以前排除的更改,但是我错了,而我却得到了“已经是最新”的消息。
在阅读@ Bombe的评论/回答时,他是对的,我认为git的行为是这样的,所以我做了testing分支上的文件的硬备份,然后签出master分支并手动粘贴文件并提交仿佛是新的变化。
我不确定这是否是正确的方式,或者可以帮助其他人有这个相同的问题,但它确实为我的具体情况提供了解决scheme。
面对这种情况下使用Git Bash。
我们的仓库有多个分支,每个分支有一个不同的提交周期,偶尔发生一次合并。 Old_Branch被用作New_Branch的父项
Old_Branch更新了一些需要与New_Branch合并的更改
正在使用下面的拉命令没有任何分支来获取所有分支机构的所有来源。
git拉来源
奇怪的是,这并没有把所有的分支提交。 曾经想过,所以显示几乎所有的分行和标签。
所以要解决这个已经检查出Old_Branch拉最新使用
git checkout Old_Branch
git pull起源Old_Branch
现在检查了New_Branch
git checkout New_Branch
拉它肯定
git pull起源New_Branch
git合并Old_Branch
中提琴从Old_Branch到New_Branch :)有冲突
同样的事情发生在我身上。 但情况有点不同,我有主分支,我从中分出了release_1(说)。 对release_1分支进行了一些更改,并将其合并到原始位置。 然后我做了ssh,然后在远程服务器上,我再次使用命令git checkout -b release_1检出release_1,这实际上可以创build一个新的分支release_! 而不是从原点检出已经存在的分支release_1。 通过删除“-b”开关解决了这个问题
什么对我有用,比方说你有branch1,你想合并到branch2。
你打开git命令行到分支2的根文件夹并键入:
git checkout branch1 git pull branch1 git checkout branch2 git merge branch1 git push
如果你有冲突,你不需要做git推,但首先解决conflits,然后推。