1.git保存的不是文件差异或者变化量,只是一系列文件快照。
在Git中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,
包含零个或多个指向该提交对象的父对象指针:首次提交时没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
2.Git分支
Git的分支,本质上仅仅是指向提交对象的可变指针。Git的默认分支名字是master。在多次提交操作之后,其实已经有一个指向最后那个提交对象的master分支。它会在每次的提交操作中自动向前移动。
Git的master分支并不是一个特殊分支,跟其它分支完全没有区别。是git init命令之后默认创建的。
3.分支创建: git branch xxx (这会在当前所在的提交对象上创建指针)
注:git branch 命令仅仅创建一个新分支,并不会自动切换到新分支中去。
在git 命令 -help : 显示该命令有多少参数及具体用法。(注意是一个‘-’,‘--’就跳到指导网页去了)
4.分支切换: git checkout testing
git log --decorate (显示各个分支所指向的对象)
git log --decorate --graph --all (以树状图的形式查看所有分支的提交记录)(以下图为例)
注:分支切换时,工作目录里的文件会被改变。
5.head : 是一个指针,指向当前所在的本地分支(相当于是当前分支的别名)
Git的分支实质就是包含所指对象校验和(长度为40的SHA-1值字符串)的文件,它的创建和销毁都异常高效。
Git鼓励开发人员频繁地创建和使用分支。
在切换分支前,最好保持在一个干净的状态。要留意工作目录和暂存区里的那些还没有被提交的修改。它可能会和你即将检出的分支产生冲突从而阻止Git切换到该分支。(不过不用太担心,如果有冲突,git会提示你的!和建议你该做什么的)
6.合并分支:git merge xxx
eg:从master分出去的分支hotfix,在hotfix修改完成以后,合并回master
>git checkout master (先切换回master)
>git merge hotfix
在合并分支的时候,有“fast-forward”,由于当前master分支所指向的提交是你当前提交(关于hotfix的提交)的直接上游,所以Git值是简单的将指针向前移动。也就是,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么Git在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作并没有需要解决的分歧。
并且在合并以后,hotfix分支和master分支其实就是一个分支;可以理解为一个分支有两个名字。
当然为避免误解,可以删除hotfix。
7.删除分支: git branch -d xxx:
在三方分支合并的时候,Git会将此次的三方合并的结果做个新的快照并且自动创建一个新的提交指向他。
Git会自行决定哪一个提交作为最优的共同祖先,并以此作为合并的基础。(以下图为例)
如果合并有冲突时,可以自己手动解决冲突,也可以利用借助图形化的工具帮助来解决冲突: git mergetool
当任务开发完成以后,切换到master分支,用git branch --merged命令查看哪些分支已经合并到当前分支。及时删除哪些已合并的分支。
git branch --no-merged : 查看还没有合并的分支。