为什么我的 git 分支没有指向最新的提交?

Why is my git branch not pointing to the latest commit?

我在 SourceTree 中看到了下图。我检查了 'dev' 分支,但我不明白为什么我要指向以蓝色突出显示的提交,而不是列表顶部的提交。

该图表明列表顶部的提交已在 dev 分支上提交(尽管我总是觉得 SourceTree 图令人困惑,但我不确定这是否真的是该图告诉我的) .如果我这样做:

git checkout dev
git reset --hard head

然后我仍然在以蓝色突出显示的同一个提交上。我也不清楚为什么 master 分支显示 'origin/HEAD' 的标记。列表顶部的提交不应该标记为'origin/HEAD'。这是怎么回事,我需要做些什么来解决这个问题吗?

该图仅显示未与当前分支合并的其他分支中的旧提交。对我来说不那么混乱检查 sourcetree 中的选择器 current branch

当您重置分支时,您可能没有 origin/dev 的最新版本,或者您看到的其他分支不一致。

尝试:

git stash # if needed
git checkout dev
git fetch origin dev
git reset --hard origin/dev # or git reset --hard HEAD  
git stash pop # if needed

这里是 current branch 选择器所在的位置。这不会改变任何东西,只是可视化:

注意:您可以使用 git fetch --all,但我通常不用,我不需要所有更新,只需要更新我正在处理的分支。

The graph suggests that the commit at the top of the list has been commited on the dev branch

这是对图表的错误解读。 dev 分支包含带有消息 "Merged in FD-50-Reboot-scheduler" 的提交及其下方的连接。它不包含上述任何提交。

顶部提交位于名为 origin/Demo-fake-data 的分支上。

Also I'm unclear on why the master branch is showing a marker of 'origin/HEAD'. Shouldn't the commit at the top of the list be marked 'origin/HEAD'. What's going on here, and is there something I need to do to fix this?

HEAD 是当前检出提交的特殊名称。 origin/HEAD 是在名为 origin 的远程服务器上签出的提交。这里没有什么可以解决的。如果你在一个团队中工作,你根本不应该弄乱远程仓库,除非你被分配了那个责任。

这都是一个侧边栏,但有时它很重要。有时,它不太重要或根本不重要,但值得了解:

  • HEAD,全部大写,对Git有特殊意义。这也可以拼写为 @.

  • head,小写,没有特殊含义。

如果您使用的是不区分大小写的文件系统(例如,Windows 和 MacOS 默认设置),全小写的名称 head 最终会与 Git 存储 @ 中的数据,无论如何,对于主要工作树,它被命名为 .git/HEAD。所以它在 Windows 和 MacOS 上结束了某种工作。默认情况下,它在 Linux 上不起作用,并且在添加的工作树中无法正常工作。1 始终使用 @HEAD拼写以确保它在所有情况下都适用。

Also I'm unclear on why the master branch is showing a marker of 'origin/HEAD'. Shouldn't the commit at the top of the list be marked 'origin/HEAD'. What's going on here ...?

的基础上构建一点:您自己的 Git 副本,到您自己的 Git 存储库中,b运行ch 名称在另一个存储库中看到Git 在 origin 结束。它在这些复制的名称前加上 origin/ 前缀,以便您可以将它们与 您的 名称区分开来。这就是为什么你最终得到 origin/masterorigin/dev 等等:他们的 Git 有 masterdev 等等。

就像您自己的存储库一样,它有一个特殊的名称 HEAD 以记住您检出的 b运行ch 名称,它们的 Git 有一个当前的 b运行ch 名称。在早期的某个时候,你 运行 git clone <em>url</em>命令) 创建 您的 Git 存储库。你的 Git 调用了他们的 Git 并且不仅得到了他们的 b运行ch 名称列表,还得到了他们的 @ / HEAD current-b 的内容运行通道信息。在本例中是 master——根据 origin/master 你的 Git 基于他们的 master 创建。 (哇!)

在你的 Git 完成所有阅读他们的 HEAD(并看到 master)的过程之后,以便阅读他们的 master(你的 origin/master) 为了创建您的 master,您的 Git 在您自己的存储库中创建了一个 符号引用 以提醒您他们的 HEAD 包含他们的名称 master 您正在呼叫 origin/master。该提醒几乎永远保留在您的存储库中。这不是很有用。事实上,它似乎完全没用——我自己从未发现它有任何用处。但它就在那里!


1在它可以正常工作的那些系统上,发生的是 head,小写,匹配 .git/HEAD(大写)文件,因此您得到 main 工作树在 / 中使用的提交,而不是当前添加的工作树在 / 中使用的提交。