我有一个git仓库,有2个分支:master和test。
主分支和测试分支之间存在差异。
两个分支都提交了所有更改。
如果我这样做:
git checkout master
git diff test
屏幕上会出现一个充满变化的屏幕,显示不同之处。我想合并测试分支中的更改,这样做:
git merge test
但是得到的信息是"Already - updated "
但是,检查每个不同分支下的文件可以清楚地显示出差异。
这里的问题是什么,我如何解决它?
我有一个git仓库,有2个分支:master和test。
主分支和测试分支之间存在差异。
两个分支都提交了所有更改。
如果我这样做:
git checkout master
git diff test
屏幕上会出现一个充满变化的屏幕,显示不同之处。我想合并测试分支中的更改,这样做:
git merge test
但是得到的信息是"Already - updated "
但是,检查每个不同分支下的文件可以清楚地显示出差异。
这里的问题是什么,我如何解决它?
当前回答
这种情况发生在我身上,因为GIT奇怪地认为本地分支与远程分支不同。 这在分支图中可见:它显示了两个不同的分支:remotes/origin/branch_name和branch_name。
解决方案是简单地删除本地回购并从远程重新克隆它。这样GIT就会理解remotes/origin/branch_name>和branch_name确实是相同的,并且我可以发出GIT合并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:
A -- B -- C -- D
现在,你创建了一个分支测试,处理它,并执行4次提交:
E -- F -- G -- H
/
A -- B -- C -- D
主人的头指向D,测试者的头指向H。
当你要合并的分支的HEAD是你想要合并的分支的提交链的父节点时,就会显示“Already - updated”消息。 这里的情况就是这样:D是E的父结点。
从测试到主服务器没有什么需要合并的,因为从那时起主服务器上没有任何变化。 你在这里要做的就是告诉Git让master的head指向H,所以master的分支有如下的提交历史:
A -- B -- C -- D -- E -- F -- G -- H
这是一个Git命令重置的作业。 你也想让工作目录反映这个变化,所以你要做一个硬重置:
git reset --hard H
如果将分支A合并到分支B报告“Already up to date”,则反过来并不总是正确的。只有当分支B是分支A的后代时才成立,否则 分支B可以有A中没有的变更。
例子:
在master上创建分支A和B 您在master中做了一些更改,并只将这些更改合并到分支B中(不更新或忘记更新分支A)。 你在分支A中做了一些改变,并将A合并到B。
在这一点上,合并A到B报告“已经更新”,但分支是不同的,因为分支B有来自主的更新,而分支A没有。
这很傻,但可能会发生。假设你的分支名称前缀是一个问题引用(例如#91-fix-html-markup),如果你这样合并:
$ git merge #91-fix-html-markup
它不会像预期的那样工作,因为#之后的所有内容都被忽略,因为#开始一个内联注释。
在这种情况下,你可以重命名分支,省略#或使用单引号环绕分支名称:git merge '#91-fix-html-markup'。
发生在我身上并被发送到这个页面,不确定我是否有相同的场景,但我的是我试图“重新合并”“测试”分支。
所以我之前合并了它,但我故意在合并过程中排除了一些特定的更改,所以它在分支之间显然有一些差异。然后,我试图重新合并它,因为我意识到/忘记我应该添加一个特定的更改/文件,我之前已经排除了,我希望如果我再次进行合并,将显示我之前排除的所有更改,但我错了,我得到了“已经更新”的消息。
在阅读@Bombe的评论/回答后,他是对的,我认为git是这样做的,所以我所做的是在测试分支上对文件进行硬备份,然后签出主分支,手动将文件粘贴到其中,并提交它,就像它是新的更改一样。
我不确定这是否是正确的方法,或者是否可以帮助其他有同样问题的人,但它确实为我的特殊情况提供了解决方案。
我不确定在我的情况下到底是什么问题,但问题的根源似乎是branchB检出,我无法从branchA拉出最新的更改…
我必须签出branchcha,拉出,然后签出branchB并合并branchA,让它像预期的那样工作。