标签:commit 有一个 pos set ali img 版本 merge github
在我本地的项目 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 指针,指向正在操作的当前的 commit。如图所示,此时 HEAD 指针指向的 commit 为 b9df6a4a
。
使用 git reset 651f
命令,此时 HEAD 指针指向的 commit 为 651f2326
。
上述案例可以看到,HEAD 指针随 reset [id] 号而移动,master 却还是 master,这是因为 master 属于 branch,而 HEAD 无论怎么移动都在 master 分支掌控之中。现在我们来改变 branch,使用 git checkout feature1 将分支转换为 feature1 分支。此时 HEAD 又变了指向,这说明一个项目中 HEAD 只会指向一个 commit,它始终起到指示当前操作的 commit 的作用。master 这时候仍然还在原来的位置,可以推断,切换回 master 分支的时候仍然从那个位置开始操作。
这个标识着本地分支 master 在远程仓库 origin 同步的 commit,在上面的图片还能看到 origin/feature1,这说明远程仓库有两个分支,经验证猜想也是正确的。
此时输入了 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 的能力。
标签:commit 有一个 pos set ali img 版本 merge github
原文地址:https://www.cnblogs.com/chenxianbin/p/11967980.html