这一篇介绍一下fetch, pull, checkout
git可以将其他客户端的分支获取到本地, 供开发者浏览或是合并, fetch是将远程分支获取到本地, pull是将远程分支获取到本地, 并试图和本地分支进行合并, 如果不能合并则会提醒你合并被拒绝。
要查看或获取远程版本库, 最好将远程版本库进行命名:
git remote add <name> <url> 即git remote add new_remote ../repo2
查看远程版本库信息:
git remote show new_remote 如果你使用git remote show ../repo2 则只能获取很少的信息
接下来就是将远程分支获取到本地, 先来演示fetch, 即只获取
git fetch new_remote
命令输出:
From ../repo2
* [new branch] master -> new_remote/master
* [new branch] newb1 -> new_remote/newb1
可以看到命令将远程版本库的所有分支获取到本地并保存在以远程版本库名称为前缀的空间下。这时获取的分支并不是像本地分支一样显示出来, 而是“隐藏”的, 用,命令git branch是看不到的, 要用 git branch -a 才能看到。
这时我们打开.git目录可以看到一个FETCH_HEAD文件, 打开可以看到两行HEAD的sha1, 分别是远程的两个分支的HEAD, 上一篇中我已经说过git是用链表的方式索引每一次提交的, 作为链表的头怎么能有两个呢?git的这个FETCH_HEAD文件只是一个“快捷方式”我们在git中只能使用这个文件中的第一条记录, 因此你转换到远程分支的时候:
git checkout FETCH_HEAD
转换到的就是第一条记录代表的master分支。FETCH_HEAD中的其他记录都是为了方便pull命令在合并进行遍历的。而如果我们不使用命名的名称进行fetch, 即:
git fetch ../repo2
默认获取的是远程的master分支到本地作为FETCH_HEAD。此时我们再打开FETCH_HEAD这个文件发现里面就只有一个记录了。我们也可以指定远程的一个分支获取到本地:
git fetch ../repo2 newb1
当获取一个远程分支到本地后, 无论是使用远程版本库的名称, 还是其url, 获取下来的分支都是“二等公民”, 我们可以切换到这个分支然后使用其建立一个本地分支, 将其变为一等公民, 具体如何做,切换到远程分支后git会提示你如何创立一个本地分支。
这就是fetch了, 注意使用url进行fetch和为远程进行命名后使用名称进行fetch是不同的, 为了使用中减少困惑, 建议为远程版本库命名, 然后使用名称进行远程版本库的查询和fetch。
再讲讲checkout, 在不同branch之间切换前, 如果你的文件已经修改, 这时会有一个小问题, 即假如你的分支1中有一个文件叫1.txt, 然后你修改了其内容, 现在要切换到分支2, 如果在分支2中也有文件1.txt, git会自动将你对分支1中1.txt做的修改合并到分支2中的1.txt并在切换的时候列出合并的文件:
M 1.txt
Switched to branch ‘master’
但如果你的分支2中并没有1.txt,或是git在自动合并过程失败, 则其会提示切换分支失败, 这时你应进行依次commit, 然后再checkout。因此, 为了避免引起误会(你切换到另外一个分支, 却发现文件已经被修改了), 在切换分支前最好进行依次commit。