Git学习要点

Git底层模型

git底层为一个key-value存储系统,它将文件的内容通过hash计算获得一个全局唯一的hash码,作为代表该文件key,然后将其文件内容存为一个二进制文件,即为图中Hash Object。Hash Object中只有文件内容以及hash值作为文件名。文件名保存在Tree Object中,Tree Object 可以索引到其他Tree Object / Hash Object.Tree Object映射到现实文件系统中的文件夹。

每次提交时都会产生一个commit以及一个新的顶级虚拟Tree。

CommitA 中提交了三个文件File[A-C], 分别生成了Hash Object[A-C],其中有一个文件夹B,生成了TreeB。提交时产生虚拟顶级TreeA。

CommitB 时,修改了文件A、B的内容,于是CommitB基于修改后的文件A',B' 生成全新的Hash Object[A'|B'];,对于未修改的文件C则直接引用。

注意:

每次修改文件后生成的hashObject是基于整个文件生成的,是全量生成,而不是与之前的hashObject比较进行增量生成。

文件暂存区 index 类似于一个虚拟顶级Tree节点,文件被加到暂存区中,则会立刻生成hashObject,并被index索引。如果再次修改该文件,再次将其加入暂存区,则又会生成一个hashObject.之前的hashObject将不再被index索引,所以成为了一个无用对象,可以使用git fsck 查看,可以使用git prune清除。


Merge与cherry-pick/Rebase之间的区别

merge合并时,会查找共有的父提交,然后每个文件基于父提交中的文件进行比较,若出现双方修改则冲突。

Rebase/cherry-pick则是基于补丁的,是一种增量式记录,如git format-patch F,则会列出F相对于E修改的文件,将两个提交中所有修改的文件作为补丁。

在D处拣选F,git cherry-pick F。则会将F相对于E修改的所有文件(E、F均要)打包成patch,应用到D时,则以E的文件作为基本文件,进行D、E比较,若双方修改文件,则冲突。相对于以E作为D,F的共同提交,进行合并。


HEAD

HEAD默认会指向branch,branch再指向commit,若HEAD直接指向commit,则会除于头指针分离状态.此时所有提交都很有可能丢失

基本命令大全

-------------------------------------------------------------------------------------

git help //查看命令的帮助文档

git rev-parse master //查看引用指向的hash id

git rev-list --graph --format=%B //列出该commit及其之前的所有commit并展示

git rev-list --graph--format=%B.. //列出B及B的祖先提交,并排除A及A的祖先提交

git rev-list --graph--format=%B... //列出A与B的并集并排除A与B的交集

git rev-list --graph--format=%B^@ //A的所有祖先提交,将A排除在外

git rev-list --graph--format=%B^! //只列出A一个提交

git cat-file -t //查看hash id的类型,该id可以表示一个commit/hash Object/tree...

git cat-file -p //查看hash id的内容,当为hash Object时即为查看文件内容

-------------------------------------------------------------------------------------

~n //表示该提交向上遍历n个parent

git reflog show HEAD|master -n //查看HEAD/master之前的n个都指向哪些提交

HEAD|branch@{n} //代表该HEAD/branch之前第n个指向的提交

^{tree}   // 代表提交对应的虚拟树节点

^{parent} //代表该提交的父提交

-------------------------------------------------------------------------------------

git diff --cached  []  //比较暂存区与提交的区别,默认提交为HEAD

git diff //比较工作区所有已追踪文件与commit的区别

git diff //比较工作区与index的区别

git log --pretty //展示最近的提交

git st -s //精简展示变化, 两个标志位,第一个表示暂存区相对于版本库的编号,第二个表示工作区相对暂存区的变化

git archive -o now.zip //基于提交进行打包

-------------------------------------------------------------------------------------------------

git reset --soft   //将当前分支&&HEAD重置到commit, 不改变暂存区和工作区

git reset [--mixed] //将当前分支&&HEAD以及暂存区重置到commit.

git reset --hard //将当前分支&&HEAD 暂存区 以及 工作区都重置到commit,此时所有工作区的变更会丢失,无法找回.

前三种方式都会将HEAD移向相应的commit,若HEAD此时指向branch则branch也会一起移动

git reset [--mixed] //将暂存区中filePath对应的文件内容替换成commit中的文件内容

git reset --hard //将暂存区与工作区中filePath所对应的文件内容替换成commit中的文件内容

----------------------------------------------------------------------------------------

git checkout [] //使用commit对应的file替换暂存区中的文件, commit默认为暂存区, filePath若为.则表示所有文件

git checkout  //切换到一个分支

git checkout -b[|]  //从提交/分支创建一个新分支并切换到该新分支,若不指定则表示HEAD指向的提交

git branch [|]//从提交/分支创建一个新分支但不切换分支,若不指定则表示HEAD指向的提交

git checkout //将HEAD直接指向commit,分支不会跟着移动,此时处于分离头指针状态.

--------------------------------------------------------------------------------------------

git stash //暂存工作区以及暂存区的工作 ==> 原理上会对暂存区以及工作区各做一次提交,分别记录文件内容.不会暂存未跟踪的新文件

git stash save "message" //给该stash一个描述,在查看暂存列表时会看到该描述

git stash list //查看所有暂存

git stash apply [stash@{n}|] //应用暂存,有可能出现冲突,默认应用栈顶,可以直接应用暂存id

git stash drop  [stash@{n}] //移除暂存,默认移除栈顶

git stash pop [stash@{n}] //移除并应用暂存,默认移除栈顶,只建议在没有冲突时使用,避免冲突解决失败时,暂存丢失

git stash clear //清空所有暂存,不建议使用

----------------------------------------------------------------------------------------------

git rm //将从暂存区以及工作区中移除该文件

git add -i //命令式交互,用于工作区与暂存区互操作,可以将文件加入/移除暂存区(单纯移除,不会对工作区造成影响),使用回车确认

git add -- //将file加入暂存区

----------------------------------------------------------------------------------------------

git tag //对当前HEAD所指的提交打一个tag

git tag -a //使用tagName对HEAD所指的提交打一个tag并附加一个描述文件.

git tag -m //使用tagName对HEAD所指的提交打一个tag,并附加简单描述

git tag -s //打tag并应用作者签名

git tag -l //列出所有tag

git tag -l -n2 //列出所有tag并打印前两行描述

git tag -l v3.* //俩出所有以v3.开头的标签

git tag -d //移除一个tag

git push //将一个tag推送到远程库中

-----------------------------------------------------------------------------------------------

git cherry-pick //拣选

git rebase --onto //将..(不包含since),换基到newBranch上,若till不为一个branch,则会处于头指针分离的状态.底层实现: checkout到till => reset --hard newBranch => cherry-pick ..

git rebase <=> git rebase --onto HEAD //将featureA 换基到master上,则git checkout featureA => git rebase master

git rebase -i ... // ...与以上命令相同,提供交互文本,十分强大,推荐使用这个

----------------------------------------------------------------------------------------------

git remote add repoName url //创建一个远程版本库

git remote remove repoName //移除一个远程版本库

git remote -v /查看所有远程版本库

git remote -set-url --push //为push操作设置独立的url

一个版本库可以配置不同的拉取地址以及推送地址,大部分情况下,二者一致.

git fetch //同步远程版本库到本地,此时不会和本地分支合并

git push //向远程版本库推送分支

本地的每一个分支都可以通过设置branch..remote为其指定一个远程版本库,若不指定则默认为origin,在push/pull时会使用相关联的remote进行操作,具体url由remote给出.

指定push.default为simple则每次推送时,只推送当前分支,要成功推送的前提是远程版本库得存在相同名称的分支,第一次可以使用git push 在远程版本库中创建

git pull //需要当前分支指定branch..merge ,确定使用哪个远程分支来进行合并,否则报错.

git branch -r 查看所有远程分支

git branch 查看所有本地分支

------------------------------------------------------------------------------------------------

git format-patch -s HEAD~3..HEAD //使用format-patch创建补丁文件

cat *.patch | git am  //应用补丁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,694评论 1 17
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,471评论 1 26
  • Objective 你对今天学的记得什么? 1.让团队成为明星。这个是今天学到的最有帮助的一句话,应该说是未来很长...
    太后只说话不发威阅读 160评论 0 0
  • 落笔之前,我挣扎了一会,这么年轻的我,竟然喜欢 上了写心灵鸡汤,但确实心里有些话不吐不快,这些 日子状态很差,来回...
    Allen_艾伦阅读 176评论 0 0
  • 遥遥冬日寒声碎,漫漫长风破素门。 逆旅孤舟浮瘦客,天涯何处寄萍身? 三千弱水只瓢饮,一抹残阳半袖分。 踏遍清愁多少...
    文泳阅读 353评论 11 22