同步GIT仓库的操作 -- fetch命令
git fetch
命令从远端仓库中下载commits, files, refs到本地仓库中。当你想要看看其他人都在做些什么的时候,就要使用fetch命令。这跟
svn update
命令很像,同样可以让你看到远端仓库的所有提交进展,但是fetch命令并不强迫让远端的变更合并到你的仓库。Git会对本地内容与fetch下载的内容进行隔离;这就保证了fetch命令更新的远端变更不会对本地正在进行的开发工作产生任何影响。如果想查看通过fetch命令下载的内容,需要显式地通过
git checkout
命令检出你希望查看的版本。因此在你还不想让远端仓库的版本合并到本地之前,但仍然希望可以查看一下远端版本都做了哪些变更的时候,fetch命令就是一种安全的解决方案。
git pull
和
git fetch
这两个命令都可以用于下载远端仓库。你可以认为
git fetch
是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观
git pull
命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个
git merge
命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。
git fetch如何操作远端分支
为了更好理解
git fetch
是如何工作的,我们先来看看Git是如何组织和存储commits的。在大幕之后,Git会将远端与本地的commits保存在
./.git/objects
文件夹下。Git通过利用分支的refs来区分远端和本地的commits。本地分支的refs都被保存在
./.git/refs/heads/
文件夹下。当执行
git branch
命令时会输出本地分支的名称列表,如下所示。
git branch
feature1
debug2
查看
./.git/refs/heads/
文件夹内的文件也会看到同样的输出。
ls ./.git/refs/heads/
feature1
debug2
远端的分支与本地类似,只是他们对应的是其他人本地仓库的分支代码。远端分支列表的名称会有远端名称作为前缀以免与本地分支混淆。与本地分支一样,Git也存储了远端分支对应的refs。远端分支的refs存储在
./.git/refs/remotes
文件夹下。下面的例子展示了fetch远端仓库之后的远端分支列表:
git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature
输出列出了之前我们看到的本地分支,但这次是以
origin/
为前缀。此外还列出了以
remote-repo
为前缀的远端分支。远端分支同样可以像本地分支一样通过check out命令检出,但检出的远端分支会进入游离状态(detached HEAD state)。你可以认为是只读状态。查看远端分支,可以向
git branch
命令传入-r选项。
如果想查看远端分支的具体细节,可以使用常见的
git checkout
结合
git log
命令。如果你接受远端分支的代码修改,就可以使用
git merge
命令合并远端分支的修改到本地。可见,与SVN不同,将远端仓库同步到本地实际上包含俩个步骤:fetch, 然后merge。
git pull
命令是这一过程的快捷方式。
git fetch 命令和可选项
git fetch <remote>
Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。
git fetch <remote> <branch>
与上面的命令同样,但只会fetch指定分支。
git fetch --all
fetch所有已注册过的远端仓库的全部分支。
git fetch --dry-run
--dry-run
选项会执行fetch命令的演练,执行该命令的输出与执行正常fetch命令一致,但不会在本地应用这些变更。
Git fetch示例
git fetch一个远端分支
接下来的示例会展示如果fetch远端分支,以及将远端的内容更新到本地的过程。在此示例中,我们假设已经通过
git clone
命令从某个中心仓库clone过整个项目。此外我们还假设有一个另外的远端仓库名叫 coworkers_repo,这个仓库中有一个我们希望更新到本地的分支叫做feature_branch。
首先我们需要使用
git remote
命令来添加这个远端仓库。
git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git
此时我们已经创建了对于同事仓库的引用。下面我们通过
git fetch
命令来下载这个仓库中的内容。
git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
现在本地有了来自于coworkers/feature_branch分支的内容,我们需要把这个远端分支的内容整合到本地工作区。首先通过
git checkout
命令来检出这个远端分支。
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may