Git权威指南学习笔记(1)

Posted on 2022-10-23 17:03  Capterlliar  阅读(53)  评论(0编辑  收藏  举报

图书馆白嫖系列

前情提要:

2005.4.3  Linus开始开发git

2005.4.6  项目发布

2005.4.7  git可以作为自身版本控制工具了

2005.4.29 性能达到预期

2005.6.16 可以维护Linux源代码了

我看不懂,但我大受震撼.jpg


工作区(Working Directory):写代码的地方;

暂存区(Stage):存储当前改动,但还没有形成commit,写完后手动将改动add到这里;

提交(commit):确认把这些改动添加到版本库,动名词同形;

版本库(Commit History):commit后在本地形成的东西。

关于git怎么知道目前在哪个版本工作:

.git下有个文件叫HEAD,里面写着:ref: refs/heads/master

.git\refs\heads下有个文件叫master,意思就是HEAD又指向了master;

master打开时一个40位的SHA1码,这个码代表了一个commit,也就是当前工作的版本;

关于这个SHA1码:

每个commit都会生成一个SHA1码,commit里的改动,也就是文件和目录,也会有一个SHA1码,这个码是它们的唯一标识,用文件大小、头信息和文件内容生成。这些码对应的文件存储在.git/obj下,前2位当文件夹名,后38位当文件名。

比如master打开后是9af5b06416cde2f729575485ef9efd7021980937

打开这个文件,里面写着:x曃Mj?@岈u娰蘃...停一下,重来。

执行git show <ID>

$ git show 9af5b06416cde2f729575485ef9efd7021980937
commit 9af5b06416cde2f729575485ef9efd7021980937 (HEAD -> master, origin/master)
Author: Capterlliar <401464788@qq.com>
Date:   Sun Oct 9 11:47:00 2022 +0800

    veision 1.0. not so gracefully.

diff --git a/src/main/java/ClipContent.java b/src/main/java/ClipContent.java
index 7d469c9..e193ad3 100644
......

diff --git a/src/main/java/ClipManager.java b/src/main/java/ClipManager.java
index 4d472b9..d42e6f8 100644
......

 可以看到改动文件对应的编码和改动内容。大概是这样。

试着进行一些修改:

考虑对master里存的commit ID进行一些修改,也就是git reset指令。reset大概是一个游标,可以滑到任何一个commit上,只要知道commit的编号。这个编号可以在log里找。reset还有一些选项:

--soft:只改版本库

--mixed:改版本库和暂存区

--hard:全给你删了

考虑对head进行一些修改:git checkout <分支名>,切换分支

如果把分支名换成某个具体的提交,那么就会处于分离头指针的状态。这时的修改独立于原来分支,如果想要合并,进行git merge

git checkout的另一个用法是用指定的commit重写工作区,此时不修改头指针。如果不指定某个commit,则用暂存区覆盖。

试着进行一些组合:git rebase --onto <newbase> <start> <end> 

意为:把(start, end]这段提交嫁接到newbase上

具体过程:

1. checkout到till

2. 将(since, till]写到一个临时文件里

3. git reset --hard <newbase>

4. 把临时文件的commit一个个接回来

5. 如果till是commit而非branch,那么整个过程是在分离头指针的情况下完成的,结束后对master重置一下

中间处理一下冲突,处理完rebase --continue

把多个commit合成为一个的操作:

1. checkout到最后一个commit

2.  reset到第一个commit之前,用--soft参数

3. 提交

4. 把后面的commit嫁接回来

git stash save [<comment>]

存档的意思。先将改动加入暂存区,存档,存完档当前改动全部消失,需要读取存档的时候调出来就好。

具体过程:我们随手做的 git stash,究竟干了什么?

 

叨叨两句

这本书经常用git里的操作来起承转合,一看就是……中国的写法。怪亲切的。