git fetch
git fetch
命令用于从另一个存储库下载对象和引用。从一个或多个其他存储库中获取分支或标签(统称为“引用”),以及完成其历史所必需的对象。远程跟踪分支已更新(Git 术语叫做 commit),需要将这些更新取回本地,这时就要用到git fetch
命令。
默认情况下,还会获取指向正在获取的历史记录的任何标签,效果是获取指向您感兴趣的分支的标签。可以使用--tags
或--no-tags
选项或通过配置远程.<name>.tagOpt
来更改此默认行为。通过使用显式提取标签的refspec,可以获取不指向您感兴趣的分支的标签。
语法
git fetch [<options>] [<repository> [<refspec>…]] git fetch [<options>] <group> git fetch --multiple [<options>] [(<repository> | <group>)…] git fetch --all [<options>]
git fetch
可以从单个命名的存储库或 URL 中获取,也可以从多个存储库中获取,如果给定了<group>,并且配置文件中有一个远程<group>条目。git fetch
获取的参考名称以及它们所指向的对象名称被写入到.git/FETCH_HEAD中。此信息可能由脚本或其他 Git 命令使用,如git pull
。
示例
将某个远程主机的更新
git fetch <远程主机名>git fetch origin
上述命令从远程refs/heads/命名空间复制所有分支,并将它们存储到本地的refs/remotes/origin/命名空间中,除非使用分支.<name>.fetch选项来指定非默认的refspec。
<m>git</m> fetch github remote: Counting objects: 4006, done. remote: Compressing objects: 100% (1322/1322), done. remote: Total 2783 (delta 1526), reused 2587 (delta 1387) Receiving objects: 100% (2783/2783), 1.23 MiB | 10 KiB/s, done. Resolving deltas: 100% (1526/1526), completed with 387 local objects. From github.com:schacon/hw 8e29b09..c7c5a10 master -> github/master 0709fdc..d4ccf73 c-langs -> github/c-langs 6684f82..ae06d2b java -> github/java * [new branch] ada -> github/ada * [new branch] lisp -> github/lisp
可以看到自从上一次与远端仓库同步以后,又新赠或更新了五个分支。“ada”与“lisp”分支是新的,而“master”、“clang”与“java”分支则被更新了。在此例中,我的团队在合并入主分支之前,将提议的更新推送到远端分支以审核。
你可以看到 Git 做的映射。远端仓库的主分支成为了本地的一个叫做“github/master”的分支。这样我就可以执行git merge github/master
将远端的主分支和并入我的本地主分支。或者,我可以git log github/master ^master
看看该分支上的新提交。如果你的远端仓库叫做“origin”,那远端主分支就会叫做 origin/master。几乎所有能在本地分支上执行的命令都可以在远端分支上用。
要更新所有分支,命令可以简写为:
git fetch
上面命令将某个远程主机的更新,全部取回本地。默认情况下,git fetch
取回所有分支的更新。
如果只想取回特定分支的更新,可以指定分支名。如下所示:
git fetch <远程主机名> <分支名> # 比如,取回 origin 主机的 master 分支。git fetch origin master
更新所有远程仓库
如果你有多个远端仓库,都需要更新:
# 同步所有的远端仓库git fetch origin --all
明确使用 refspec
git fetch origin +pu:pu maint:tmp
此更新(或根据需要创建)通过从远程存储库的分支(分别) pu 和 maint 提取来分支本地存储库中的 pu 和 tmp。即使没有快进,pu 分支将被更新,因为它的前缀是加号;tmp 不会。
git fetch git://git.kernel.org/pub/scm/git/git.git maintgit log FETCH_HEAD
第一个命令从git://git.kernel.org/pub/scm/git/git.git从存储库中获取maint分支。
第二个命令使用FETCH_HEAD来检查具有git log
的分支。
使用远程仓库中的分支
所取回的更新,在本地主机上要用“远程主机名/分支名”的形式读取。比如 origin 主机的 master 分支,就可以用 origin/master 读取。
git branch -r origin/mastergit branch -a * master remotes/origin/master
上面命令表示,本地主机的当前分支是 master,远程分支是 origin/master。
取回远程主机的更新以后,可以在它的基础上,使用git checkout
命令创建一个新的分支。
# 在 origin/master 的基础上,创建一个新分支 newBrachgit checkout -b newBrach origin/master
此外,也可以使用git merge
命令或者git rebase
命令,在本地分支上合并远程分支。
# 在当前分支上,合并 origin/mastergit merge origin/master # 或者git rebase origin/master