当我们将本地仓库与远程主机进行关联后,就可以与远程主机共享代码或文件,下面对git远程操作常用的命令进行总结:
git fetch
git fetch命令用于将远程主机的更新取回本地。
git fetch <远程主机名>
上面命令将某个远程主机的全部更新取回本地,默认情况下git fetch命令取回所有分支的更新,如git fetch origin命令,将从远程主机origin(默认主机名)refs/heads命名空间下复制所有分支,并将它们存储到本地的refs/remotes/origin命名空间中。获取远程分支后,可以使用branch -a命令查看所有分支(-r指定查看远程分支)。
如果想要取回指定分支的更新,可以指定分支名。
git fetch origin master
上述命令将从取回orgin主机上的master分支,取回的更新,在本地主机上要使用“远程主机名/分支名”的形式读取。比如上面取回的分支,就要用origin/master读取。
也可以在取回更新的同时,指定本地分支。下面的命令将取回远程master分支的更新并放在本地分支tmp。
git fench origin master:tmp
在取回远程分支的更新后(git clone命令已包含这一过程),可以在此基础上创建一个新的分支。
git checkout -b newBranch origin/master
之后,我们可以切换回本地分支,执行git merge命令对远程master分支进行合并。
在执行git fetch之后,可能会发现仍看不到全部远程分支,可进行如下配置:
git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git pull
除了使用git fetch指令拉取远程数据,还可以使用git pull命令拉取远程特定分支的所有更新,再与本地指定分支进行合并,完整命令格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支要合并到当前分支,则冒号后的分支名可以省略。
很多时候,本地分支与远程分支之间存在追踪关系(比如git clone时,所有本地分支默认与远程主机的同名分支建立追踪关系),git可以使用如下命令手动建立追踪关系。
git branch --set-upstream-to=<远程主机名>/<分支名>
在存在追踪关系的情况下,可以直接使用git pull命令从追踪的的分支取回更新并合并。git pull 命令相当于是git fetch + git merge,因此,git fetch 命令更安全,我们可以先比较分支的内容,在决定是否合并,过程如下。
git fetch origin master:tmp
git diff tmp
git merge tmp
git push
git push命令用于向远程分支推送数据,完整命令如下:
git push <远程分支名> <本地分支名>:<远程分支名>
如果省略分支名和主机名(说明只有一个远程主机),则会向与之存在追踪关系的分支推送,如果远程分支不存在,则会新建。
如果省略本地分支名,向远程分支推送一个空的分支,则表示删除指定的远程分支。
git push origin :master
上述命令表示删除远程主机的master分支。
不带任何参数的git push, 默认只推送当前分支,这叫做simple方式,git2.0之后的版本默认采用这种方式,在Git2.0版本之前,默认采用matching的方式,会推送所有有对应远程分支的本地分支(有关git pull / push的默认行为,在另一篇博客中记录)。可使用git config命令修改git push 默认配置。
git config --global push.default <pattern-name>
在推送过程中,如果本地分支版本落后于远程分支,推送将被中断,可执行git pull命令将本地分支更新到最新版本(更推荐使用fetch + merge命令),然后再向远程推送。或者使用–force 强制将本地分支推送,这样远程主机上的更新版本将会被覆盖,这个选项要慎用。