继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

git 如何比较不同分支的差异

良许Linux
关注TA
已关注
手记 218
粉丝 81
获赞 268

前两天,良许在做集成的时候碰到了一件闹心事。事情是这样的,良许的一位同事不小心把一个错误的 dev 分支 merge 到了 master 分支上,导致了良许编译不通过。于是,我们需要将版本回退到 merge 之前的状态。

如果是下面这个状态,那很好处理:

这种情况下,我们只需一个 git reset 命令即可:

git reset --hard HEAD~

但是,如果下面这种状态,情况就没那么简单了:

这种情况下,就不能简单使用 git reset 命令了。这就是良许这次碰到的问题。为了解决这个问题,我们就需要找出合并后的分支与合并前的分支的差异,再进行版本回退。这种情况下的版本回退,就不能单用 git reset 了,而是要配合 git revert 了,在后面我们将详细介绍如何优雅的进行版本回退。

回到正题,我们如何找出合并后的分支与合并前分支的差异呢?这里我们需要使用到 git log 命令了。我们先模拟出这两个分支的提交情况:

  • dev 分支提交情况:
[alvin@VM_0_16_centos git-log]$ git log dev
commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:03:13 2018 +0800

    [dev] 版本6

commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:02:30 2018 +0800

    [dev] 版本5

commit dbe54166608772486408c1dea05304de45dba430
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:00:27 2018 +0800

    [both] 版本3

commit 31894364b1396b00d2935373387397ef930416e4
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:59:26 2018 +0800

    [both] 版本2

commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:58:05 2018 +0800

    [dev] 版本4

commit fac6c60ed28c5acfcd01284336d4201cc55ee2e7
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:57:01 2018 +0800

    [both] 版本1

  • master 分支提交情况:
[alvin@VM_0_16_centos git-log]$ git log master
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date:   Sun Dec 9 07:31:47 2018 +0800

    [master] 版本7

commit dbe54166608772486408c1dea05304de45dba430
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:00:27 2018 +0800

    [both] 版本3

commit 31894364b1396b00d2935373387397ef930416e4
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:59:26 2018 +0800

    [both] 版本2

commit fac6c60ed28c5acfcd01284336d4201cc55ee2e7
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:57:01 2018 +0800

    [both] 版本1

在这些提交里 [both] 表示两个分支都有的提交, [dev] 表示只有在 dev 分支的提交,[master] 表示只在 master 分支的提交

1. 查看dev有,而 master 分支没有的提交

  • 方法一

命令:

git log dev ^master

结果:

[alvin@VM_0_16_centos git-log]$ git log dev ^master
commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:03:13 2018 +0800

    [dev] 版本6

commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:02:30 2018 +0800

    [dev] 版本5

commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:58:05 2018 +0800

    [dev] 版本4

很明显看到,版本4,5,6这三个提交只在 dev 分支里。

相反,如果想看到 master 分支有,而 dev 分支没有的提交,就可以使用如下命令:

git log master ^dev

结果:

[alvin@VM_0_16_centos git-log]$ git log master ^dev
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date:   Sun Dec 9 07:31:47 2018 +0800

    [master] 版本7

  • 方法二

使用如下命令:

git log master..dev

如果想查看只在 master 分支,而不在 dev 分支的提交,则将 master 与 dev 对调过来即可:

git log dev..master

这两条命令的执行结果与上述相同,故不重复贴结果了。

2. 提前未知两个分支提交情况,如何查看两个分支的差异?

在这种情况下,上述的几个命令都跑一遍,其实也可以知道个大概了。但有没有更简单的办法呢?git 同样为你想到了这个问题,也提供了解决办法:

git log master...dev

结果:

[alvin@VM_0_16_centos git-log]$ git log master...dev
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date:   Sun Dec 9 07:31:47 2018 +0800

    [master] 版本7

commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:03:13 2018 +0800

    [dev] 版本6

commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:02:30 2018 +0800

    [dev] 版本5

commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:58:05 2018 +0800

    [dev] 版本4

请注意,在这里,master 与 dev 之间有三个点,有别于之前的命令(两个点)。而且,这个命令的执行结果与 git log dev...master 完全一样。

我们这里是为了方便演示,加了 [master][dev][both] 这样的记号,但在实际开发过程中,很少会这样操作。那我们在执行 git log master...dev 时,怎么知道有差异的提交是在 master 分支里,还是 dev 分支里?我们只需加上 --left-right 选项即可。

git log --left-right master...dev

结果:

[alvin@VM_0_16_centos git-log]$ git log --left-right master...dev
commit < c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date:   Sun Dec 9 07:31:47 2018 +0800

    [master] 版本7

commit > b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:03:13 2018 +0800

    [dev] 版本6

commit > 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 21:02:30 2018 +0800

    [dev] 版本5

commit > 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date:   Sat Dec 8 20:58:05 2018 +0800

    [dev] 版本4

我们会发现,在 commit 与哈希值之间多了个 <> ,其中 < 表示只在 master 分支的提交, > 表示只在 dev 分支的提交。


最后,最近很多小伙伴找我要Linux学习路线图,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!目录如下:

免费送给大家,只求大家金指给我点个赞!

也希望有小伙伴能加入我,把这份电子书做得更完美!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP