我有一个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 checkout master
git pull
git fetch --all
git rebase --abort
git checkout test
git pull
git reset --hard
git merge origin master
大多与重基或已采取合并分支有影子历史,与清除或重置分支 将有助于在文件中合并东西。
其他回答
假设你有一个具有以下提交历史的分支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
当我知道远程主机上有更改时,这种情况经常发生在我身上,所以我尝试使用git merge master合并它们。但是,这不会与远程主服务器合并,而是与本地主服务器合并。
在合并之前,签出master,然后git拉到这里。然后您将能够将新的更改合并到您的分支中。
这可能看起来微不足道,但我见过许多人忽略它,只是在父分支上进行git合并。这将自动导致“已经更新”的消息。
合并命令应该是git merge branchNametoMergeFrom
例如,假设你有2个分支branchA和branchB,你需要将B合并为a,你需要首先签出到branchA,然后使用merge命令,同时指定要合并的分支(在这种情况下是branchB)。
因此,命令不应该只是git merge,而应该是git merge branchB。
“已经是最新的”消息意味着您试图合并的分支的所有更改都已经合并到您当前所在的分支。更具体地说,它意味着您试图合并的分支是当前分支的父分支。恭喜你,这是你做过的最简单的合并。:)
使用gitk查看您的存储库。“test”分支的标签应该在“master”分支标签的下方。
您的分支相对于其父分支是最新的。根据合并,自上次合并以来父节点中没有新的变化。这并不意味着分支是相同的,因为您可以在工作分支中进行大量更改,而且听起来确实如此。
编辑10/12/2019:
根据Charles Drake对这个答案的评论,解决这个问题的一个解决方案是:
git checkout master
git reset --hard test
这又回到了“测试”层面。
然后做:
git push --force origin master
为了迫使中央回购的变化。
这很傻,但可能会发生。假设你的分支名称前缀是一个问题引用(例如#91-fix-html-markup),如果你这样合并:
$ git merge #91-fix-html-markup
它不会像预期的那样工作,因为#之后的所有内容都被忽略,因为#开始一个内联注释。
在这种情况下,你可以重命名分支,省略#或使用单引号环绕分支名称:git merge '#91-fix-html-markup'。