Git merge reports “Already up-to-date” though there is a difference
我有一个Git存储库,有两个分支:master和test。
主分支和测试分支之间存在差异。
两个分支都提交了所有更改。
如果我这样做:
1 2 | git checkout master git diff test |
出现一个充满变化的屏幕,显示差异。我要合并测试分支中的更改,因此执行以下操作:
1 | git merge test |
号
但要知道"已经是最新的"
但是,检查每个不同分支下的文件明显显示出差异。
这里的问题是什么?如何解决?
消息"已经是最新的"意味着来自您尝试合并的分支的所有更改已经合并到您当前所在的分支。更具体地说,它意味着您试图合并的分支是当前分支的父级。恭喜你,这是你能做的最简单的合并。:)
使用
你的分支机构与它的母公司是最新的。根据合并,自上次合并以来,父级中没有新的更改。这并不意味着分支是相同的,因为你可以在你的工作分支中有很多变化,听起来就像你做的一样。
当我知道远程主机上有更改时,经常会发生这种情况,因此我尝试使用
所以在进行合并之前,先签出master,然后在那里执行
假设您有一个分支
1 | A -- B -- C -- D |
号
现在,您可以创建一个分支测试,对其进行处理,并执行4个提交操作:
1 2 3 | E -- F -- G -- H / A -- B -- C -- D |
当要合并的分支的负责人是要合并的分支提交链的父级时,将显示"已更新"消息。就是这样,这里:
从
1 | A -- B -- C -- D -- E -- F -- G -- H |
。
这是git命令
1 | git reset --hard H |
对我有用的是,假设你有一个分支1,你想把它合并成一个分支2。
打开git命令行,转到Branch2的根文件夹并键入:
1 2 3 4 5 | git checkout branch1 git pull branch1 git checkout branch2 git merge branch1 git push |
如果你有交感,你不需要做git push,但首先解决冲突,然后push。
A merge is always between the current HEAD and one or more commits (usually, branch head or tag),
and the index file must match the tree of HEAD commit (i.e. the contents of the last commit) when it starts out.
In other words,git diff --cached HEAD must report no changes.The merged commit is already contained in
HEAD . This is the simplest case, called"Already up-to-date."
号
这意味着测试中的提交已经在master中合并,但是由于其他提交是在master上完成的,因此
这是因为要合并的分支的本地副本已过期。我有一个分支叫
1 2 3 4 5 6 7 8 | _>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. |
号
但我知道有些变更需要合并!
我输入
1 2 3 4 5 6 | _>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次,这解释了一切!现在,我将丢失的更改记录下来,然后跳到
1 2 3 4 5 6 7 8 9 10 11 12 13 | _>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认为本地分支与远程分支不同。这在分支图中可见:它显示了两个不同的分支:远程/源/分支名称和分支名称。
解决方案只是删除本地repo并从远程重新克隆它。这样,Git就可以理解远程/源/分支名称>和分支名称确实是相同的,我可以发布
1 2 3 4 5 6 7 | rm <my_repo> git clone <my_repo> cd <my_repo> git checkout <branch_name> git pull git checkout master git merge <branch_name> |
以东十一〔6〕相反,以东十一〔7〕为我工作。因此,要将主控形状合并到功能分支,可以使用:
1 2 | git checkout feature_branch git merge origin/master |
我不知道我是否有同样的场景,而是我试图"重新合并"那个"测试"分支。
所以我以前合并过它,但在合并过程中我故意排除了一些特定的更改,所以很明显它在分支之间有一些不同。我当时正试图重新合并它,因为我意识到/忘记了我应该并且想要添加一个我以前排除的特定更改/文件,我希望如果我再次进行合并,将显示我以前排除的所有更改,但我错了,我收到了"已经是最新的"消息斯特德
在阅读了@bombe的评论/答案后,他是对的,我认为Git的行为就是这样的,所以我所做的就是在测试分支上对文件进行硬备份,然后签出主分支并手动粘贴其中的文件,然后像提交新的更改一样提交它。
我不确定这是否是正确的方法,或者是否可以帮助其他人解决同样的问题,但它确实为我的特定案例提供了解决方案。
确保先签出要合并的分支,然后将其拉出来(这样本地版本与远程版本匹配)。
然后签回要进行合并的分支,您的Git合并就可以工作了。
使用Git-Bash面对这种情况。
我们的存储库有多个分支,每个分支都有一个不同的提交周期,并且偶尔会发生合并。旧分支用作新分支的父级
旧的_分支被更新为需要与新的_分支合并的一些更改
正在使用不带任何分支的下面的pull命令从所有分支获取所有源。
git pull origin
号
奇怪的是,这并不能从所有分支中提取所有的提交。已经考虑过了,因为指示显示了几乎所有的分支和标签。
所以为了解决这个问题,老分支使用了
git checkout Old_Branch
git pull origin Old_Branch
号
现在签出了新的分支机构
git checkout New_Branch
号
一定要拉着
git pull origin New_Branch
git merge Old_Branch
号
维奥拉从旧的分支机构到新的分支机构都有冲突需要解决,这是意料之中的。
如果将分支A合并为分支B报告"已经是最新的",则反向并不总是正确的。只有当分支B是分支A的后代时才是这样,否则分支B可以有不在A中的更改。
例子:
此时,合并A到B报告"已经是最新的",但是分支是不同的,因为分支B有来自主服务器的更新,而分支A没有。
我也有同样的问题。我在遥控器上做了一些改动,它仍然显示"已经更新了"。重新打开存储库为我解决了这个问题。
我也一样。但情况有点不同,我有主分支,我从中刻出了版本1(比如说)。在版本1分支中做了一些更改,并将其合并到了原始版本中。然后我在远程服务器上执行ssh和我再次使用命令git checkout-b release_1签出释放_1,这实际上是一个新的分支释放_uuu!从主版本而不是从源版本签出已经存在的分支版本"1"。通过拆除"-B"开关解决了这个问题