今天将要分享的内容是:本地分支管理以及远程分支管理。
5 分支管理
前面几天的内容分享了对于Git
分支的相关操作以及如何解决分支合并的时的冲突,这个章节将会介绍一些分支管理的工具或者命令。
5.1 查看分支列表
使用不带有任何参数的git branch
命令可以查看当前项目任何的分支信息,例如:
$ git branch
example
* master
其中,*
表示当前所处的分支,在修改项目文件之前需要确认当前所处的分支。
5.2 查看分支的最新提交内容
使用命令git branch -v
可以查看每个分支上的最新提交内容,例如:
$ git branch
example 3513f4e example<E5><88><86><E6><94><AF><E4><BF><AE><E6><94><B9>
* master fa93460 master<E5><88><86><E6><94><AF><E6><8F><90><E4><BA><A4>
输出结果中包含了每个分支最新提交的简短的ID
以及相关的提交内容。
5.3 查看已合并的分支
使用命令git branch --merged
和git branch --no-merged
可以查看当前分支上合并了哪些分支以及没有合并的分支列表,例如:
$ git branch --merged
* master
$ git branch --no-merged
example
5.4 删除分支
使用命令git branch -d <branch_name>
可以删除本地的指定分支,使用命令git branch -D <branch_name>
可以强制删除某个分支,例如:
$ git branch -d example
Deleted branch example (was 3513f4e).
当待删除分支的上的内容没有完全合并至其他分支时,使用-d
参数会提示告警信息并不能执行该操作,这时可使用-D
选项强制删除,或者将待删除分支的内容合并至其他分支上。
6 远程分支
远程分支是值指向远程仓库的分支的指针,类似于标签,会标记上一次连接远程服务器时远程仓库中每个分支的位置,这些指针存在本地,不可本地移动这些指针,只有当和服务器通信时,才能移动这些指针。
Git
中表示远程分支的形式是:(remote)/(branch)
,其中remote
表示远程仓库的名称,branch
表示远程分支的名称。接下来,一起了解下远程分支与本地分支的一起使用时的相关逻辑流程。
git clone
克隆远程分支到本地,该命令默认将远程仓库的名称设置为origin
,并拉取远程仓库的数据,然后在本地创建指向服务器上maser
分支的指针,并且命名为origin/master
- 本地修改并提交相关内容,本地
master
指针会向前移动但是指向远程仓库分支的指针不会移动
- 其他项目组成员像远程仓库对应的分支上推送了内容,这时本地保留的远程仓库分支的提交历史数据会与服务器上的历史产生偏离
(远程仓库的分支)
(本地仓库的分支)
- 使用
get fetch <remote>
命令与服务器同步,从服务器上获取本地尚未包含的数据,并更新本地数据库,最后移动origin/master
指针到最新的位置上
6.1 推送
完成本地内容修改并提交后,如果想和团队其他成员共享工作成果,需要将其推送到远程仓库。我们需要显式地完成这一步操作,需要注意的是,你需要对这个远程仓库拥有读写权限才能推送成功。
推送的命令是git push <remote> <local_branch>:<remote_branch>
,如果local_branch
和remote_branch
值相同,可以简化该命令git push <remote> <branch>
。
$ git push origin master
表示将本地的master
分支推送至远程仓库的master
分支上。
$ git push origin example:master
表示将本地的example
分支推送至远程仓库的master
分支上。
6.2 拉取
想获取团队其他成员共享的结果时,可以执行拉取,从远程仓库中获取最新的版本,使用的命令是get fetch <remote> <branch>
和git pull <remote> <branch>
。其中,git fetch
只是从服务器上读取数据,需要手动执行git merge
命令进行合并;git pull
相当于执行了git fetch
和git merge
,从服务器的仓库分支上读取数据,并尝试将远程仓库的修改合并到本次分支。一般建议显式地使用git fetch
和git merge
组合命令。
在使用git fetch
时需要注意的一点是,当从服务器上获取远程分支时,如果获取到了本地还没有的新的远程分支,那么Git
并不会自动提供该分支的本地可编辑副本。例如:
$ git fetch origin example
如果example
分支是远程仓库新创建的,并且本地仓库中中不存在对应的分支,那么本地将不会创建的新的example
分支,而只是拥有了指向origin/example
分支的指针,这种情况下是不能对于example
分支做出修改的。
如果需要将远程仓库的分支合并至本地的当前分支上,git merge <remote>/<branch>
。如果想获取远程分支时也同时创建本地分支,可以执行git checkout -b <local_branch> <remote>/<branch>
命令。
6.3 跟踪分支
跟踪分支是远程分支直接关联的本地分支,上一节介绍的,在获取远程分支时创建的本地分支就是跟踪分支。同样,克隆某个远程仓库时,Git
默认自动创建并追踪远程origin/master
分支的本地master
分支,这个分支也是一个追踪分支。
通过设置跟踪分支,并且此时处于某个跟踪分支上,推送变更时,可执行便捷的命令git push
,该命令会自动获取到推送服务器和推送分支;如果要从服务器上拉取数据,对应的便捷的命令是git merge
或者git pull
。
命令git checkout -b <local_branch> <remote>/<remote_branch>
可以为远程仓库分支设置其他的追踪分支。
执行git checkout <branch>
命令时,如果切换分支的名称与远程仓库分支的名称一致,则Git
在切换分支时也会自动创建追踪分支。
如果想给本地已存在的分支设置追踪分支,或者修改本地分支对应的远程分支,可以使用命令git branch -u
或者git branch --set-upstream-to
命令设置任意远程分支,比如:
$ git branch -u origin/serverfix
上述命令将会将当前所在的本地分支对应的远程分支修改为serverfix
。
使用命令git branch -vv
可以查看哪些本地分支设置了跟踪分支,并且还输出本地分支是否领先或落后与远程分支的基本信息。该命令不会与远程仓库通信,只是读取上一次与远程仓库通信后的本地缓存的信息。
$ git branch -vv
example 25f3a6f [origin/example: ahead 1] feat:test
* master 9999a8d [origin/master: ahead 3, behind 1] 完成2021212分享
test dfs9dfd 测试分支
上述输出信息可以看出:
example
分支追踪着origin/example
分支,并且领先origin/example
分支1次提交master
分支追踪着origin/master
分支,并且领先origin/master
分支3次提交,并且落后一次提交test
分支没有追踪任何分支
上面提到的“领先”是指,本地分支上有些提交内容没有推送至远程仓库;“落后”是指,远程仓库分支上有些提交内容并没有合并到本地分支上。
6.4 删除分支
使用命令git branch --delete <branch>
删除指定分支,该命令只是删除远程仓库的分支指针,并不会立即删除数据。Git
会保留相应的数据一段时间,直到下一次出发垃圾回收。因此,在下一次垃圾回收之前,是可以恢复删除的分支的。
虽然可以恢复删除没有多久的远程仓库分支,但是还是建议在删除分支之前,确定该分支上的功能已经完成并且合并至主线开发分支或者其他分支。