一、分支的概念

Branches are named pointers to commits:分支是指向commits的有名指针。

像上图所示,master指向具体的一个 commit:a219fd,所以 master 是一个分支;dev 指向具体的一个 commit:e78125,所以 dev 也是一个分支。

当前我们有两个问题需要解决:

  • 分支指向的commit 保存在什么地方(即如何知道 master 分支指向的commit值)?
  • 在多个分支的情况下,我们怎么知道当前所处的分支是哪一个?

二、HEAD指针


我们可以看到,如上图所说:

  • HEAD是一个特殊的指针,HEAD指针指向当前工作的分支;
  • HEAD指针总是指向当前工作的分支的最近(最新)一次 commit;

如上图,当前HEAD指针指向了master分支,所以当前的工作分支是 master分支;同时 master 分支指向的 commit 是 a219fd,也就是上面说的:HEAD指针总是指向工作分支的最近一次 commit。

如果需要切换分支,如切换到 dev 分支。我们可以把 HEAD指针指向 dev 分支,那么 dev 分支就是当前的工作分支了。同时 HEAD指向指向工作分支的最近一次 commit e78125。


三、命令实操

首先,我们使用命令 git log 可以看到当前git版本库中的提交日志,可以看到最近的一次提交是 5269b2e.

root@backvm-virtual-machine:workspace# git log --oneline -3
5269b2e 3rd commit
a4df186 2nd commit
f59d0f4 1st commit
root@backvm-virtual-machine:workspace#

下面我们可以查看 .git/HEAD 文件,这个文件指向了另外的一个文件 .git/refs/heads/master ,它的内容是 5269b2eea42525594f02c06ef39cff4b56ae3c75,前面部分的内容正好是最近的一次提交:5269b2e .

接着通过命令 git branch --list -v查看分支情况,*master 5269b2e 表示 master 是当前的工作分支,而且分支 commit 是 5269b2e .

root@backvm-virtual-machine:workspace# cat .git/HEAD
ref: refs/heads/master
root@backvm-virtual-machine:workspace# cat .git/refs/heads/master
5269b2eea42525594f02c06ef39cff4b56ae3c75
root@backvm-virtual-machine:workspace#
root@backvm-virtual-machine:workspace# git branch --list  -v
* master 5269b2e 3rd commit
root@backvm-virtual-machine:workspace#

通过命令 git cat-file -t 5269b2e 可以看到 5269b2e 确实是一个 commit.由此证明 HEAD指针指向的确实是一个 commit。

root@backvm-virtual-machine:workspace# git cat-file -t 5269b2e
commit
root@backvm-virtual-machine:workspace#

四、其他命令及演示

可以看到,我们当前的工作分支是 master. 接着通过命令创建 dev 分支: git branch dev. 创建完成之后通过命令 git branch --list可以看到当前的分支有两个: master 和 dev.

root@backvm-virtual-machine:workspace# git branch --list
* master
root@backvm-virtual-machine:workspace# git branch dev
root@backvm-virtual-machine:workspace# git branch --list dev
* master
root@backvm-virtual-machine:workspace#

注意创建分支的时候,新创建分支指向的 commit 与当前工作分支的 commit 是相同的.

通过命令 git branch -v 可以看到,当前存在两个分支: master 和 dev,而且这两个分支指向的 commit 都是 5269b2e . 而且 HEAD 指针指向的分支的 commit 也是 5269b2e .

root@backvm-virtual-machine:workspace# git branch -v             dev    5269b2e 3rd commit
* master 5269b2e 3rd commit
root@backvm-virtual-machine:workspace# cat .git/HEAD
ref: refs/heads/master
root@backvm-virtual-machine:workspace# cat .git/refs/heads/master
5269b2eea42525594f02c06ef39cff4b56ae3c75
root@backvm-virtual-machine:workspace#

可以看到,目录 .git/refs/heads/ 下出现了两个文件:dev 和 master,这两个文件保存的内容正是它们指向的 commit.

root@backvm-virtual-machine:workspace# cat .git/refs/heads/
dev     master
root@backvm-virtual-machine:workspace# cat .git/refs/heads/dev
5269b2eea42525594f02c06ef39cff4b56ae3c75
root@backvm-virtual-machine:workspace# cat .git/refs/heads/master
5269b2eea42525594f02c06ef39cff4b56ae3c75
root@backvm-virtual-machine:workspace#

下面我们开始切换分支. git checkout(change the current active branch), 可以得知, git checkout 可以改变当前工作分支,由于HEAD指针总是指向当前工作分支,所以 git checkout 命令主要是改变 HEAD 指针的指向。

之前 .git/HEAD 指向 refs/heads/master,当前工作分支是 master 分支; 使用命令 git checkout dev之后,.git/HEAD 指向 refs/heads/dev,当前工作分支是 dev分支.

root@backvm-virtual-machine:workspace# cat .git/HEAD
ref: refs/heads/master
root@backvm-virtual-machine:workspace#
root@backvm-virtual-machine:workspace# git branch -vdev    5269b2e 3rd commit
* master 5269b2e 3rd commit
root@backvm-virtual-machine:workspace# git checkout dev
切换到分支 'dev'
root@backvm-virtual-machine:workspace# cat .git/HEAD
ref: refs/heads/dev
root@backvm-virtual-machine:workspace# git branch -v
* dev    5269b2e 3rd commitmaster 5269b2e 3rd commit
root@backvm-virtual-machine:workspace# 

接下来我们在 dev 分支下提交一个 commit.

root@backvm-virtual-machine:workspace# echo "dev" > dev.txt
root@backvm-virtual-machine:workspace# ls
dev.txt  file1.txt  file2.txt  folder1
root@backvm-virtual-machine:workspace# git add dev.txt
root@backvm-virtual-machine:workspace# git commit -m "1st commit from dev branch"
[dev 27d6ef4] 1st commit from dev branch1 file changed, 1 insertion(+)create mode 100644 dev.txt

可以看到,当前工作分支 HEAD 指针指向了 dev 分支,而且 dev 分支相比 master 分支前进了一步.

执行 git checkout 命令切换到 master. 可以看到当前 HEAD 指针指向了 master 分支,而且在 master 分支中 看不到在 master 分支前边 的 dev 分支.

删除分支有两个参数选项: -d -D. -d 会进行询问,而 -D 将会强制删除分支.

zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git branch -d dev
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git branch -D dev
Deleted branch dev (was 27d6ef4).zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)

注意:删除了 dev 分支,但是 dev 分支所创建的 obj 对象还存在,如下图:

zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git cat-file -t 27d6ef4  # 查看 27d6ef4, 是一个 commit
commitzzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git cat-file -p 27d6ef4  # 查看 27d6ef4 内容
tree 1e7585d019956406d085bbb2fcfbd148b28ff279
parent 5269b2eea42525594f02c06ef39cff4b56ae3c75
author demo <demo@demo.com> 1666368908 +0800
committer demo <demo@demo.com> 1666368908 +08001st commit from dev branchzzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git cat-file -p 1e7585d  # 查看 tree  对象 1e7585d ,找到了 dev.txt 文件
100644 blob 38f8e886e1a6d733aa9bfa7282568f83c133ecd6    dev.txt
100644 blob 99bdb979298700648a2f7d9a360e98fa1224b7c0    file1.txt
100644 blob 0c9c9cbe89b55ec9867ed28878bb0b73abe04268    file2.txt
040000 tree e3cfebfb440e2af91732e71deda277030d7182e9    folder1zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git cat-file -p 38f8e8  # 查看 blob 对象 38f8e8,可以得到文件的内容
dev

五、再谈 git checkout 命令

git checkout 命令进行 master 分支与 dev 分支切换,本质上只是改变了 HEAD 指针的指向,而 master 分支和 dev 分支指向的各自的commit 并没有发生变化。

同时, git checkout 命令不止可以进行分支切换,还可以 checkout 某一个具体的 commit。

如下图,当前 HEAD 指针指向了 master 分支, master 分支指向了 897fb0 commit.

可以使用 git checkout 命令将 HEAD 指针指向另外的 commit: 2e4624, 而 master 分支仍然指向了 897fb0 commit.

下面我们使用 git checkout 命令将 HEAD 指针指向第一次提交 commit.

zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git log
commit 5269b2eea42525594f02c06ef39cff4b56ae3c75 (HEAD -> master)
Author: demo <demo@demo.com>
Date:   Fri Oct 21 22:32:42 2022 +08003rd commitcommit a4df1862e6fda55c694c6029022f8acb1c37dcc2
Author: demo <demo@demo.com>
Date:   Fri Oct 21 22:06:31 2022 +08002nd commitcommit f59d0f44413b1857309d793559650a856c26dcbe
Author: demo <demo@demo.com>
Date:   Fri Oct 21 02:19:30 2022 +08001st commitzzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git checkout f59d0f
Note: switching to 'f59d0f'.You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:git switch -c <new-branch-name>Or undo this operation with:git switch -Turn off this advice by setting config variable advice.detachedHead to falseHEAD is now at f59d0f4 1st commitzzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace ((f59d0f4...))
$ git log
commit f59d0f44413b1857309d793559650a856c26dcbe (HEAD)
Author: demo <demo@demo.com>
Date:   Fri Oct 21 02:19:30 2022 +08001st commit

我们在 checkout 到一个具体的 commit 之后,可以通过新建一个分支(新分支指向的 commit 即是当前 HEAD 指向的 commit),然后再让 HEAD 指向新建的分支,之后就可以在新建的分支上做修改和提交了。

将分支切换到 master 分支后,tmp分支仍然指向第一次提交的 commit.


注意:一个分支指向了一个具体的 commit,使用命令 git branch 命令删除了分支,其实只是删除了分支的名字,具体的 commit 并没有被删除。

可以使用 git reflog 查看 HEAD 指针的变化。

可以看到 dev 分支所做的提交的 commit。

如下,我们可以通过具体的 commit 找到被误删的 commit 记录,从而恢复那个 commit 的内容(即之前被我们误删的 dev 分支)。

zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (master)
$ git checkout 27d6ef4
Note: switching to '27d6ef4'.You are in 'detached HEAD' state. You can look around, make experimental
......
HEAD is now at 27d6ef4 1st commit from dev branchzzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace ((27d6ef4...))
$ ls
dev.txt  file1.txt  file2.txt  folder1/zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace ((27d6ef4...))
$ git checkout -b dev
Switched to a new branch 'dev'zzzzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_demo/workspace (dev)
$ cat dev.txt
dev

git 什么是分支 branch相关推荐

  1. 【Git操作】分支branch操作

    1.简介 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版 ...

  2. Git教程——分支 (branch)

    文章目录 1.前言 2.分支图例 使用 graph查看分支 3.使用branch创建 dev 分支 1.前言 很多时候我们需要给自己或者客户用一个稳定的版本库, 然后同时还在开发另外一个升级版. 自然 ...

  3. git 移动分支指针_git 分支( branch ) 的基本使用

    分支( branches ) 是指在开发主线中分离出来,做进一步开发而不影响到原来主线. Git 存储的不是一系列的更改集( changeset ),而是一系列快照.当你执行一次 commit 时, ...

  4. git分支(branch)操作相关命令

    分支(branch)操作相关命令 查看本地分支:$ git branch 查看远程分支:$ git branch -r 创建本地分支:$ git branch [name] ----注意新分支创建后不 ...

  5. Git三大特色之Branch(分支)

    转自: https://blog.csdn.net/qq_32452623/article/details/78355976 我习惯每篇博客都有个开篇 还记得 Git 系列第一篇 Git 自我介绍的话 ...

  6. 【Git】目标分支有更新,The source branch is 17 commits behind the target branch

    问题 合并到到主要分支时无法合并,提示: 目标分支有更新,The source branch is 17 commits behind the target branch 详情 解决 解决思路: 1. ...

  7. git 本地新建分支上传报错The current branch dev has no upstream branch.To push the current branch and setremote

    项目本地初始化后,commit执行完毕,然后执行git push,报如下错误: $ git push fatal: The current branch dev has no upstream bra ...

  8. Git创建本地分支并关联远程分支

    创建本地分支 git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支de ...

  9. git 基于发布分支的开发

    创建发布分支: (1) 软件hello-world的1.0发布版本库中有一个里程相对应. /home/jackluo/workspace/user1/workspace/hello-worldgit ...

最新文章

  1. C语言条件语句(就做个笔记,云储存一下)
  2. 170多万篇论文,存储量达1.1 TB,Kaggle上线arXiv完整数据集
  3. solaris下常见文件压缩/解压方式简单小结—待续中
  4. 总结 | 计算机视觉领域最常见几中损失函数
  5. 2019年度年中回顾总结_我的2019年回顾和我的2020年目标(包括数量和收入)
  6. kafka(四)生产者和消费者配置优化
  7. 计算机毕业设计中Python Django 框架目录结构简介
  8. numpy 中的 broadcasting(广播)机制
  9. 安装部署elasticsearch过程详解
  10. 【Python 无损放大图片】——支持JPG/PNG 可将图片无损放大上万像素
  11. 清华EMBA课程系列思考之一 -- Techmark课程带给管理者的思考
  12. 合并时显示是无效的m3u8文件_合并M3U8文件方法
  13. JavaGui 02 Pannel-面板
  14. elemen点击时,修改走马灯的播放索引
  15. redis主从结构 主从从
  16. SQLServer 查询匹配字符(CHARINDEX)和替换字符
  17. (最优化理论与方法)第二章最优化所需基础知识-第七节:保凸的运算和共轭函数
  18. 笔记 - JavaScript - 超哥视频
  19. ERP、MES(作用、功能、部署、相关模块)
  20. 国内外知名的IT社区

热门文章

  1. 【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)
  2. mmpose关键点(一):评价指标(PCK,OKS,mAP)
  3. 印光法师语录:无论在家出家 必须上敬下和
  4. 竣达技术丨UPS网络集中监控方案
  5. 苹果5壁纸_iOS14.2 beta4描述文件下载-苹果iOS14.2测试版Beta4描述文件官方更新文件下载 v1.0...
  6. 【python】实现一次指数平滑
  7. 背景建模方法《python图像处理篇》
  8. html超链接 新弹出窗口 和字体颜色
  9. 【Python】数据类型 Number数字、String字符串、List列表、Tuple元组、Set集合、Dictionary字典
  10. win10系统声音很大,音频播放声音特小的问题