git分支管理

1、本地仓库分支

查看分支

git branch
# 查看详细信息
git branch -v

查看所有分支(包括远程分支)

git branch -a

创建分支

git branch <name>

切换分支

git checkout <name>
# 或者
git switch <name>

创建+切换分支

git checkout -b <name>
# 或者
git switch -c <name>

删除本地分支

git branch -d <name> # 会在删除前检查merge状态(其与上游分支或者与head)。
git branch -D <name> # 是git branch --delete --force的简写,它会直接删除。

2、远程仓库分支

查看远程分支

git branch -r

新建远程分支

# 1)可以在gitlab、github、gitee等管理网站上手动新建分支。
# 2)本地推送,命令如下:
git push -u origin <本地分支name>:<远程分支name>
# 例如:
git push -u origin eee:fff
# 其中origin为远程仓库别名,eee为本地分支名称,fff为远程分支名称,
# 推送后本地分支eee和远程仓库分支fff自动建立关联关系。
# 也可以这样:
git push -u origin nnn
# nnn为本地分支名称,这样就会默认新建一个远程分支,名称为nnn。

删除远程分支

# 1)可以在gitlab、github、gitee等管理网站上手动删除分支。
# 2)本地删除远程分支:
git push origin --delete <远程分支name>
git push origin :<远程分支name>
# 例如:
git push origin --delete ccc  # 删除远程仓库ccc,origin为远程仓库别名。
git push origin :ddd # 删除远程仓库ddd。

3、建立本地分支与远程仓库分支关联关系

查看本地分支和远程分支关联情况:

git branch -vv

# 命令执行情况如下:
$ git branch -vv
* bug    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
  master b61f60d [origin/master] 888

# 第一列是本地分支,第三列是建立了关联关系的远程分支,本地分支和远程分支名称可以不一样。

将本地的分支和远程的分支进行关联,设置过关联之后我们只需要git push和git pull就可以更新和推送这个分支了,本地分支会自动推送到关联的分支,会方便很多。

本地分支与远程分支建立关联关系

(1)用 git checkout 命令关联

使用git checkout命令时,添加-b 参数,相当于创建了新分支后并进行分支切换。对于新创建的分支可以直接指定关联的远程分支:

# 拉取远程分支origin/branch到本地并创建一个新的关联分支
git checkout -b <本地分支名称> <远程仓库别名>/<远程分支名称>
# 命令执行情况如下:
$ git checkout -b ccc origin/bbb
Switched to a new branch 'ccc'
branch 'ccc' set up to track 'origin/bbb'.

ThinkPad@DESKTOP-BLPTGC0 MINGW64 /d/gittest/test (ccc)
$ git branch -vv
  bug    5abc3e7 [origin/bbb] rm777
* ccc    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
  master b61f60d [origin/master] 888
# 成功新建并切换到本地分支ccc,本地分支ccc和远程分支bbb建立了关联关系。
# 从上面的执行情况可以看出,一个远程分支可以关联多个本地分支。
# 这个地方的远程分支前面就要加上远程仓库的别名,中间以/隔开。

(2)用 git branch 命令关联

git branch命令本身就是操作分支的命令,借助--set-upstream-to 参数,就是来指定关联上远程分支的:

# 将本地newbranch分支与远端branch分支关联
git branch --set-upstream-to=<远程仓库别名>/<远程分支名称> <本地分支名称>
# 命令执行情况如下:
$ git branch --set-upstream-to=origin/bbb ddd
branch 'ddd' set up to track 'origin/bbb'.

ThinkPad@DESKTOP-BLPTGC0 MINGW64 /d/gittest/test (ccc)
$ git branch -vv
  bug    5abc3e7 [origin/bbb] rm777
* ccc    5abc3e7 [origin/bbb] rm777
  ddd    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
  master b61f60d [origin/master] 888
# 成功将本地分支ddd与远程仓库分支bbb建立了关联关系。
# 从上面的执行情况可以看出,一个远程分支可以关联多个本地分支。
# 这个地方的远程分支前面就要加上远程仓库的别名,中间以/隔开。

第二种方法,在当前分支下执行命令git branch -u 远程分支,表示将当前分支关联到远程分支上。

#在当前分支上执行以下命令
git branch -u 远程分支

(3)用 git push 命令关联

git push命令本身时推送远程分支的命令,借助--set-upstream 参数,可以指定关联上远程分支:

# 将本地分支上传到远端,同时关联newbranch和远端branch分支
git push --set-upstream <远程仓库别名> <本地分支名称>:<远程分支名称>
# 命令执行情况如下:
$ git push --set-upstream origin fff:fff
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'fff' on Gitee by visiting:
remote:     https://gitee.com/xxxxx/gittest/pull/new/xxxxx:fff...xxxxx:master
To https://gitee.com/xxxxx/gittest.git
 * [new branch]      fff -> fff
branch 'fff' set up to track 'origin/fff'.

$ git branch -vv
  bug    5abc3e7 [origin/bbb] rm777
* ccc    5abc3e7 [origin/bbb] rm777
  ddd    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
  fff    5abc3e7 [origin/fff] rm777
  master b61f60d [origin/master] 888
# 成功将本地分支fff的内容推送到远程分支fff上,并建立了关联关系。
# 这种方式不需要先建立远程分支,命令会自动创建远程分支,类似于以下命令:
git push -u origin eee:fff

通过git checkout方式和git branch方式建立本地分支与远程分支关联关系的前提是远程分支必须首先存在,不然会报错;而通过git push的方式不需要远程分支存在,会自动创建远程分支。git branch方式更为直接,将本地分支与远程分支关联好之后,就可以进行git pull 或git push 等操作了。

为了让本地知道远程有些分支已经删了,刷新本地与远程仓库的同步:

git remote prune <远程仓库别名>
# 命令执行情况如下:
$ git branch -vv
  bug    5abc3e7 [origin/bbb] rm777
  ccc    5abc3e7 [origin/fff] rm777
  ddd    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
* eee    5abc3e7 [origin/bbb] rm777
  fff    5abc3e7 [origin/fff] rm777
  master b61f60d [origin/master] 888

$ git remote prune origin
Pruning origin
URL: https://gitee.com/jxy123456jxy/gittest.git
 * [pruned] origin/fff

$ git branch -vv
  bug    5abc3e7 [origin/bbb] rm777
  ccc    5abc3e7 [origin/fff: gone] rm777
  ddd    5abc3e7 [origin/bbb] rm777
  dev    b61f60d [origin/dev] 888
* eee    5abc3e7 [origin/bbb] rm777
  fff    5abc3e7 [origin/fff: gone] rm777
  master b61f60d [origin/master] 888
# 命令执行后,远程分支后有gone字样代表该远程仓库分支已被删除。 

(4)解除本地分支与远程分支的关联关系

#切换到要解除关联的分支上,执行以下命令
git branch --unset-upstream

4、拉取分支

(1)拉取指定的远程分支代码。

第一使用clone命令方式:

# 这种方式默认克隆master分支的代码。
git clone <远程仓库地址>
# 克隆指定分支的代码。
git clone -b <远程分支名称> <远程仓库地址>
# 命令执行情况如下:
$ git clone -b bbb https://gitee.com/jxy123456jxy/gittest
Cloning into 'gittest'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 14 (delta 1), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (1/1), done.

$ git branch -a
* bbb
  remotes/origin/HEAD -> origin/master
  remotes/origin/bbb
  remotes/origin/dev
  remotes/origin/master

# 可以看到只拉取了远程分支bbb到本地,而远程分支有三个。

第二是建立本地分支与远程分支关联关系,然后使用git pull命令:

# git checkout方式
$ git checkout -b ccc origin/dev
Switched to a new branch 'ccc'
branch 'ccc' set up to track 'origin/dev
$ ls
666.txt  777.txt  888.txt
# 成功建立了本地分支ccc,并拉取了远程分支dev的内容。

# git branch方式
# 需要先手动新建本地分支。不然会报错。
$ git branch --set-upstream-to=origin/dev ddd
fatal: branch 'ddd' does not exist
# 没有本地分支ddd报错,需要手动新建本地分支ddd。
$ git branch ddd
$ git branch --set-upstream-to=origin/dev ddd
branch 'ddd' set up to track 'origin/dev'.
# 成功拉取了远程分支dev的内容。
$ git branch -vv
  bbb 5abc3e7 [origin/bbb] rm777
  ccc b61f60d [origin/dev] 888
* ddd b61f60d [origin/dev] 888
# 本地分支ccc和ddd都和远程分支dev建立了关联关系。

(2)fetch和pull的区别

找到一篇讲的不错的博客,地址为:git fetch和git pull之间的区别_git fetch 和git pull区别_sean-zou的博客-CSDN博客

07-15 06:48