尽管存在差异,Git合并报告"已经是最新的"

Cha*_*rke 257 git merge

我有一个带有2个分支的git存储库:master和test.

主分支和测试分支之间存在差异.

两个分支都承诺所有更改.

如果我做:

git checkout master
git diff test

出现一个充满变化的屏幕,显示出差异.我想合并测试分支中的更改,所以:

git merge test

但得到消息"已经是最新的"

但是,检查每个不同分支下的文件清楚地显示了差异.

这里有什么问题,如何解决?

Bom*_*mbe 129

消息"已经是最新的"意味着您尝试合并的分支的所有更改已合并到您当前所在的分支.更具体地说,它意味着您尝试合并的分支是您当前分支的父分支.恭喜,这是你做过的最简单的合并.:)

用于gitk查看您的存储库."test"分支的标签应位于"master"分支标签下方的某处.

您的分支机构与其父母的最新信息是最新的.根据合并,自上次合并以来,父母没有新的变化.这并不意味着分支是相同的,因为你的工作分支可以有很多变化,听起来就像你一样.

  • 我现在所做的是:git checkout master; git reset --hard test; 这使它回到'测试'水平.然后我做了一个"git push -force origin master"来强制更改回中央仓库. (23认同)
  • 如果git有一个警告说"试图与父母合并",本来不错. (20认同)
  • 神圣的cr*p!你是对的!我认为发生的事情是另一个分支(不稳定的开发)与master错误地合并,测试分支是不稳定的子集.我试图做的合并是让主人回到'测试'水平. (2认同)
  • 对.那个操作没有任何意义,所以Git拒绝做任何事情.:) (2认同)
  • 推送不是远程端已存在分支的后代的分支被认为是一件坏事:请参阅 git-push 和 git-pull 手册页上的讨论。 (2认同)

ACa*_*ter 121

当我知道远程主服务器上有更改时,这经常发生在我身上,因此我尝试使用它们进行合并git merge master.但是,这不会与远程主服务器合并,而是与您的本地主服务器合并.

所以在进行合并之前,请先检查主人,然后再进行git pull.然后,您将能够将新更改合并到您的分支中.

  • 是否有一种方法可以避免分支的切换,例如在仍然在要合并的分支中合并分支的拉动,然后合并? (7认同)
  • 啊,不错的一个。我认为“git fetch”会更新主分支,即使我当前位于不同的分支上。事实证明并非如此。谢谢!我很确定有一个“fetch”选项可以让您指定要获取哪个分支。 (4认同)
  • @ JaphethOngeri-inkalimeva你可以做`git fetch --all && git merge origin/master`.无需更新本地`master`来合并远程更改. (4认同)
  • @Raik你可以做`git fetch --all`,但这只会获取分支,不会拉动它们。 (2认同)

Mar*_*ley 42

假设您有一个master具有以下提交历史记录的分支:

A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)

现在,您创建一个分支测试,对其进行处理,并执行4次提交:


                 E -- F -- G -- H
                /
A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)

master他的头指向D,而test头部指向H.

当您要合并的分支的HEAD是您要合并的分支的提交链的父级时,将显示"已经是最新的"消息.情况就是这样:D是...的父母E.

没有什么可以从合并testmaster,因为一切都没有改变对master自那时起.你想要做的就是告诉Git master要指向H,所以master的分支有以下提交历史:

A -- B -- C -- D -- E -- F -- G -- H
Run Code Online (Sandbox Code Playgroud)

这是Git命令的工作reset.您还希望工作目录能够反映此更改,因此您将进行重置:

git reset --hard H
Run Code Online (Sandbox Code Playgroud)

  • 过去我曾被告知使用`git reset --hard`是一件非常激烈的事情,它会丢失提交吗?是否有一种更安全的方式来进行这些更改,还是"git reset --hard"的危险被夸大了? (3认同)
  • 这个命令是正常的,不用担心。我想说,使用“--hard”选项唯一需要注意的是,它实际上修改了您的工作目录,因此,您会丢失未提交的更改。就个人而言,我在每个手动运行 git 命令之前和之后都会执行“git status”,以确保我的存储库是干净的或处于预期状态。 (2认同)
  • 精彩的解释.挺清楚的.谢谢. (2认同)

Joh*_*phy 12

请务必先检出要合并的分支,然后再拉取它(以便您的本地版本与远程版本匹配)。

然后结帐回到您想要合并的分支,您的 git merge 应该可以工作。


Ste*_*lie 11

对我有用的是,假设您有branch1,并且想要将其合并到branch2。

您打开git命令行转到branch2的根文件夹,然后键入:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push
Run Code Online (Sandbox Code Playgroud)

如果您有冲突,则无需执行git push,但首先要解决冲突,然后再进行推送。

  • 在 git mergebranch 1 中我得到 ---> `已经是最新的了。通过“递归”策略进行合并。但在分支 1 之前我做了 `git pull` ,然后所有更改都被拉了。该怎么办 ? (4认同)

Jus*_*tas 11

git merge origin/master而是git merge master为我工作。因此,要将 master 合并到 feature 分支中,您可以使用:

git checkout feature_branch
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

  • 无需隐藏任何待处理的更改。惊人的。 (2认同)

Von*_*onC 6

合并始终在当前HEAD和一个或多个提交(通常是分支头或标记)之间,
并且索引文件在开始时必须与HEAD提交树(即最后一次提交的内容)匹配.
换句话说,git diff --cached HEAD必须报告没有变化.

合并的提交已包含在HEAD.这是最简单的案例,称为"已经是最新的".

这应该意味着测试中的提交已经在master中合并,但由于其他提交是在master上完成的,git diff test因此仍然会给出一些差异.


bub*_*ier 6

发生在我身上并被发送到此页面,不确定我是否有相同的情况,但我的是我试图“重新合并”该“测试”分支。

所以我之前合并了它,但在合并期间我故意排除了一些特定的更改,因此分支之间显然存在一些差异。然后我试图重新合并它,因为我意识到/忘记了我应该有并想要添加我之前排除的特定更改/文件,我希望如果我再次进行合并会显示我之前排除的所有更改,但我错了,我收到了“已经是最新的”消息。

在阅读@Bombe的评论/答案后,他是对的,我认为 git 的行为就是这样,所以我所做的是对测试分支上的文件进行硬备份,然后签出主分支并手动将文件粘贴到其中并提交就好像这是新的变化一样。

我不确定这是否是正确的方法或者可以帮助其他人遇到同样的问题,但它确实为我的特殊情况提供了解决方案。

  • 您可以直接将文件从一个分支检出到当前分支,而不是手动粘贴:`git checkout srcBranch -- path/to/file`。也可以使用文件 glob。 (5认同)

小智 5

这发生在我身上,因为奇怪的是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>
Run Code Online (Sandbox Code Playgroud)


Fox*_*loy 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.
Run Code Online (Sandbox Code Playgroud)

但是我知道有些变化需要合并!

事情就是这样,当我输入时git merge ProjectMaster,git会查看该分支的本地副本,它可能不是最新的。要查看是否是这种情况,我首先告诉Git检查分支是否过时,并使用uh来获取任何更改(如果有的话)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)
Run Code Online (Sandbox Code Playgroud)

啊哈!我的本地副本已过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.
Run Code Online (Sandbox Code Playgroud)

现在我还有另一个问题要解决...