Git中远程操作是我们做多人项目维护时很常使用到的命令,这里总结了一下git指令中remote
,fetch
,pull
, push
的常见用法:
git remote
列出所有的远程仓库,默认为origin
$ git remote
origin
查看远程仓库的网址
$ git remote -v
origin https://bitbucket.org/company/project-ios/src (fetch)
origin https://bitbucket.org/company/project-ios/src (push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。fetch和push对应的都是同一远程地址
显示获取远程引用的完整列表,包括远程分支和tag
$ git ls-remote origin
0185329b020db9043accb4ead02c4709dae1616b HEAD
7c915b5bae1a5f864fbc23ecb533d4e63c4be95b refs/heads/1.0.2
5970a7e8269be2258288b71e922f93b43478a13b refs/tags/1.0.2
获取远程分支的更多信息
$ git remote show origin
* remote origin
Fetch URL: https://bitbucket.org/company/project-ios/src
Push URL: https://bitbucket.org/company/project-ios/src
HEAD branch: master
Remote branches:
1.0.2 tracked
关联远程仓库
$ git remote add <仓库名> <git地址>
删除远程仓库
$ git remote rm <仓库名>
git fetch
说fetch命令之前先说下远程跟踪分支的概念。首先当只有本地分支,或者只有远程分支时,提交记录表现形式为:
当我们本地分支和远程关联之后,就产生两个分支,一个是本地分支:master,一个是关联的远程分支,表示方式为:origin/master。他们指向同一节点:
当本地做了一些本地提交之后会变成这样,远程分支并不会动。
此时如果有其他同事修改了远程master分支的内容,我们需要合并或者查看他的代码,可以执行git fetch origin master
该命令会把远程master更新内容拉下来,此时提交记录表现为:
本地分支和远程关联分支可以说是并行的存在。
具体命令
$ git fetch <仓库名>
执行之后分支情况就变成了
默认情况下,git fetch 取回所有分支更新,如果只想取回特定分支更新,可以指定分支名:
$ git fetch <仓库名> <分支名>
所取回的更新,在本地主机要用“远程仓库名/分支名”的形式读取,比如origin的master,就要用origin/master读取。这还有一种叫法是远程跟踪分支
然后我们就可以使用git merge 或者git rebase 命令,合并远程分支
$ git merge origin/master
# 或者
$ git rebase origin/master
git pull
git pull 相当于取回远程主机某个分支的更新,再与本地的指定分支合并。(git fetch + git merge)
完整格式为
$ git pull <远程主机名> <远程分支名>:<本地分支名>
可以指定,某一远程分支跟某一本地分支合并。如果当前只有一个跟踪分支可以简写为
$ git pull
git pull 默认合并操作时git merge如果我们想用rebase 模式的话,可以加个--rebase参数
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
git push
该命令用于,将本地分支更新推送到远程主机,格式用法跟git pull 差不多。完整格式为:
$ git push <远程主机名> <远程分支名>:<本地分支名>
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin master
上面的命令是将本地master分支退到origin的master分支,如果后者不存在,就新建
如果当前分支与多个主机存在追踪关系,可以使用-u来指定一个默认主机,这样以后就不用加任何参数使用git push了
$ git push -u origin master
以后推送可以不带参数的写git push
了,默认只推当前分支。
如果我们想将本地分支都推到远程主机,可以使用--all参数
$ git push --all origin
如果远程分支跟当前分支有差异,会报错。有两种解决办法,要么我们先git pull合并差异,再git push 要么直接强推,覆盖远程分支
$ git push --force origin
简写命令
$ git push -f