50

git远程操作相关命令(remote 、push、fetch 、pull)

 4 years ago
source link: https://www.tuicool.com/articles/vq6za2f
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

git remote

为了便于管理,Git要求每个远程仓库都必须指定一个仓库名。为了便于管理,Git要求每个远程仓库都必须指定一个仓库名。

  • git remote【查看创库名】
git remote

在我们clone了刚才的项目之后,默认会看到一个origin的远程仓库

  • git remote -v/--version 【查看仓信息】

显示出详细的url地址名和对应的别名.

如:

origin  git@github.com:zhaoJoeyuan/TestTwo.git (fetch)
origin  git@github.com:zhaoJoeyuan/TestTwo.git (push)
  • git remote add 【添加远程仓库】

命令:

git remote add name url 

如:

git remote add joey git@github.com:zhaoJoeyuan/Test.git

添加后,用git remote -v 查看

joey    git@github.com:zhaoJoeyuan/Test.git (fetch)
joey    git@github.com:zhaoJoeyuan/Test.git (push)
  • git remote remove 【删除添加的远程库】
命令:git remote remove name 
  • gi remote show 【查看指定仓库的详细信息】

命令:

git remote show 仓库名

git push

git push命令用于将本地分支的更新,推送到远程仓库。它的格式与git pull命令相仿。

git分支推送/拉取顺序的写法是<来源地>:<目的地>所以push和pull肯定是相反的,push来源地是本机,pull的来源地是远程。

1. 完整写法

命令:

git push <远程仓库名> <本地分支名>:<远程分支名>

注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

如:

git push origin master2master2

将本地的master分支推送到远程库的master分支,如果远程分支不存在将会被创建。

2. 省略本地分支名

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。注意第一个分支(origin/master)是不可以被删除的,

命令:删除远程分支

git push origin :远程分支名   # origin后面有一个空格

或 git push origin --delete :远程分支名

或 git push origin :远程分支名 --delete

3. 省略远程分支名

如果省略远程分支名,则表示将本地分支推送到与之存在Tracking(追踪关系)的远程分支,通常两分支同名。如果远程分支不存在,则会自动创建分支。

如:

git push origin master

上面命令表示,将本地的master分支推送到origin仓库的master分支。如果后者不存在,则会被新建。

以上当前分支与远程分支没存在追踪关系,就是谁也不是谁的upstream/downstream。

4. 全部省略

如果当前分支只有一个追踪分支,那么仓库名都可以省略。

git push

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

git push -u origin master

上面命令将本地的master分支推送到originck,同时指定origin为默认仓库,后面就可以不加任何参数使用git push了。

不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。

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

还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程仓库,这时需要使用--all选项。

$ git push --all origin

上面命令表示,将所有本地分支都推送到origin仓库。

如果远程仓库的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程仓库。这时,如果你一定要推送,可以使用--force选项。

$ git push --force origin

上面命令使用--force选项,结果导致远程仓库上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。

最后,git push不会推送标签(tag),除非使用--tags选项。

$ git push origin --tags

git fetch 从远程拉取更新到本地

这里代码只是拉到了到本地仓库,而不是工作目录

理解fetch

理解fetch 的关键,是理解FETCH_HEAD。

FETCH_HEAD指的是: 某个branch在服务器上的最新状态'.

每一个执行过fetch操作的项目'都会存在一个FETCH_HEAD列表, 这个列表保存在 .Git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支.当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.

一般来说, 存在两种情况:

  • 如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD.
  • 如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD.

git fetch <远程仓库名> ,将某个远程仓库的更新,全部取回本地仓库

命令:

git fetch <远程仓库名>

将远程仓库的所有分支都拉取到本地

fetch 后不带分支名,则是所有仓库里的分支

注意:所取得的远程分支在本地仓库上要用"远程仓库名/分支名"的形式读取。比如origin仓库的master,就要用origin/master读取。

取回特定分支的更新,可以指定分支名

命令:

git fetch <远程仓库名> <分支名>

git fetch <远程仓库名>   <远程分支名>:<本地分支名>

常见的git fetch 使用方式包含四种:

  • 1.git fetch

命令:

git fetch

这一步其实是执行了2个关键操作:

  1. 创建并更新所有远程分支的本地远程分支;
  2. 设定当前分支的FETCH_HEAD为远程服务器的master分支(上面说的第一种情况) 需要注意的是,和push不同,fetch会自动获取远程分支“新加入”的分支
  • 2.git fetch origin

命令:

git fetch origin

功能同上,只不过手动指定了remote

  • 3.git fetch origin <远程分支名>

命令:

git fetch origin <远程分支名>

这个命令可以用来测试远程仓库的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.

  1. git fetch origin <远程分支名>:<本地分支名> 命令:
git fetch origin <本地分支名>:<远程分支名>

使用远程<远程分支名>分支在本地创建<本地分支名>(但不会切换到该分支), 如果本地不存在<本地分支名>分支, 则会自动创建一个新的<本地分支名>分支, 如果本地存在<远程分支名>分支, 并且是 fast forward , 则自动合并两个分支, 否则, 会阻止以上操作。

<本地分支名>和<远程分支名>同名,则等价于 git fetch origin :<远程分支名>

git pull

取回远程仓库某个分支的更新,再与本地的指定分支合并

完整命令

git pull <远程仓库名> <远程分支名>:<本地分支名>

注意这个远程分支名是不带origin/的前缀的(别名的前缀),有冲突的时候修改冲突即可,修改完毕add、commit

非完整,省略当前<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin <远程分支名>

上面命令表示,取回origin/<远程分支名>分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

git pull & git fetch

git pull origin <远程分支名>

等价于

git fetch origin
git fetch origin/<远程分支名>

省略2个分支名

如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

git pull origin

上面命令表示,本地的当前分支自动与对应的origin仓库"追踪分支"(remote-tracking branch)进行合并。

如果当前分支只有一个追踪分支,连远程仓库名都可以省略。

git pull

取得远程分支以后有两种处理方式:

  • 1.基于远程分支直接在本地创建一个新分支

命令:

git checkout -b <本地分支名> origin/<远程分支名>

上面是完成的写法,其他写法如下:

git checkout -b <本地分支名> 
#基于<本地master分支>而创建

git checkout -b <本地分支名> orgin 
# 基于<远程master分支>而创建

git checkout -b <本地分支名> <本地分支名2>
# 基于<本地分支2>而创建

基于远程创建一定要带orgin(远程仓库名)/ 的前缀,否则都是基于本地分支创建,如果没有跟分支名,则是以默认的master而创建(可以是远程master,也可以是本地master,看是否有origin前缀)

  • 2.git merge命令或者git rebase 命令,在本地分支上合并远程分支。

命令:

git merge origin/master
 
 git rebase origin/master

在本地分支上(当前分支)合并远程分支

Git手动建立追踪关系。

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

git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。

如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。 git pull origin

上面命令表示,本地的当前分支自动与对应的origin仓库"追踪分支"(remote-tracking branch)进行合并。

如果当前分支只有一个追踪分支,连远程仓库名都可以省略。 git pull

上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

如果合并需要采用rebase模式,可以使用--rebase选项。

git pull --rebase <远程仓库名> <远程分支名>:<本地分支名>

如果远程仓库删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程仓库,导致git pull不知不觉删除了本地分支。

但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

$ git pull -p
# 等同于下面的命令
$ git fetch --prune origin 
$ git fetch -p

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK