Git fetch 从远程仓库下载数据到本地

git fetch 命令将提交、文件和引用从远程存储库下载到本地存储库中。 当你想查看其他人一直在做什么时,fetch 就是你需要做的。 它与 svn update 类似,它可以查看中央历史记录的进展情况,但它不会强制你将更改实际合并到你的仓库中。 Git 将获取的内容与现有的本地内容隔离开来; 它对你的本地开发工作绝对没有影响。 必须使用 git checkout 命令显式检出获取的内容。 这是一种在将提交与本地存储库集成之前,进行提交审查的一种安全的方式。

当你想要在远程仓库下载内容时,可以使用 git pull 或者 git fetch 命令。你可以考虑使用这两个命令中比较“安全”的方式,git fetch。它会下载远程内容,但不会更新您本地仓库的工作状态,从而使当前的工作不受影响。 git pull 是更激进的选择; 它将下载本地当前使用的分支的远程内容,并立即执行 git merge 为新的远程内容创建合并提交。 如果您有正在进行的更改,这将导致冲突并启动合并冲突解决流程。


git fetch 如何与远程分支配合使用

为了更好地理解 git fetch 如何工作,现在我们讨论 Git 如何组织和存储提交。 在仓库的 ./.git/objects 目录中,Git 存储所有提交,包括本地提交和远程提交。 Git 通过使用分支引用将远程和本地分支提交明显分开。 本地分支的引用存储在 .git/refs/heads/ 中。 执行 git branch 命令将输出本地分支引用列表。

$ git branch

git branch 查看的分支列表

如果我们查看 .git/refs/heads 的内容,显示的分支和上面是一样的

$ ls .git/refs/heads

直接查看git存储分支的目录

远程分支除了它们映射到来自其他人的仓库的提交,其他就像本地分支一样。 远程分支以它们所属的远程名称为前缀,这样就不会将它们与本地分支混淆。 和本地分支一样,Git 也有远程分支的引用。 远程分支引用位于 .git/refs/remotes/ 目录中。

$ git branch -r

git branch 查看远程分支

这里的输出显示我们以前检查过的部分本地分支,但现在显示它们的前缀为origin/。我们可以像签出本地分支一样签出远程分支,但这会使得仓库处于分离HEAD的状态(就像签出旧的提交一样)。我们可以将远程分支视为只读分支。要查看远程分支,只需在 git branch 命令后面跟上-r标志选项。

我们可以使用通常的 git checkoutgit log 命令检查远程分支。 如果同意远程分支包含的更改,可以使用 git merge 将其合并到本地分支。 因此,与 SVN 不同的是,将本地仓库与远程仓库同步实际上是一个两步过程:获取,然后合并。 git pull 命令类似于一个快捷命令,合并了上面的两个步骤。


Git fetch 命令和选项

git fetch <remote>

从仓库中获取所有分支。 这还会从其他仓库下载所有必需的提交和文件。

git fetch <remote> <branch>

与上面的命令相同,但仅获取指定的分支。

git fetch --all

获取所有已注册远程分支

git fetch --dry-run

--dry-run 选项将执行命令的演示运行。 它将输出在获取期间将采取的操作示例,但不应用它们。


使用 git fetch 同步 origin

以下示例演示了将本地仓库与中央仓库的主分支同步的典型工作流程。

$ git fetch origin

这将显示已下载的分支

git fetch下载远程origin主分支

来自这些新远程分支的提交在下图中显示为正方形而不是圆形。 如你所见, git fetch 使得我们可以访问另一个仓库的整个分支结构。

使用git fetch 同步远程origin 分支
使用git fetch 同步远程origin 分支

要查看已将哪些提交添加到上游 master,可以使用 origin/master 作为过滤器运行 git log

$ git log --oneline master..origin/master

git log 查看远程提交

要是同意更改并将其合并到本地主分支中,请使用以下命令:

$ git checkout master
$ git merge origin/master

git merge 合并远程分支

origin/master 和 master 分支现在指向同一个提交,并且与上游开发同步。


git fetch 总结

回顾一下, git fetch 是用于从远程仓库下载内容的主要命令。 git fetch 与 git remote、git branch、git checkout 和 git reset 结合使用,以将本地仓库更新为远程仓库的状态。 git fetch 命令是协作 git 工作流的关键部分。 git fetch 与 git pull 的行为相似,但是,git fetch 可以被认为是更安全的非破坏性命令。

查看笔记