Skip to content
On this page

git常用命令看图说话

1.实例概要

结合github实例来分析常用操作:git log、git reset、git revert、git merge、git checkout

repositories地址:https://github.com/jmingzi/mvvm.git

分支结构

git branch
* master
  01
  02

实例说明:在实际的项目中多人开发,或者说多个需求不同排期开发的时候,就会遇到分支很多的情况,难免出错。我们需要在出错之后,能够分析出错的信息以及回滚代码。

2.git log

在项目中运行git log

// 最近的一次提交
commit af9b7c22c8d4f0f97f2e40e7c348c6c51fc0c4df (HEAD -> master, tag: first_tag, origin/master, origin/HEAD)
// 合并的2个分支在下面可以找到
Merge: d3ae5c5 07f47b0
Author: yangming <472102644@qq.com>
Date:   Fri Jul 6 09:36:53 2018 +0800

    resolve conflicts

commit 07f47b0761a418ea29b29a3471048ec5f4db06bf (01)
Author: yangming <472102644@qq.com>
Date:   Fri Jul 6 09:35:49 2018 +0800

    add 01.js

// 这是一个回滚操作
commit d3ae5c5f484f3e8ef20dd3773c1c7e671609408b
Author: yangming <472102644@qq.com>
Date:   Fri Jul 6 09:34:02 2018 +0800

    Revert "change readme.md"
    // 回滚到f9cf5c10b
    This reverts commit f9cf5c10b568043ac3fd9c080758f02f81d24d52.

commit 8732fc69ed0fd52c0023a5ab70012a71eac9b8cc
Merge: f9cf5c1 8268d84
Author: yangming <472102644@qq.com>
Date:   Fri Jul 6 09:32:51 2018 +0800

    Merge branch '02'

commit 8268d8463c25533076a0191baaf17962b6b17ec4 (02)
Author: yangming <472102644@qq.com>
Date:   Fri Jul 6 09:32:38 2018 +0800

    add 02.js

commit f9cf5c10b568043ac3fd9c080758f02f81d24d52
Author: yangming <472102644@qq.com>
Date:   Thu Jul 5 19:32:20 2018 +0800

    change readme.md

commit 762866e7d1c293e73655a8364ed05f5357b6527a
Author: yangming <472102644@qq.com>
Date:   Mon May 21 23:27:20 2018 +0800

    demo

git log中,我我们可以看到很多基本信息,我们可以简化信息输出

git log --oneline --decorate

简化后

af9b7c2 (HEAD -> master, tag: first_tag, origin/master, origin/HEAD) resolve conflicts
07f47b0 (01) add 01.js
d3ae5c5 Revert "change readme.md"
8732fc6 Merge branch '02'
8268d84 (02) add 02.js
f9cf5c1 change readme.md
762866e demo

3.git checkout

我们一般用git checkout来切换分支,加上-b参数是新建分支,加上-D是删除本地分支

它还有另外一个作用,用来查看以往分支的内容。场景是,当我们需要回顾项目以往版本的代码时,可以随时切换回去。

git checkout commit_id/tag

例如以上项目

git checkout 8732fc6

5b40b396fe88c20035e51d3f

会提示你,当前git的工作区指向一个新的暂存分支(8732fc6),分支名称就为commit_id,还提示你如果想创建新分支就加-b参数。

我们再来查看分支

5b40b4459f5454003120b8b8

说明此时确实新建了一个分支用来查看commit_id为8732fc6的代码,那么我们同样可以切换分支切换回去。

5b40b4be9f5454003120bcd4

切换分支后,再查看分支列表发现那个新建的分支确实是暂存的。

4.git reset、git revert

他们的区别在于是否保存回滚分支的记录,在很多时候,我们都希望任何操作记录是被记录的,那样都可以回滚,所以任何时候都是推荐使用revert的。

git revert回滚时做了2件事情

  • 回滚你的代码
  • 新建一个commit记录来记录本次回滚

git reset回滚时也做了2件事情

  • 回滚你的代码
  • 清除了回滚中间的commit记录

git reset支持添加参数

  • --soft – 缓存区和工作目录都不会被改变
  • --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
  • --hard – 缓存区和工作目录都同步到你指定的提交

git revert举例: 还是上面的例子,有三个分支master, 01, 02,我们会过去看第二条记录add 01.js,我们可以查看本次提交的代码内容

git checkout 07f47b0

我们可以发现修改了02.js文件,此时我们切换到02分支,也同时修改这个文件 ,然后合并到master再提交。

查看log,新增了2条记录

5b40b90cfe88c20035e54f24

此刻,我们再回滚到上面说到的第二条记录add 01.js

5b40b9cd67f356003a63c6f1

发现回滚时产生冲突了,因为我们同时修改了同一个文件,那出现这种情况怎么办呢?

5b40ba9d0b6160003c1c7139

可以使用git revert --abort取消本次回滚,也可以在解决冲突后git revert --continue完成本次回滚。

此时git status提示,在该版本上02.js被它们删除了,也就是说这个版本上还不存在02.js,所以冲突了。

所以你需要删除它,然后运行git revert --continue

5b40bdb99f5454003b55bc68

显示回滚成功。