Git push 和 Git pull

Git push 和 Git pull

git pushgit pull 用于向远程分支推送文件,以及从远程分支拉取文件等。

远程版本库地址

.git/config 文件中记录了当前仓库远程版本库的地址:

vi .git/config

直接修改这个地址保存后,当前版本库的远程版本库的地址也就变化了。Git 本身也提供了用来操纵版本库地址的命令

# 添加远程版本库地址
git remote add origin [email protected]:facebook/react.git

# 更新远程版本库地址
git remote set-url origin [email protected]:facebook/react.git

push 和 pull

push 命令和 pull 命令的语法相似:

git push <remote_name> <branch_name>
git pull <remote_name> <branch_name>

不带参数,执行命令 git push 的过程(git pull 同理):

  • 如果当前分支有 remote(如何知道是否有 remote?还是看 .git/config 文件,如下图所示,每个 branchremote 都不是空的),那么 git push 相当于执行了 git push <remote>
  • 如果没有设置,则相当于执行 git push origin

一般而言,你这个项目本身应该只有一个版本库地址,如下图所示,版本库的名称就叫做 origin,它的地址就是 url 后面的那一部分:

一般情况下,在日常开发过程中,直接使用不带参数git pushgit pull 命令就可以完成当前分支文件的推送和拉取操作。

git push -u

部分程序员在 git push 的时候,会加上 -u 这个参数,这个主要目的是为了能够使用不带参数的 git pull 命令,更方便地拉取分支代码。其相当于是下面两条命令的结合(master 也可以换成其它分支名字,此处仅仅是一个例子):

git push -u origin master
git push origin master ; git branch --set-upstream master origin/master

假如我们本地新建了一个分支,git push 不带 -u,你 git pull 的时候,git 会提示你不能直接这样用:

$ git checkout -b test
$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

假设 git push 的时候,带上了 -u 这个参数:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

fetch

git fetch 也可以拉取远程分支的文件,它和 git pull 的不同之处在于,它不会自动执行 git merge

git pull = git fetch + git merge

参考

扫描下面二维码,在手机端阅读: