图书馆白嫖系列
前情提要:
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里的操作来起承转合,一看就是……中国的写法。怪亲切的。