zoukankan      html  css  js  c++  java
  • git

    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 指针,指向正在操作的当前的 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 的能力。

  • 相关阅读:
    如何将本地项目发布到gitee?
    spingboot使用redis连接池报错
    swagger2中UI界面接口点击无法展开问题解决
    idea在Mybatis的xml里面写sql时,表名、字段、报红问题的解决方法
    svn如何创建分支
    Java 反射修改类的常量值、静态变量值、属性值
    Vue简单入门
    Ajax原理简说
    《机器学习Python实现_10_15_集成学习_lightgbm_进一步优化》
    《机器学习Python实现_10_14_集成学习_xgboost_优化介绍》
  • 原文地址:https://www.cnblogs.com/chenxianbin/p/11967980.html
Copyright © 2011-2022 走看看