分支与远程仓库
# 一、分支和Tag
分支和Tag其实就是 commitId 的指针。所以很多时候对commitId的操作,也可以替换为对分支/tag操作,反之也一样。
由于对分支的操作太基础了,就简单写几个。
创建分支一般不用 git branch -a
,更多的是直接指定一个源分支,创建并切换到新分支:
git checkout -b branchName master
创建分支不仅限于从分支创建,还可以从 commitId、tag 创建:
#从某个commitId 创建分支
git checkout -b newBranch <commitId>
# 从tag创建
git checkout -b newBranch v1.0
# 二、远程仓库
# 1.建立关系 remote
我们clone 下仓库时,git 自动将本地的仓库和远程的仓库关联了起来。通过 git remote -v
指令可以看到:
$ git remote -v
origin git@gitee.com:xxx/yyy.git (fetch)
origin git@gitee.com:xxx/yyy.git (push)
其中前者为仓库别名,后者为仓库地址。
如果原本只有本地仓库,现在想和远程仓库建立联系,可以手动添加:
#git remote add <仓库别名> <仓库地址>
git remote add origin git@gitee.com:xxx/yyy.git
还可以通过换别名的方式添加多个
git remote add github git@gitee.com:xxx/yyy.git
也可以删除
git remote remove github git@gitee.com:xxx/yyy.git
# 2.推送 push
git push 的全命令应该是 git push <仓库别名> <本地分支>:<远程仓库的分支>
如
git push origin master:master
一般情况下,本地分支和远程分支一致,所以后面的分支名是可以省略掉的
git push origin master
一般本地分支和远程分支要一致,虽然不一致也能用。
但是正规的用法下都是一样的正确结果,不正规的用法下会各有各的死法。
所以不要搞骚操作。
如果将本地分支和远程分支建立上下游关系,可以连后面的一起省掉。
# 注意这里的远程分支是 origin/dev
git branch --set-upstream-to=origin/master master
如果够细心,会发现平时使用全命令时,git会给出提醒,建议我们在push的时候就做关联:
# 短参数
git push -u origin master
# 长参数(效果一样)
git push --set-upstream origin master
然后就可以直接执行 git push 和 git pull 了
# 3.远程分支的本地映射
远程仓库在本地是有映射的 git branch 有很多参数,其中 -r
就是看远程分支,-a
是看所有分支
$ git b -r
origin/HEAD -> origin/master
origin/master
$ git b -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
那么我们在创建分支的时候,还可以直接用远程分支创操作,创建的分支会自动做 upstream关联。
git checkout -b branchName origin/branchName
如果我们尝试checkout到远程分支(不加-b
),git会为我们自动创建一个本地分支并关联
#效果如同 git checkout -b branchName origin/branchName
git checkout branchName
# 三、理解pull操作
# 1.pull的完整命令
pull 的完整命令应该是 git pull <仓库别名> <远程分支>:<本地分支>
如
git pull origin master:master
冒号后面可以省略,变为git pull origin master
如果做了upstream管理,可以省略为 git pull
pull 其实封装了两个操作, pull = fetch + merge
# 2.git fetch
fetch是更新本地的远程分支,如 git fetch origin master
更新的就是 origin/master
。
如果我们不想更新本地的分支,只想看看远程的代码(怕冲突),这个指令还是很合适的:可以先fetch,然后新建一个别的分支来对比,如:
git fetch origin master
git checkout -b master2 origin/master
再看 pull 就可以理解为,更新本地远程分支 并且 把远程分支 merge 到当前分支。
git fetch origin master && git merge origin/master