git远程分支

扫码查看

git clone 命令可以将远程仓库拷贝到本地。下面的命令默认只将master分支拷贝到本地,在当前目录创建一个learngit目录,然后再在讲远程git仓库的内容都拷贝到这个目录下,并创建一个隐藏的/.git目录,自动配置远程仓库名称为origin,将最新版本的仓库内容拷贝到当前工作区。

git clone git@github.com:Richard-coder/learngit.git

如果执行下面命令,git clone 后自动创建的目录为mylearn

git clone git@github.com:Richard-coder/learngit.git mylearn

克隆版远程仓库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。

git clone -o myremote git@github.com:Richard-coder/learngit.git

执行下面命令查看本地分支和远程分支

git branch -a #本地+远程
git branch -r #远程
git branch #本地

执行下面命令查看远程的dev分支,切换后的分支叫做远程跟踪分支,是远程分支origin/dev的引用,但是不能在本地移动。

git checkout origin/dev

但是,如果想在dev分支工作的话,你就需要创建一个本地dev分支。下面的命令会在根据远程的dev分支创建一个本地的dev分支,本地分支名字可以改,但最好与远程分支相同。执行这个命令后会切换到本地分支dev

git checkout -b dev origin/dev

或者使用-t参数,它默认会在本地建立一个和远程分支名字一样的分支

git checkout -t origin/dev

也可以写作:

git  checkout --track origin/dev

git fetch

git fetch命令会从远程仓库拉取本地没有的更新,但不会改变当前工作目录的内容。
默认情况下git fetch取回所有分支(branch)的更新。

git fetch <远程主机名>

如果只想取回特定分支的更新,可以指定分支名。下面命令表示取回origin主机的master分支

git fetch origin master

一般在git fetch后,需要比较本地分支与远程分支的区别,再将获取的更新merge或rebase到当前工作目录。一般使用如下命令:

git checkout dev
git fetch origin dev:tmp
git diff tmp #比较差异后需要解决冲突再merge
git merge tmp
git branch -d tmp #merge后可以删除临时创建的本地分支

git pull

git pull命令相当于git fetch+git merge,即从远程仓库拉取本地没有的最新的更新,然后自动merge。这种方法在容易产生合并冲突,因此一般建议用fetch。其命令格式为:

git pull <远程主机名> <远程分支名>:<本地分支名>

下面的命令表示拉取远程仓库origin的master分支,并与本地的dev分支合并,如果是合并当前工作目录的分支,则冒号及其后面部分可以省略

git pull origin master:dev

使用git clone的时候会在本地分支和对应远程分支之间建立追踪关系(tracking),也可以手动创建追踪关系,下面命令表示本地的dev分支追踪远程的origin/dev分支。

git branch --set-upstream dev origin/dev

如果当前分支与远程分支存在追踪关系,则pull的时候可以省略远程分支名

git pull origin

下面的命令可以看到更多的本地分支信息,比如跟踪关系,是领先还是落后。

git branch -vv

git pull默认使用merge 如果想使用rebase,可以加上rebase参数

git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

如果远程仓库删除了某个分支,那么在pull的时候不会删除对应的本地分支。如果想改变这种行为,即若远程仓库某分支被删除,pull后也相应删除本地分支,则可加上-p参数:

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

git push

使用git clone方式建立的本地仓库,执行了git checkout -b dev origin/dev命令即建立远程分支dev对应的本地分dev之后,会建立相应的追踪关系。便可以在本地开发dev分支,开发完成后使用git push命令推送到远程仓库。

下面的命令相当于将本地的dev分支推送到origin主机的dev分支(无论当前处于哪一个本地分支)。如果后者不存在,则会被新建。

git push origin dev

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果一定要推送,可以使用–force选项。使用–force选项,结果导致远程主机上更新的 大专栏  git远程分支版本被覆盖。除非很确定要这样做,否则应该尽量避免使用–force选项。
常用的情景:别人上传了错误的更新,导致无法push时

git push --force origin

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

git push origin --tags

如果当前分支只跟踪一个远程分支,那么可以省略分支名和远程主机名

git push

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。下面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,并且会建立本地分支与远程的追踪关系(在第一次push的时候)

git push -u origin master

下面命令表示删除origin主机的master分支

git push origin :master
#等同于
git push origin --delete master

git push有两种模式:

  • simple模式—不带任何参数的git push,默认只推送当前分支
  • matching模式—不带任何参数的git push会推送所有有对应的远程分支的本地分支

Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config修改:

git config --global push.default matching/simple

使用添加远程仓库的方式

添加远程仓库

下面命令将为本地仓库添加关联的远程仓库,命名为orign,也可以用其他名字。

git remote add origin git@github.com:Richard-coder/learngit.git

git remote命令用于列出所有远程主机,使用-v选项可以看到远程主机的网址。

git remote -v

git remote show命令加上主机名,可以查看改主意更详细的信息,包括分支和pull,push关系。

git remote show <主机名>

git remote rm命令用于删除远程主机.。

git remote rm <主机名>

git remote rename命令用于远程主机的改名。

git remote rename <原主机名> <新主机名>

删除远程仓库

git remote rm origin

##与远程分支建立追踪关系
工作区新建的分支需要与远程分支建立关系时,使用下面命令建立本地分支dev与远程仓库的dev分支的追踪关系(名字不必相同)

git branch --set-upstream dev origin/dev

下面命令表示将当前工作分支与远程仓库origin的分支dev建立追踪关系

git branch -u origin/dev
#或者
git branch --set-upstream-to origin/dev

下面命令表示先远程仓库建立分支(如果没有)建立追踪关系,然后push本地更新。

git push -u dev origin/dev

注意git pull-u参数无法建立追踪关系。

##fetch pull push##
建立追踪关系后,便可进行fetch pull push等操作,与克隆方式相同。

##跟踪关系详述
远程跟踪分支remote/branch是指远程仓库的分支在本地的引用,只有在发生网络通讯操作时才会移动(即git fetch)。本地分支如果想推送或抓取远程分支的内容,则需要与远程分支建建立跟踪关系。跟踪关系的作用即在本地分支推送或抓取的时候,可以简写git pullgit push命令,不需要加后面的参数。
使用命令git branch -vv可以看到追踪关系。
使用命令git remote show origin可以看到更详细的push和pull关系。
git clone命令会自动建立本地master分支和origin/master分支的跟踪关系。
git checkout -b dev origin/dev从远程分支建立的本地跟踪分支会自动建立相应的跟踪关系。
git branch -u origin/dev或者git branch --set-upstream-to origin/dev或者git push -u dev origin/dev会建立当前分支与远程分支的跟踪关系(虽然git remote show origin不会看到push关系,但经过测试没有影响)

分支保存位置

Git的分支就是保存在.git/refs/heads/命名空间下的引用。当前版本库中的默认分支master就对应于文件.git/refs/heads/master。
fetch取回的之后的更新的保存位置保存在.gitrefsremotesorigin目录下

参考:

  1. Git远程操作详解
  2. git 有用却易忘的知识与命令
01-23 07:33
查看更多