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 pull
,git 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目录下
参考: