导读
总感觉学了一段时间之后就听不进去了,东想西想的,不能集中注意力。
继续加油吧。。。
-
.git目录(裸仓库)下的内容 (隐藏文件下的git核心内容)
HEAD: 指向refs的一个引用,有master主分支,还有其他自己创建的分支
refs: 引用,包括一些head、tag的信息。 tag:有些地方叫打标签,也有些地方叫 里程碑!(终于见到软件模型那里说的里程碑的真身了。。。)
objects: 最核心的内容。有一些简单的字符和原来看到的那些分支的字母数字代码可以组成一个新的哈希值,类型是tree。
里面有个pack文件夹,git会做自我梳理,如果那些简单字符比较多了,git就会自动打包放到pack里。
config: 可以编辑一些配置信息,比如之前写的 user.naem、user.email 也可以在这里编写。git里的核心对象类型: 有 commit、tree、blob。
在git里,只要文件内容是一样的,不管你个这个文件取什么名字,在git眼里都是同一个blob。git cat-file -t XXXX(那些哈希值) : 查看对象类型 (-t : type)
git cat-file -p XXXX(那些哈希值) :查看文件对象的内容 -
commit、tree、blob类型之间的关系:
commit:代表着每次的变更、每次的提交。
commit下面有且仅有一个tree。存放着该版本下所有的文件的记录、快照。tree下面可能还有tree或者blob,感觉就好像tree是代表文件夹,blob是代表文件。
-
分离头指针: detacted head
是指切换分支 git checkout XXX(那些哈希值) 的时候,在做变更的时候,这些变更是单独的另一条线,没有和原来的项目的分支有任何的联系。
不为其建立分支的话,git就会把它当成垃圾来处理。
为他创建新的分支的命令: git branch xxx(那些哈希值) -
HEAD、branch 的理解:
git branch -av : 可以查看git下的分支情况git checkout -b XXX(新的分支名) : 可以基于当前的分支创建一个新的分支 并 切换到新的分支HEAD也指向了新的分支。
HEAD 在哪里和分支无关。
可以在 .git 那个裸仓库里看HEAD的引用是哪个branckgit diff 哈希值1 哈希值2 : 可以比较指定的2次commit的有什么地方不同(哪些地方做了修改)
也可以 git diff HEAD HEAD^
表示HEAD那个父亲的commit的写法: HEAD^ 或 HEAD^1 或 HEAD~1
父亲的父亲 : HEAD^^ 或 HEAD11 或 HEAD~2 -
删除不需要的分支
命令: git branch -d XXX 或者 git branch -D XXX -
对最近的commit的信息做修改:
命令: git commit --amend -
对以前的commit的massage做修改:
命令: git rebase -i XXX(哈希值) , -i 是交互式的意思
这个哈希值是要变更的按个commit的父亲(就是rebase的那个基(base))的commit的。
然后里面有参数信息,pick是不变的, 改message就用reword,也可以简写成r。 -
整理commit :
合并连续的几个commit:
还是用 git rebase -i XXX 。 参数仍是一样的信息
然后里面的参数用 s,也就是squash, 那些需要合并的就用s。 再添加总的message属性。合并不连续的几个commit
还是一样的操作,只是进去后,可以把那些commit的顺序调换,如果用的最开始的那个commit,还要记得那条commit的哈希值来自己添加。 -
比较HEAD和暂存区文件的不同:
命令: git diff --cached -
比较工作区(本地上写的文件)和暂存区的文件的不同:
命令: git diff 。 默认的就是 -
暂存区的 所有文件 恢复为跟HEAD的内容一样:
应用场景:可能我们先add到了暂存区里,但是又有新的方案用,不想要原来在暂存区里的内容。
命令: git reset HEAD -
暂存区的 部分文件 恢复为跟HEAD的内容一样:
命令: git reset HEAD – XXX(要恢复的文件件名) -
把工作区恢复为跟暂存区的内容一样:
应用场景: 先把修改的内容add到了暂存区里,自己又在工作区放心大胆的改了同样的地方,思来想去之后,还是以前的内容好,想恢复为暂存区那次的。
命令: git checkout – XXX(要变回来的文件名) -
不想要最近几次的commit信息:
有最近几条的commit觉得无所谓,彻彻底底的不想要了,工作区和暂存区也回到了之前commit的那次状态。
在有些人看来是很危险的命令,所以还是一定要慎用,因为一旦用了,消除的那几次commit就没有了。。。
命令: git reset --hard XXX(想回到那次commit的那条哈希值) -
查看不同commit的文件的变更在哪里:
想看2次commit的同一个文件,他们的内容在哪里改变了
命令: git diff XXX(commit1的哈希值) XXX(commit2的哈希值) – XXX(那个文件的文件名) -
删除文件:
有些在仓库里的文件不想要了,我们在工作区里删(命令行的rm),可不能这样add 删的文件了吧。。。
所以有专门的命令来删除文件,在仓库里,在工作区都删了。 跟之前的重命名的有点像
命令: git rm XXX(要删除的那个文件名) -
有了紧急任务的情况:
本来自己开发任务好好的,突然来了个紧急任务,要修复bug什么的,我们就要把目前的工作状态保存到一边,优先做紧急的任务,做完了在回来弄。
所以可以用 git stash 这条命令,把当前的状态搁置到一边(类似于堆栈里)
git stash list : 可以看这个stash里有哪些东西
要拿出来用的话:
git stash apply : 拿出来了,stash里的那个还没删除。
git stash pop : 拿出来了,stash里的那个也没有了。 -
指定不需要git管理的文件:
有些文件是系统自动生成的,比如.c .o .jar .dll .bat 等等,我们不需要在仓库里面管理这些文件,
就可以在仓库里 创建一个名为 .gitignore 的隐藏文件,在里面写上不需要管理的文件的后缀名,就可以了。
注意一下,比如doc是不管理doc文件,doc/ 是不管里doc这个文件夹下面的文件。 -
将git的仓库备份到本地的另一个地方:
传输协议的分类:
哑协议:传输进度不可见。 格式: 就一个本地的文件路径。
智能协议:传输进度可见。 比如http/https(需要用户名和密码)、 ssh(需要公钥私钥)、 file://本地的文件路径 这些格式的都是智能协议
平常用的智能协议比较多,传输速度也较快一些步骤
在本地的找好一个本分的文件夹,执行命令:
git clone --bare XXXX(那些协议的格式,比如文件路径,file://文件路径)。 bare参数是备份工作区的文件。也可以在仓库里,用命令
git remote add XXX(本地的另一个仓库的名字) XXX(那些协议的文件格式) 来和需要备份的那个地方关联起来。
可以用 git remote -v 来查看本地的另一个仓库的列表名称。之后就用 git push XXX(远程仓库的名字) 将文件push到本地的另一个仓库中。