Git – Push 和 Pull 篇

git push

将本地仓库的更新推送到远程仓库 remote

git push [remote-name] [branch-name]

git push origin master

1
2
3
4
5
6
# 如果当前分支跟远程分支有 tracking 关系,那么将会自动推送当前分支到对应的远程分支
# 如果没有 tracking 关系,则报错
git push origin

# 如果主机名只有一个 origin,那么连 origin 都可以省略
git push

查看 tracking 关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat ./.git/config

# 此时没有 tracking 关系
==>
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
[remote "origin"]
  url = git@github.com:linjunzhu/test_branch.git
  fetch = +refs/heads/*:refs/remotes/origin/*

添加 tracking 关系

1
2
3
4
5
git push -u origin dev  (这句同时指定了 origin 为默认主机)
或者
git branch -u dev origin/dev
或者
git push --set-upstream origin master

查看 tracking 关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat ./.git/config

# 此时有 tracking 关系
==>
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
[remote "origin"]
  url = git@github.com:linjunzhu/test_branch.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master

git pull

拉取更新

将远程仓库的更新拉取到本地的「远程仓库」并且进行「merge」操作

1
2
3
4
5
$ git pull origin master

# 相当于两步操作
$ git fetch origin master
$ git merge origin/master

Tips

1、如果当前分支跟远程分支是没有 tracking 关系的,那么执行git pull后,会报错

2、如果当前分支有 tracking 关系,会 download 远程仓库的所有分支代码到本地的 origin/分支上,但是只会合并当前分支,其他分支相当于 git fetch 命令一样。

git pull 和 git fetch 的使用区别

  1. git pull origin master: 意思是从远程端下载最新版本到当前分支,并且自动合并

  2. git fetch origin master: 意思是从远程端下载最新版本到当前分支,但是并不合并。因此如果是git fetch 的话,就需要做两步操作。

1
2
3
4
5
6
7
8
9
git fetch origin master

git log -p master origin/master   (查看修改内容)

git  merge orgin/master    (合并分支)

或者进行 rebase

下章讲解

Tips

一、不带任何参数的 git push有两种模式

  1. matching模式,会推送所有对应远程分支本地分支
  2. simple模式,只推送当前分支 (如果有 tracking 关系的话)

默认没有设置,需要打下命令

1
git config --global push.default simple

二、关于pushandpull

一般如果没把握,最好写全。

1
2
git push origin dev
git pull origin dev

三、切换远程分支

当小伙伴的新建分支 push 到远程分支,我们也想要拉取这条分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 无论有无 tracking, git fetch 都会拉取所有分支
git fetch origin test_branch

# 拉取所有分支
git fetch

# 或者直接在有 tracking 关系的分支上(拉取所有分支,但只合并当前分支)
git pull

git checkout test_branch

# 也可以直接本地创建分支,然后 pull 下
git checkout -b test_branch -t
git pull origin test_branch