标准用法请参考git-scm。本文记录笔者对git的一些理解,如有错误,欢迎指正。
引用内容已用markdown记号标出。版权所有,转载请注明出处。
文章完成中
这是引用内容
First Edition:2021-01-27
文中的记号约定
<当前分支>:用尖括号包裹,需要被替换
软件环境
笔者将介绍 命令行,TortiseGit,VS中git的使用
git学习指引
更适合把git当作某种数据结构来理解,从底层理解git
git中的一些概念
git分支并不是一个实体,而是一个指针,分支只存放了指向某个commit的指针,不保存其他信息。在master分支创建新提交后,分支指针指向为新的commit。
HEAD表示当前指向的位置,master/main一般用于主分支。不要混淆两者概念
working-tree index lib
working-tree为工作目录,即可以直接操作
index,也称stage,git commit将当前index状态保存,即git commit不处理工作目录
git基本命令
- add 添加文件到index
git add new.txt
- commit 将当前index提交到Local Repository
git commit -m "<这里是commit的注释>"
git commit -m "<这里是commit的注释>" --allow-empty //使用此命令学习git分支
git commit -m "<这里是commit的注释>" --allow-empty-message -m "" //允许空注释
- checkout 修改HEAD指针 底层修改 ./git/HEAD
git checkout <指定位置> //修改HEAD 指针到<指定位置>
- switch 修改HEAD指针,使其指向某个分支而不是某个结点
git switch <分支> //切换到某个分支
//switch与checkout的区别:
//checkout功能更加底层,修改HEAD指针的内容,使其指向branch或者commit
//switch只能指向分支
- branch 创建分支
git branch new_branch //新建分支new_branch
- reset 修改当前分支的指针 底层修改文件 ./git/refs/head/<分支名>
git reset ad13f1 //修改当前分支的指针
//git reset与checkout的区别
//git reset不修改HEAD指针,修改当前分支指向的commit
//git checkout修改HEAD指针
git指令
git rebase
git revert
git reset
git checkout
git merge
git cherry-pick
git merge命令
当前工作再branch_master分支,此分支指向commitA,develop分支指向commitB,(AB字母仅供标识,没有其他含义)。使用指令git merge develop
,创建一个新的commitC,commitC以commitA和commitB为父结点。再次强调,git的分支是一个指针,存放在./git/refs文件夹下。分支所包含的结点是以类似链表的方式的进行查找的,并不是线性记录在某个文件中。
git中删除分支并不会直接删除commit object,不过分支指针丢失了,难以进行查找,并且git有gc垃圾回收机制,会清理悬挂对象。(git误操作后恢复数据原理,分支指针被清除,对象并未清除,而且在./git/logs文件夹内有日志。) git fsck 命令验证数据库中对象的连通性和有效性。
git revert命令
当前master分支有commitA commitB commitC
使用git revert commitA命令生成commitD,commitD的父节点为commitC,commitD的内容与A一致,但并不破坏历史记录.
注:git对象是以链表的形式组织。链表上的结点不能自由移动,但可以对读取结点上的内容,创建新结点,这看起来像是回到了某次提交。
git reset命令
修改当前分支指向的结点(分支指针总是指向该分支的最后一个结点,或者说分支指针记录了该分支最后一个结点,checkout命令是移动HEAD指针)
当前master分支有commitA commitB commitC
git reset commitA后,如果没有分支线包含commitB,commitC,那么B、C不会显示在git log中(因为git log是动态搜索),B、C可能会被清除。
注:git使用链接式的数据结构。
git cherry-pick命令
git区域
这几个区域是使用概念上的区别。
git Working-Tree 即工作文件夹
git index index