看日记学git--笔记
该书112页,一共30篇日记。
今天把这本书看完了,说一下感受,
不推荐阅读该书。
该书是一个学生在2009年写的读书笔记,和现在的git有一定出入。
该书的优点:内容简洁,有demo讲解。
缺点:
1、原理的讲解并不清晰,特别是各种常用命令的原理基本没讲。
2、有几个比较重要的命令没讲,比如rebase、commit合并。
3、有几个重要的命令没说明白,比如checkout
4、推荐了一些目前不推荐使用的方法,比如merge、pull .
git add .这个命令要求git给我目前的这个项目制作一个快照snapshot
(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)。快照一般会暂时存储在一个临时存储区域中。
git commit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。
git diff 来查看不同
bogon:aha lakeslove$ git diff diff --git a/sort/indexSort.cpp b/sort/indexSort.cpp index 9e93882..2308c33 100644 --- a/sort/indexSort.cpp +++ b/sort/indexSort.cpp @@ -11,6 +11,6 @@ int main() for(j=1;j<=a[i];j++) printf("%d ",i); } - //getchar();getchar(); + getchar();getchar();//这个时刻可以暂停来查看变量 return 0; } \ No newline at end of file
git status //来查看当前状态(未执行add)
bogon:aha lakeslove$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: sort/indexSort.cpp no changes added to commit (use "git add" and/or "git commit -a")
git add sort/indexSort.cpp
git status //再查看当前状态
bogon:aha lakeslove$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: sort/indexSort.cpp bogon:aha lakeslove$ git commit -m '添加getchar()'
git commit -m '添加getchar()' //提交变更
git log //查看操作记录,是按照时间倒序排列的
bogon:aha lakeslove$ git log commit e5a56984064fc31c2050d0633ab300a4e5b6d6a3 Author: liuxin <liuxin@i-counting.cn> Date: Thu May 28 00:17:58 2020 +0800 添加getchar() commit ddac1bac161e778029df15de9661d17c04e38d47 Author: liuxin <liuxin@i-counting.cn> Date: Wed May 27 23:25:13 2020 +0800 啊哈!算法 的demo
如果修改了项目代码,先git add你修改过的文件,再git diff并git status查看确认,然后git commit提交,然后输入
你的开发日志,最后git log再次确认。
现在教给你一个偷懒方法,那就是git commit -a,这个命令可以直接提交所有修改,省去了你git add和git diff和git
commit的工序,可谓一条龙服务。
但是,此处有一点应该注意,那就是git commit -a无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文
件夹,那么就要老老实实的先git add .,再git commit喽。
git 命令显示版本树 git log --oneline --graph --decorate --all
git 命令显示版本树简化版 git log --graph
--oneline 是每次提交信息显示在一行中,但是会隐藏时间等信息
gitk 一个自带的git界面化管理工具,感觉不如souretree或idea里的git工具好用。
git branch -d xxx 是删除xxx分支,
在这里使用的是小写的-d,表示“在分支已经合并到主干后删除分支”。但是如果某分支没有做任何修改的话,即使没有合并到主分支,也可以用-d删除
如果使用大写的-D的话,则表示“不论如何都删除分支”,测试结果如下:
bogon:aha lakeslove$ git branch -d test3 error: The branch 'test3' is not fully merged. If you are sure you want to delete it, run 'git branch -D test3'. bogon:aha lakeslove$ git branch -D test3 Deleted branch test3 (was c60a0e1).
pull命令完成了两个动作,首先从远端分支获取diff信息,第二个动作就是将改变合并到本地分支中。
#git diff //这个命令只在git add之前使用有效。如果已经add了,那么此命令输出为空
#git diff --cached //这个命令在git add之后在git commit之前有效。
#git status //这个命令在git commit之前有效,表示都有哪些文件发生了改动
$ git pull /home/bob/myrepo //pull命令的意思是从远端git仓库中取出(git-fetch)修改的代码,然后合并(git-merge)到我(rocrocket)的项目中去。
读者要记住一个小技巧,那就是“git pull .”命令,它和git merge的功能是一样的,以后完全可以用git pull .来代替git merge哦
$ git fetch /home/bob/myrepo master:bobworks //此命令意思是提取出bob修改的代码内容,然后放到我(rocrocket)工作目录下的bobworks分支中
$git whatchanged -p master..bobworks //用来查看bob都做了什么,也可以用git diff branch1 branch2,也可以用git log --left-right branch1...branch2
$git checkout master //切换到master分区
$git pull . bobworks //如果我检查了bob的工作后很满意,就可以用pull来将bobworks分支合并到我的项目中了
$git branch -D bobworks //如果我检查了bob的工作后很不满意,就可以用-D来放弃这个分支就可以了
如果git pull 出现来冲突,那么先解决冲突,再git add . ,之后git commit -m '解决冲突'
历史记录查询
git log
[rocrocket@wupengchong project]$ git log commit 5b888402aadd3cd41b3fe8c84a8658da07893b20 Author: rocrocket <wupengchong@gmail.com> Date: Wed Sep 24 13:16:46 2008 +0800 after pull from rocrocket Hello!!!!!
我们可以使用git show再加上述的commit名称来显式更详细的commit信息:
bogon:aha lakeslove$ git show 5f67d8f66265fb66b5b54ab2698057da1efe1ba7 commit 5f67d8f66265fb66b5b54ab2698057da1efe1ba7 Merge: 4e56ef3 f498eeb Author: liuxin <liuxin@i-counting.cn> Date: Thu May 28 16:31:04 2020 +0800 解决pull引起的冲突 diff --cc sort/indexSort.cpp index f16ae20,f40170e..ec31dd7 --- a/sort/indexSort.cpp +++ b/sort/indexSort.cpp @@@ -14,4 -16,4 +16,4 @@@ int main( } getchar();getchar();//这个时刻可以暂停来查看变量 return 0; --} ++}
使用git show加分支名称,亦可以显示分支信息:
使用HEAD字段可以代表当前分支的头(也就是最近一次commit):
每一次commit都会有”parent commit”,可以使用^表示parent: [rocrocket@wupengchong project]$git show HEAD^ //查看HEAD的父母的信息 [rocrocket@wupengchong project]$git show HEAD^^ //查看HEAD的父母的父母的信息 [rocrocket@wupengchong project]$git show HEAD~4 //查看HEAD上溯4代的信息 要注意的是git-merge是会产生双父母的,这种情况这样处理: [rocrocket@wupengchong project]$git show HEAD^1 //查看HEAD的第一个父母 [rocrocket@wupengchong project]$git show HEAD^2 //查看HEAD的第二个父母
git branch stable V3 //建立一个基于V3的分支
可以用git grep帮助我们搜索:
[rocrocket@wupengchong project]$ git grep “print” V3 //在V3中搜索所有的包含print的行
[rocrocket@wupengchong project]$ git grep “print” //在所有的历史记录中搜索包含print的行
[rocrocket@wupengchong project]$ git tag V3 5b888 //以后可以用V3来代替复杂的名称(5b888…)
[rocrocket@wupengchong project]$ git show V3
[rocrocket@wupengchong project]$ git branch stable V3 //建立一个基于V3的分支
git log V3..V7 //显示V3之后直至V7的所有历史记录
[rocrocket@wupengchong project]$ git log stable..experimental //将显示在experimental分支但不在stable分支的历史记录
[rocrocket@wupengchong project]$ git log experimental..stable //将显示在stable分支但不在experimental分支的历史记录
每次add . 都会在.git/objects目录中添加新的文件,同时把index文件的内容改为新添加的目录。
git 的几个查看文件的命令
git ls-files --stage //查看index
git cat-file -t xxxx //查看文件类型
git cat-file commit xxxx //查看commit类型文件
git ls-tree xxxx //查看tree类型文件
git cat-file blob xxx //查看blob类型文件
git diff 有内容,git add . 之后,git diff 就没有内容了,但是git diff HEAD 依然有内容,说明:
git diff不是在和HEAD比,而是和另外一个“神秘”内容在比,而这个“神秘”内容就是“索引文件”!
git diff //对比的是当前文件和index中指向的文件,index中指向的文件是add后的文件。
git diff HEAD //对比的是当前文件和HEAD指向的文件,也就是最近一次commit的代码
git diff --cached //对比的是index中指向的文件和HEAD指向的文件,也就是最近一次commit的代码
git维护的代码分成三部分,“当前工作目录”<->“index file”<->git仓库。
git add会将“当前工作目录”的改变写到“index file”;git commit会将index file中的改变写到git仓库;“commit -a”则
会直接将“当前工作目录”的改动同时写到“index file”和“git仓库”。
将 Current working directory 记为 (1) 将 Index file 记为 (2) 将 Git repository 记为 (3) 他们之间的提交层次关系是 (1) -> (2) -> (3) git add完成的是(1) -> (2) git commit完成的是(2) -> (3) git commit -a两者的直接结合 从时间上看,可以认为(1)是最新的代码,(2)比较旧,(3)更旧 按时间排序就是 (1) <- (2) <- (3) git diff得到的是从(2)到(1)的变化 git diff –cached得到的是从(3)到(2)的变化 git diff HEAD得到的是从(3)到(1)的变化
git reset head 表示把indexfile中内容替换为HEAD中的内容
上面两行黑体字中的Changes to be committed表示在index和commit的区别状况,而Changed but not updated表示当前目录和index的区别状况。