当我们需要同步Git本地与远程仓库的状态时,会用上git fetch
,该命令拉取远端仓库的分支、更新状况等状态。例如,远端建立了新的分支,但本地看不到,就可以用git fetch
来同步。
实际操作中,笔者会在多台电脑上开发,建立新分支来适配新特性或进行测试,因此常常需要该命令来保证每台电脑的分支列表都能与GitHub同步。
但是,git fetch
命令有一个非常巨大的坑:有时它只能同步一个分支,无法同步所有分支。 一不留神,就中招了。
问题背景:单分支克隆
由于网络环境限制,为了减少克隆内容、加快克隆速度,我会采用单分支克隆的方式,来下载一些仓库的源代码(例如,获取仓库的develop
分支):
1 |
|
单分支克隆,一时下载一时爽,但却给后续的开发埋雷。
后来,我在别的电脑给该仓库新建了一个分支,用于测试新的软件特性,同步到了GitHub。结果,回到当前这台电脑上,想用git fetch
来同步分支列表,无论运行多少次,都始终只能同步develop
这个本地分支——git branch -a
没有显示任何以remotes/
开头的远程分支。
以下几个命令都无法同步所有分支:
1 |
|
问题的原因:远端设置
Git有一个设置参数:remote.<远端名>.fetch
,它控制git fetch
命令如何获取分支信息。我们可以这样获取它的值:
1 |
|
在正常克隆(不带--single-branch
)时,该参数的值如下所示,意为获取所有的HEAD
,以及origin
远端的所有分支:
1 |
|
**但是,在单分支克隆的仓库中,remote.<远端名>.fetch
是空的! ** 这就意味着git fetch
将不会获得任何远端分支,所以问题不难解决了。
解决方案:手动设置remote.<远端名>.fetch
参数
只需把remote.<远端名>.fetch
参数手动指定为默认值即可。
注意: 如果你有多个远端,则需要分别设置。
1 |
|
最后,重新拉取远程分支:
1 |
|
至此,重新运行git branch -a
,熟悉的远程分支回来了。
写在最后
一般来说,单分支克隆适用于只需要使用一个分支的情况,比如:
- 测试、运行开源项目(用单独一个特定的分支也足够)
- 把开源项目用作自己的依赖项(此时拷贝整个仓库并不划算)
而如果要持续对项目进行开发,则不建议使用单分支克隆。因网络问题使用单分支属于权宜之计。
如果你之前以单分支方式克隆了你的工程项目,建议通过本教程的方法来重设git fetch
的设置,以免给后续使用多分支的开发“埋雷”。
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2023/03/20/Git/Git_Fetch_All_Commits/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!