看日记学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的区别状况。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-05-28 21:56  lakeslove  阅读(181)  评论(0编辑  收藏  举报