本文主要总结 git 远程的相关命令,多用就能熟练起来,同时好记性不如烂笔头,形成文档沉淀下来。

1. 增删改查远程仓库

与远程仓库相关的命令,都会在 git 后面带上一个 remote

添加远程仓库:

1
2
3
$ git remote add <远仓别名> <远仓地址>
# 例如:
# $ git remote add origin git@github.com:irm-github/webpack-simple.git

克隆远程仓库,如果不指定分支,则自动 clone 主干

1
2
3
$ git clone <远仓url> [本地路径(可省略)]
# 例如:
# $ git clone git@github.com:ironmaxtory/webpack-simple.git

如果仅需要克隆指定分支:

1
2
3
$ git clone -b <指定分支名> <远仓url>
# 例如:
# $ git clone -b dev git@github.com:ironmaxtory/webpack-simple.git

克隆远程仓库的时候,会自动将远仓别名默认为 origin,如果需要自定义:

1
2
3
$ git clone -o <自定义远仓别名> <远仓url>
# 例如:
# $ git clone -o webp git@github.com:ironmaxtory/webpack-simple.git

删除远程仓库:

1
2
3
$ git remote remove <远仓别名>
# 例如:
# $ git remote remove origin

重命名远程仓库:

1
2
3
$ git remote rename <旧别名> <新别名>
# 例如:
# $ git remote rename origin neworigin

查看本地所添加的所有远程仓库

1
$ git remote -v # git remote --verbose

查看远程仓库的详细信息

1
2
3
$ git remote show <远仓别名>
# 例如:
# $ git remote show origin

2. 增删改查远程仓库下的分支

新增远程仓库下的分支,需要 push 本地的分支到远仓下,并同时命名远仓下要新建的分支:

1
2
3
$ git push <远仓别名> <本地分支>:<远仓下需新建的分支名>
# 例如:
# $ git push origin localbr:remote_new_br

如果想将本地所处分支,推送到远仓,同时也在远仓下新增对应分支:

1
2
3
$ git push <远仓别名> <远仓下需新建的分支名>
# 例如:
# $ git push origin feature/some

删除远程仓库下的分支很简单,push 一个空的分支到远仓下并指定要删的分支名:

1
2
3
4
5
6
7
8
$ git push <远仓别名> :<远仓下需删除的分支>
# 或者
$ git push <远仓别名> --delete <远仓需删除的分支>

# 例如:
# $ git push origin :remote_del_br
# 或者
# $ git push origin --delete remote_del_br

同步修改远程仓库下的分支名,实际方法是先删除远仓分支,再新建:

1
2
3
4
5
6
# 重命名本地分支
$ git branch -m <本地旧分支名> <本地新分支名>
# 先删除远仓分支
$ git branch <远仓别名> :<远仓旧分支名>
# 再新建远仓分支
$ git branch <远仓别名> <本地新分支名>:<远仓新分支名>

查看远程仓库下的所有分支:

1
2
3
4
# 仅查看远仓下的所有分支
$ git branch -r
# 查看远仓和本地的所有分支,有颜色区分,推荐
$ git branch -a

3. 推送改动到远仓下的分支

推送本地分支改动到远仓下对应的分支,如果远仓没有,则自动新建:

1
2
3
4
$ git push <远仓别名> <分支名>
# 例如:将本地的 master 分支推送到远仓下的 master 分支
# 不管本地当前所处分支
# $ git push origin master

推送本地分支改动到远仓下的指定分支:

1
2
3
$ git push <远仓别名> <本地分支>:<远仓分支>
# 例如:将本地的 dev 分支改动推送到远仓下的 master 分支
# $ git push origin dev:master

不带任何参数的 git push,有两种推送方式:

  1. simple 方式,即只推送当前分支,Git 2.0 之后为默认方式;
  2. matching 方式,即推送所有有对应远程分支的本地分支,是 Git 2.0 之前的默认方式;

如果要修改该配置,则可以采用如下命令:

1
2
3
$ git config --global push.default matching
# 或者
$ git config --global push.default simple

推送本地的所有分支,不管远仓有没有对应的分支:

1
$ git push --all origin

4. 拉取远仓分支的改动到本地而不自动合并

多人协作的情况下,要同步别人的修改,旧要将别人 push 到远仓分支下的改动拉取到本地分支;接下来看一下各种情况。

拉取远仓所有分支的改动,但不会合并到本地分支:

1
$ git fetch <远仓别名>

假设远仓下共有两个分支:masterdev 分支,且都做了改动。git fetch origin 会将该两个分支的改动都 fetch 到本地。

仅拉取远仓指定分支的改动,不合并到对应的本地分支:

1
$ git fetch <远仓别名> <分支名>

所取回的更新,要以 <远仓别名>/<分支名> 的形式读取,即例如 origin/masterorigin/dev 读取,且其不会自动新建为本地分支。

fetch 完之后,如果要读取更新的日志:

1
2
3
$ git log <远仓别名>/<分支名>
# 例如:
# $ git log origin/master

fetch 完之后,如果要 diff 本地所处分支 HEAD 区与远仓分支所更新的内容:

1
2
3
$ git diff <远仓别名>/<分支名>
# 例如:
# $ git diff origin/master

如果查看完成之后,想要采取更新合并到本地对应分支:

1
2
3
4
# 要先确认本地所处分支,以下 merge 命令会将指定分支合并到本地
$ git merge <远仓别名>/<分支名>
# 或者
$ git rebase origin/master

如果在本地是不存在对应的远仓分支,且又想要创建的话,则在 fetch 完所有更新或者仅对应的远仓分支,可以在本地基于远仓分支新建:

1
2
3
4
$ git checkout -b <本地新分支名> <远仓别名>/<对应分支名>
# 例如:
# $ git checkout -b dev origin/dev
# $ git checkout -b feature/some origin/feature/some

5. 拉取远仓分支的改动到本地且自动合并

这种情况下,需要使用 pull 命令。该命令的作用是:取回远仓的分支更新,再自动与本地的指定分支合并。

取回远仓指定分支的更新,并与本地的指定分支合并:

1
2
3
$ git pull <远仓别名> <远仓分支名>:<本地分支名>
# 例如:
# $ git pull origin next:master

取回远仓指定分支的更新,并与本地的当前所在分支合并:

1
2
3
$ git pull <远仓别名> <远仓分支名>
# 例如:
# $ git pull origin master

注意:当本地提交了改动以后再添加远程仓库,想要 pull 的时候,有可能会提示:

1
fatal: refusing to merge unrelated histories

这是为了防止开发者上传错误,如果开发者确定无误,就可以执行如下:

1
$ git pull <远仓别名> [<远仓分支名>:]<本地分支名> --allow-unrelated-histories

6. 建立远程分支追踪关系

在某些场合,git 会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在 git clone 的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的 master 分支自动”追踪” origin/master 分支。

也可以后续手动建立追踪关系:

1
2
# 指定 dev 分支追踪 origin/dev 分支
$ git branch --set-upstream-to dev origin/dev

如果当前分支与远程分支存在追踪关系,git pullgit push 就都可以省略远程分支名:

1
2
3
4
5
# 拉取对应的远仓分支到本地所处分支
$ git pull origin

# 推送本地所处分支到对应的远仓分支
$ git push origin

如果当前分支与多个远仓存在追踪关系,则可以使用 -u 选项指定一个默认主机,这样后续就可以不加任何参数地使用 git push

1
$ git push -u origin <分支>