Git 如何比较不同分支的差异?

简介: Git 如何比较不同分支的差异?

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


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


image.png



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


git reset --hard HEAD~


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


image.png


这种情况下,就不能简单使用 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 
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 分支的提交。


目录
相关文章
|
8月前
|
开发工具 git
图解Git——分支的新建与合并《Pro Git》
在Git开发中,新建与合并分支是常见的操作。以实际开发为例:为实现新需求创建分支`iss53`进行开发;遇紧急Bug时,切换至线上分支创建`hotfix`修复并合并回线上分支,再切换回`iss53`继续工作。完成`iss53`后,切换到`master`合并。若出现冲突,使用`git status`查看,手动编辑解决冲突后标记为已解决并提交。图形化工具如`git mergetool`也可辅助解决冲突。
169 9
|
8月前
|
开发工具 git 开发者
图解Git——分支简介《Pro Git》
Git 分支是其核心特性之一,允许开发者从主开发线分离工作,避免干扰主线。传统版本控制系统创建分支效率低,而Git的分支创建和切换非常轻量高效。
431 9
|
7月前
|
开发工具 git 开发者
vscode+git解决远程分支合并冲突
通过这些详细步骤,您可以掌握如何使用VSCode和Git高效地解决远程分支合并冲突,提高开发效率和代码质量。希望这些内容对您的学习和工作有所帮助。
1548 86
|
8月前
|
存储 项目管理 开发工具
图解Git——分支开发工作流《Pro Git》
分支开发工作流利用Git的分支功能,支持灵活的项目管理。长期分支如`master`和`develop`分别保存稳定和开发中的代码;短期主题分支用于开发单一特性或修复问题,完成后合并到主分支。此模式确保代码稳定性,支持并行开发、便于审查和灵活调整。建议维护明确的长期分支,保持主题分支短小精悍,并定期清理无用分支。配置上可保护关键分支,遵循命名规范。
332 7
|
8月前
|
存储 缓存 Java
图解Git——远程分支《Pro Git》
远程分支是 Git 中用于管理分布式协作的关键概念。远程引用指向远程仓库中的分支和标签,常用 `git ls-remote` 或 `git remote show` 查看。日常开发中,通常使用远程跟踪分支(如 `origin/main`)与远程分支交互,简化远程仓库状态的管理和使用。远程跟踪分支记录远程分支的状态,但本身只读。
140 6
|
11月前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
275 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
11月前
|
开发工具 git 开发者
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
本文通过具体操作和截图,详细讲解了如何在Git中解决分支冲突问题,包括如何识别冲突、手动解决冲突代码、提交合并后的代码,以及推送到远程分支。
2545 3
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
|
12月前
|
缓存 开发工具 git
Git创建分支以及合并分支
在Git中,创建分支使用`git branch [branch_name]`,切换分支使用`git checkout [branch_name]`。修改文件后,通过`git add [file]`添加到暂存区,然后`git commit`提交到本地仓库。如果是新建分支的第一次推送,使用`git push origin [branch_name]`推送到远程仓库,之后可以简化为`git push`。合并分支时,使用`git merge [branch_name]`将指定分支的更改合并到当前分支。
372 2
Git创建分支以及合并分支
|
11月前
|
开发工具 git
Git分支使用总结
Git分支使用总结
128 1
|
测试技术 开发工具 git
掌握 Git 分支策略:提升你的版本控制技能
在现代软件开发中,版本控制至关重要,Git 作为最流行的分布式版本控制系统,其分支管理策略对于高效协作和代码维护尤为重要。本文介绍了几种常用的 Git 分支策略,包括主线开发模型、功能分支模型、Gitflow 工作流和 Forking 工作流,并探讨了如何根据项目需求选择合适的分支模型。通过保持 `master` 分支稳定、及时合并清理分支、使用命名规范、利用 Pull Request 进行代码审查及自动化测试等最佳实践,可以显著提升团队协作效率和软件质量。掌握这些策略将帮助开发者更好地管理代码库,加快开发流程。