一,远程仓库
1.1添加远程库
- git init
初始化,变为一个本地仓库
- git remote add origin url
把本地库和远程库关联,url是远程仓库的地址,设置一个变量orgin(英文中库的意思)来保存远程库在本地的引用,remote是关键字,英文中是“远程”的意思
说明:git remote remove origin 取消本地仓库关联远程仓库
- git push -u origin master
把本地库的所有内容推送到远程库上面,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 (origin代表远程库)
- git push origin master
此后推送最新的修改,就可以简化了
但是这样通过添加远程仓库来关联本地仓库过于麻烦,有没有什么好的方式呢?有的!!!
1.2克隆仓库
- git clone url
Git 的 clone 命令会为你自动将远程仓库命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为origin/master(origin/master可以看作远程仓库master分支在本地仓库中的一个镜像)。同时Git 也会给你一个与 origin/master 分支在指向同一个地方的本地 master 分支
问题:如果此时远程仓库中除了master分支,还有bug,dev分支,那么克隆以后,本地仓库中会不会有bug,dev分支呢?
答案: 有的 !
但是我们需要注意的是,克隆以后,本地仓库通过:git branch命令查看本地仓库分支列表会发现没有bug,dev分支,只有master分支!
这是因为克隆在抓取远程仓库的时候是执行git clone,git clone会把远程仓库中所有的分支数据抓取下来,抓取下来的分支在本地会被命名为origin/master origin/dev origin/bug,抓取结果是直接送到版本库(Repository)中,本地的工作区(workspace)不会自动生成一份可编辑的副本。
那为什么本地仓库中git branch 可以看的到master分支而看不到dev bug分支呢?前面已经说了: 同时本地仓库Git 也会给你一个与 origin/master 分支在指向同一个地方的本地 master 分支 (也就是说在工作空间中只有本地仓库Git给的master分支)。但是本地仓库Git不会自动帮你创建你一个与 origin/dev 分支在指向同一个地方的本地 dev 分支 ,bug分支也是一样的。本地仓库Git只会自动创建和master/origin指向同一个地方的master 分支。所以本地仓库Git通过git branch命令只能看的到master分支(git branch 看到的只是工作空间中存在的分支,而git branch -r 可以看到抓取下来并保存到本地仓库的版本库中的 origin/master origin/dev origin/bug 分支 ),同时master分支上内容和远程仓库中的master分支内容是一样的(因为本地仓库中master分支和镜像origin/master分支是指向同一个地方)。
二,切换到dev分支进行开发
本地仓库新建一个dev分支,然后将这个本地仓库dev分支与远程仓库的dev分支关联起来
- git checkout master
切换到master主分支上,然后在主分支上建dev分支,当分支很多的时候,这样子不会凌乱,当然你也可以在其他分支上建dev分支
- git checkout -b dev
在主分支master上创建并切换到dev分支
git branch dev 创建分支
git checkout dev 切换分支
- git branch --set-upstream-to=origin/dev dev
然后把远程仓库的dev分支和本地的dev分支关联起来
总结:种把本地dev分支与远程dev分支关联起来是基于克隆仓库时候抓取到本地仓库中版本库(Repository)中的origin/dev
但是这样写太麻烦,下面是简介命令的写法
- git checkout -b dev origin/dev
注意:不需要git checkout master,因为此时本地仓库Git新建的dev是在本地仓库中版本库中的 origin/dev的基础上新建的,和本地仓库Git中的master分支没有关系(即dev分支不是在master分支上面建的)
现在通过git branch 可以看到有master分支和dev分支,本地dev分支和远程仓库中dev分支上的内容也是一致的(因为本地仓库中dev分支和镜像origin/dev分支是指向同一个地方)。
!!!顺便提一下,git fetch也是拉取远程分支到本地版本库中,如果克隆以后,远程仓库又新建一个feature分支,应该如何操作呢?
这里是不需要先git checkout master,因为git fetch是拉取所有远程分支到本地仓库的版本库里面,在任何一个本地仓库的分支上都可以操作,和master分支没有关系。
- git fetch
首先应该先git fetch拉取新的镜像origin/feature到版本库,因为本地仓库的版本库中没有分支origin/feature的信息
- git checkout -b feature origin/feature
现在本地feature分支和远程仓库feature分支上的内容也是一致的(因为本地仓库中feature分支和镜像origin/feature分支是指向同一个地方),同时本地仓库Git新建的feature是在本地仓库中版本库中的 origin/feature的基础上新建的
三,如果本地仓库需要新建一个plane分支,并在上面开发一个新的功能,可是远程仓库上面没有这个分支,应该怎么办?
- git checkout master
切换到主分支上,在主分支上建dev分支,为了保持逻辑清晰
- git checkout -b plane
创建并切换到plane分支,此时仅为一个本地分支,还没有同步到远端
- git push origin plane(origin是远程仓库的别名)
这里的含义是将plane这个分支提交到远程仓库上面。如果远程仓库没有这个分支,那么也会新建一个该分支。
- git push --set-upstream origin plane
然后建立两个分支之间的关联,注意这里建立关联不是关键字branch哈!这是因为没有git fetch,本地版本库中没有origin/plane,不能通过关键字branch建立关联。当然可以git push origin plane之后,再git fetch,再git branch –-set-upstrem-to=origin/plane plane也行。
- git add .
开发功能完毕,添加暂存区
- git commit -m '开发完毕'
提交
- git push origin plane
推送到远程仓库中的plane分支