当前位置: 首页 > Linux

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

时间:2023-04-06 20:09:02 Linux

前两天良旭在做整合的时候遇到了麻烦。事情是,良旭的一个同事不小心将一个错误的dev分支合并到了master分支,导致良旭编译失败。因此,我们需要将版本回滚到合并前的状态。如果是下面的状态,就好办了:这种情况下,我们只需要一个gitreset命令:gitreset--hardHEAD~但是,如果是下面的状态,情况就没那么简单了:这种情况下,你不能简单地使用gitreset命令。这就是梁旭这次遇到的问题。为了解决这个问题,我们需要找出合并后的分支和合并前的分支的区别,然后回滚版本。这种情况下,版本回滚不能单独用gitreset来完成,需要用gitrevert。后面会详细介绍如何优雅回滚版本。回到正题,我们如何找出合并分支和合并前分支的区别呢?这里我们需要用到gitlog命令。我们先模拟一下这两个分支的提交:dev分支提交:[alvin@VM_0_16_centosgit-log]$gitlogdevcommitb191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:01:1320+0800[dev]版本6commit793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]版本5commitdbe54166608772486408c1dea05304de45dba430Author:LiangxuDate:SatDec821:00:272018+0800[both]版本3commit31894364b1396b00d2935373387397ef930416e4Author:LiangxuDate:SatDec820:59:262018+0800[both]版本2commit4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec820:58:052018+0800[dev]Version4commitfac6c60ed28c5acfcd01284336d4201cc55ee2e7作者:Liangxu日期:SatDec820:57:01Branch2018+0800Commitversion1[both]:[alvin@:[alvin]VM_0_16_centosgit-log]$gitlogmastercommitc690054c67b833b22dce4120899526743b20d36dAuthor:LiangxuDate:SunDec907:31:472018+0800[master]版本7commitdbe54166608772486408c1dea05304de45dba430Author:LiangxuDate:SatDec821:00:272018+0800[both]版本3commit31894364b1396b00d2935373387397ef930416e4Author:LiangxuDate:SatDec820:59:262018+0800[both]版本2commitfac6c60ed28c5acfcd01284336d4201cc55ee2e7Author:LiangxuDate:SatDec820:57:012018+0800[both]Version1在这些提交中,[both]表示在两个分支中提交,[dev]表示仅在dev分支中提交,[master]表示仅在master分支1中提交。查看dev有但没有master分支1命令的commit方法:gitlogdev^master结果:[alvin@VM_0_16_centosgit-log]$gitlogdev^mastercommitb191410906ae20a865fde3f163bb01fd6cfc1f11作者:Liangxuc日期:星期六21:03:132018+0800[dev]Version6commit793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]version5commit4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec820:58:052018+0800[dev]version45,这三个明显是,6在开发分支。相反,如果你想看到master分支有但dev分支没有的提交,你可以使用以下命令:gitlogmaster^devresult:[alvin@VM_0_16_centosgit-log]$gitlogmaster^devcommitc690054c67b833b22dce4120899526743b20d36d作者:梁旭日期:SunDec907:31:472018+0800[master]Version7Method2使用如下命令:gitlogmaster..dev如果你想要master分支,但是不在dev分支,把master和dev交换一下即可:gitlogdev..master这两条命令的执行结果同上,结果不再重复。2.如果事先不知道两个分支的提交状态,如何查看两个分支的区别?这种情况,把上面的命令运行一遍,其实就可以有个大概的概念了。但是有没有更简单的方法呢?Git也为你想到了这个问题,也提供了解决方案:gitlogmaster...dev结果:[alvin@VM_0_16_centosgit-log]$gitlogmaster...devcommitc690054c67b833b22dce4120899526743b20d36d作者:梁旭Date:SunDec907:31:472018+0800[master]版本7commitb191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+0800[dev]版本6commit793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]Version5commit4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec8:50]2Version4请注意这里master和dev之间是三个点,和之前的命令(两个点)不同。而且这条命令的执行结果和gitlogdev...master是一模一样的。为了方便演示,我们在这里添加了[master]、[dev]、[both]等标记,但在实际开发过程中,很少这样做。那么当我们执行gitlogmaster...dev时,如何知道不同的commit是在master分支还是dev分支呢?我们只需添加--left-right选项。gitlog--left-rightmaster...dev结果:[alvin@VM_0_16_centosgit-log]$gitlog--left-rightmaster...devcommit日期:SunDec907:31:472018+0800[master]版本7commit>b191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+0800[dev]版本6commit>793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:Liangxu日期:SatDec821:02:302018+0800[dev]Version5commit>4872f653a8fd7c8541abb4a292d628dc7625884b作者:Liangxu日期:SatDec820:58:08de[04]Version2We会发现commit和hash值之间多了一个<或>,其中<表示只在master分支上commit,>表示只在dev分支上commit。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站