git - IDEA
Annotate
在我本地的项目 java-demo 中是建立了一个 git 仓库,每次提交代码都会在里面建立了一个快照,使用 IDEA 打开这个项目,在代码行处右键打开 Annotate 选项就看到对这份文件每次修改的代码和时间戳,点击里面的某一行还能看到提交这个 commit 的同时整个项目有哪些文件进行修改。
使用 git checkout [SHA-1]
可以返回某个状态的 commit。
接下来我做了一些实验:
# 第一次,查看 git log
~/leetcode (master)
$ git log
commit ce96adc13c17d6cb58c8d9574569a311d1bc7d38 (HEAD -> master, origin/master)
# 回到之前提交的某一个 commit
~/leetcode (master)
$ git checkout bd25
Note: checking out 'bd25'.
# 第二次,查看可知,已经跳到了 'bd25' 的 commit 了,此时 commit 只有 HEAD 指针
~/leetcode ((bd2512a...))
$ git log
commit bd2512a86fe3da8ddfa6a35db9a105e950fbd83d (HEAD)
# 回到 master 所在的 commit 编号,命令解释说 HEAD 指针已经完成跳转
~/leetcode ((bd2512a...))
$ git checkout ce96
Previous HEAD position was bd2512a Add array part.
HEAD is now at ce96adc Auto commit.
# 查看此时的状态
~/leetcode ((ce96adc...))
$ git status
HEAD detached at ce96adc
nothing to commit, working tree clean
# 第三次,和第一次比较的不同在于,第一次括号内是 master,现在是 commit 编号,此前是 (HEAD -> master, origin/master) 现在是 (HEAD, origin/master, master)
~/leetcode ((ce96adc...))
$ git log
commit ce96adc13c17d6cb58c8d9574569a311d1bc7d38 (HEAD, origin/master, master)
# 回到 master 分支
~/leetcode ((ce96adc...))
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
# 第四次,可以看到现在已经和第一次查看到的内容完全一致了
~/leetcode (master)
$ git log
commit ce96adc13c17d6cb58c8d9574569a311d1bc7d38 (HEAD -> master, origin/master)
将一个个 commit 视作链表中的一节,HEAD 指针一共移动了三次,ce96
这个 commit 有多个指针指向它。
HEAD - master - origin/master
这三者的关系单独来说明:
HEAD
每一条分支都有一个 HEAD 指针,指向正在操作的当前的 commit。如图所示,此时 HEAD 指针指向的 commit 为 b9df6a4a
。
使用 git reset 651f
命令,此时 HEAD 指针指向的 commit 为 651f2326
。
master
上述案例可以看到,HEAD 指针随 reset [id] 号而移动,master 却还是 master,这是因为 master 属于 branch,而 HEAD 无论怎么移动都在 master 分支掌控之中。现在我们来改变 branch,使用 git checkout feature1 将分支转换为 feature1 分支。此时 HEAD 又变了指向,这说明一个项目中 HEAD 只会指向一个 commit,它始终起到指示当前操作的 commit 的作用。master 这时候仍然还在原来的位置,可以推断,切换回 master 分支的时候仍然从那个位置开始操作。
origin/master
这个标识着本地分支 master 在远程仓库 origin 同步的 commit,在上面的图片还能看到 origin/feature1,这说明远程仓库有两个分支,经验证猜想也是正确的。
tag
此时输入了 git tag -a v1.0
命令,tag 其实也是一种标识的作用,一般都是用来标记版本,毕竟一个个 commit 的 id 虽然可以保证不重样,但是却难记住。就好像 ip 和域名一样,tag 就是好记的域名 www.baidu.com 。
总结
IDEA 非常贴心,将这些标签是整得明明白白,一共就四样:无处不在的 HEAD,绿色的 branch,紫色的远程仓库标签,灰色的 tag 标签。它们统一作用在 commit 上面,所以 commit 才是终极 boss,标签再多还是围绕它转。
写在最后
以上就是我在学习 git 和 GitHub 的一些小结,为什么萌发学习的念头呢?因为在 GitHub 上看大公司的项目才体会到 git 和 GitHub 的大用处,这确实是现在我这个阶段所接触不到的。
正如我之前的项目截图,git 成为我一个代码记录的工具,根本用不到 merge 这些比较复杂的操作,甚至后面都使用脚本自动提交了。直到我看到一些大牛在为大公司修 bug 时才发现,大公司的项目就是最好的学习资料,在看那些项目和 issue 的时候才发现对 git 和 GitHub 了解太少了。
最后放一个图,是 alibaba 的 fastjson 的,直到看到这个,才明白 git 的能力。