分支与远程仓库

9/14/2022

# 一、分支和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