假如同事在远程仓库(remote)中修改了一个文件,我直接通过pull到本机工作空间。是不是本地仓库(local)里的代码还是未被更新?得使用fetch或clone来更新本地仓库?
但是我如何从本地仓库更新到工作空间?上图显示用checkout,但是这个命令不是用来切换分支的吗?
假如同事在远程仓库(remote)中修改了一个文件,我直接通过pull到本机工作空间。是不是本地仓库(local)里的代码还是未被更新?得使用fetch或clone来更新本地仓库?
但是我如何从本地仓库更新到工作空间?上图显示用checkout,但是这个命令不是用来切换分支的吗?
学git首先得明白git的工作原理。就是它是一个无中心的分布式版本控制系统,并且在设计之初就是在无需联网的环境中可以工作的。
所以你在本地的任何操作是先放到你本地自己的仓库中的,并不会跟远程同步,直到你使用了push
/fetch
这种操作之后才会跟远程仓库进行同步。
所以第一个问题就回答完了——只要你不执行同步远程仓库的命令(如fetch, push等),你本机的仓库始终不知道远程状态,它所有的操作几乎都是本地完成的,而且无需联网,所以速度极快。
第二个问题,git也不是一板一眼的,git的几个存储空间(workspace, staging, repository)的操作也并不是只有唯一的命令可以操作。git也考虑到一些便捷性,很多命令都有额外的参数或者替代的命令可以帮你完成多步操作,你学东西别太死板了
比如 git pull
相当于 git fetch + git merge
,所以你在终端上会看到两部分的输出,先是下载进度条和同步到的分支名,那个是git fetch的输出,然后再把分支合并到本地workspace,会输出红绿色的diff行数。
再比如你想基于当前分支创建一个新分支并立即使用它,直接使用git checkout -b <new_branch>
就行了,相当于执行了两步命令git branch <new_branch> + git checkout <new_branch>
,甚至更智能的还有,比如远程有个origin/dev
分支,但是你本机并没有这个分支,你直接执行git checkout dev
都可以成功,它自动帮你执行了三个命令: git branch dev; git checkout dev; git branch -u origin/dev
,类似于这种的命令小贴士非常多,平时多看看帮助文档就掌握了,别太死板了。
checkout字面意思是检出
,也并不是你理解的切换分支,实际它的作用远不是仅仅切换分支这么简单,而是从指定提交(当然分支名,tag名也可以看作commit sha1码的别名)中取出指定的代码。跟分支名只是特例,把整个分支的文件都取过来,也就是切换分支了。实际它还可以做到只把某个分支或者某个提交的某些文件检出到当前工作空间来。
除此之外还能实现类似效果的命令是merge
和rebase
,他们跟checkout区别在于:
所以你需要根据你的实际场景选择你需要用checkout还是merge/rebase合并你的代码。如果两人协作开发,需要保留commit记录的,一般都会用merge,否则手工打补丁这种,你可能更多会用checkout
5 回答2.9k 阅读
3 回答2.7k 阅读
3 回答1k 阅读
2 回答291 阅读✓ 已解决
443 阅读
clone
只是需要在第一次克隆的仓库的执行,后续都是pull
或者fetch+merge
pull
≈fetch+merge
如果操作的是同一个分支,你直接切换到(
checkout
/switch
)对应的分支,执行pull
就会自动把远端最新的代码拉取下来并合并到本地分支,如果有冲突,就会提示你需要解决冲突。