为什么 git 日志在 git 提取后没有显示任何新内容?

Why does git log not show anything new after git fetch?

我正在通过阅读 relevant section of the Pro Git Book.

学习如何使用 Git 遥控器

如果您克隆一个存储库,该命令会自动将该远程存储库添加到名称 "origin" 下。因此,git fetch origin 获取自您克隆(或上次从该服务器获取)以来推送到该服务器的所有新作品。

重要的是要注意 git fetch 命令仅 获取 数据到您的本地存储库;它不会自动将其与您的任何工作合并或修改您当前正在处理的内容。准备好后,您必须手动将其合并到您的工作中。

这是我试过的。我克隆了一个存储库并编辑了一个文件。 在原始存储库中,有人更新了同一个文件并进行了推送。 那么,

  1. 我运行git fetch。 它显示了一些更新进度消息。但是,git log 没有显示该更新。我误解了 git fetch 的作用吗?我错过了什么吗?

  2. 我运行git pull,我得到了

error: Your local changes to 'hello_world.c' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge.

在这里,我相信它也在合并,为了避免意外的数据丢失,它中止了。

编辑: 感谢您的回答。实际上在查看答案之前,我自己尝试并通过以下命令/输出实现了同样的效果:

$ git ls-remote origin
d0006a6bfa95e0e90aa820a0e50d31a548625652    HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/heads/master
$ git ls-remote .
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431    HEAD
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431    refs/heads/master
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/remotes/origin/HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/remotes/origin/master

还有以下命令:

$git log origin --oneline
$git log --oneline

谢谢你容忍我的愚蠢问题;-)

git fetch 之后,您的本地存储库知道远程存储库的更改,但尚未将它们应用到您的本地分支。

git log 不带附加参数显示当前分支的日志——并且您还没有将远程更改合并到该分支。

git pullgit fetchgit merge FETCH_HEAD.

您的错误消息表示您的本地存储库中有未提交的更改。您可以提交或隐藏它们(如消息所述)并再次尝试 merge(或 pull)。

你写了

However, git log did not show that update. Did I misunderstand what git fetch does? Am I missing something?

您似乎对 git loggit fetch 的作用感到困惑。

假设当前签出了名为 master 的分支——您可能也处于分离头状态,但让我们保持简单,为了便于解释——命令 git log,没有任何其他参数,等同于 git log master。这个命令告诉 Git

Show me all the commits that are in the ancestry of the local master branch.

但是,您需要了解 git fetch origin 并不 affect/update 您当地的分支机构,例如 master。相反,来自 origin(或您从中获取的任何其他远程)的新提交被放入 remote-tracking branches.

远程跟踪分支是特殊 本地分支,其唯一目的是反映您上次与服务器通信时远程存储库中分支的状态。特别是,您不能提交这种类型的分支。

您可能想要的是 运行

git fetch origin

origin 获取所有新提交并将它们放入远程跟踪分支(包括 origin/master,此处),然后

git log master..origin/master

显示在远程 master 分支上添加的所有 "new" 提交的日志,即生活在您称为 origin 的远程服务器上的分支,它您的远程跟踪分支 origin/master 跟踪。

默认情况下,git log显示当前分支的日志。由于获取而不合并不会改变当前(本地)分支中的任何内容,因此 git log 输出不会改变。

git log 可以使用 --all 选项来显示本地和远程所有分支的历史记录。或者,您可以显式列出远程分支,如 git log origin/master.

您的本地分支永远不会从提取中更新,只有跟踪分支会更新,git pull 另一方面,

git pull = git fetch + git merge

你在 git log 中看不到任何更新只是因为你 运行 它在错误的分支上,要从 git fetch 中看到你的更改然后你需要 git log 在右边的分支上,在你的情况下是

git log origin/master