问一个GIT的问题?

假如同事在远程仓库(remote)中修改了一个文件,我直接通过pull到本机工作空间。是不是本地仓库(local)里的代码还是未被更新?得使用fetch或clone来更新本地仓库?
但是我如何从本地仓库更新到工作空间?上图显示用checkout,但是这个命令不是用来切换分支的吗?

阅读 1.9k
2 个回答

clone 只是需要在第一次克隆的仓库的执行,后续都是 pull 或者 fetch+merge

  • pullfetch+merge

如果操作的是同一个分支,你直接切换到(checkout/switch)对应的分支,执行 pull 就会自动把远端最新的代码拉取下来并合并到本地分支,如果有冲突,就会提示你需要解决冲突。

学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码的别名)中取出指定的代码。跟分支名只是特例,把整个分支的文件都取过来,也就是切换分支了。实际它还可以做到只把某个分支或者某个提交的某些文件检出到当前工作空间来。

除此之外还能实现类似效果的命令是mergerebase,他们跟checkout区别在于:

  • 不具有切换分支的效果,所有的操作都是在当前分支进行
  • 不具备单文件操作的效果,merge/rebase都是对某次commit中所有的文件整体操作
  • checkout不会更改当前workspace的commit记录,merge/rebase会

所以你需要根据你的实际场景选择你需要用checkout还是merge/rebase合并你的代码。如果两人协作开发,需要保留commit记录的,一般都会用merge,否则手工打补丁这种,你可能更多会用checkout

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进