• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 maint
    git 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/master
    
    git branch -a
    * master
      remotes/origin/master
    

    上面命令表示,本地主机的当前分支是 master,远程分支是 origin/master。


    取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

    # 在 origin/master 的基础上,创建一个新分支 newBrach
    git checkout -b newBrach origin/master
    


    此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

    # 在当前分支上,合并 origin/master
    git merge origin/master
    
    # 或者
    git rebase origin/master
    

    上篇:git tag

    下篇:git pull