当前位置: 首页 > 科技观察

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

时间:2023-03-13 09:18:37 科技观察

前两天良旭在做整合的时候遇到了麻烦。事情是,良旭的一个同事不小心将一个错误的dev分支合并到了master分支,导致良旭编译失败。因此,我们需要将版本回滚到合并前的状态。如果是下面的状态,那还好办:在这种情况下,我们只需要一个gitreset命令:gitreset--hardHEAD~但是,如果是下面的状态,情况就不那么简单了:在这种情况下,你不能只需使用gitreset命令。这就是梁旭这次遇到的问题。为了解决这个问题,我们需要找出合并后的分支和合并前的分支的区别,然后回滚版本。这种情况下,版本回滚不能单独用gitreset来完成,需要用gitrevert。后面会详细介绍如何优雅回滚版本。回到正题,我们如何找出合并分支和合并前分支的区别呢?这里我们需要用到gitlog命令。我们先模拟出这两个分支的提交情况:dev分支提交情况:[alvin@VM_0_16_centosgit-log]$gitlogdevcommitb191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+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]版本4commitfac6c60ed28c5acfcd01284336d4201cc55ee2e7Author:LiangxuDate:SatDec820:57:012018+0800[both]Version1masterbranchsubmission:[alvin@VM_0_16_centosgit-log]$gitlogmastercommitc690054c67b833b22dce4120899526743b20d36dAuthor:Liangxu907Date:31:472018+0800[master]版本7commitdbe54166608772486408c1dea05304de45dba430Author:LiangxuDate:SatDec821:00:272018+0800[both]版本3commit31894364b1396b00d2935373387397ef930416e4Author:LiangxuDate:SatDec820:59:262018+0800[both]Version2commitfac6c60ed28c5acfcd01284336d4201cc55ee2e7Author:LiangxuDate:SatDec820:57:012018+0800[both]Version1在这些commit中,[both]表示两个分支只有commit的意思,而[Commitingdev]在dev分支,[master]表示只在master分支提交1.查看dev分支存在,master分支不存在的commit。Command:gitlogdev^masterResult:[alvin@VM_0_16_centosgit-log]$gitlogdev^mastercommitb191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+0800[dev]版本6commit793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]版本5commit4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec820:58:052018+0800[dev]版本三明显commit5版本[sev]6只在开发分支反之,如果想查看master分支有但dev分支没有的commit,可以使用如下命令:163.com>Date:SunDec907:31:472018+0800[master]Version7方法二使用如下命令:gitlogmaster..dev如果想查看只有master分支没有dev分支的commit,master和dev交换一下即可:gitlogdev..这两个master命令的执行结果同上,结果不再赘述。2.事先不知道两个分支的commit状态,如何查看两个分支的区别?这种情况,运行一次上面的命令,其实就可以知道大致的思路了。但是有没有更简单的方法呢?Git也为你想到了这个问题,也提供了解决方案:gitlogmaster...dev结果:[alvin@VM_0_16_centosgit-log]$gitlogmaster...devcommitc690054c67b833b22dce4120899526743b20d36dAuthor:LiangxuDate:SunDec907:31:472018+0800[master]版本7commitb191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+0800[dev]版本6commit793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]version5commit4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec820:58:052018+0800[dev]version4,这里和master之间有3个点,请注意,与前面的命令不同(两个点)).而且这条命令的执行结果和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...devcommitDate:SunDec907:018+072[master]版本7commit>b191410906ae20a865fde3f163bb01fd6cfc1f11Author:LiangxuDate:SatDec821:03:132018+0800[dev]版本6commit>793c9582ab0a45c4f8f548be36c06bc5ca427c62Author:LiangxuDate:SatDec821:02:302018+0800[dev]Version5commit>4872f653a8fd7c8541abb4a292d628dc7625884bAuthor:LiangxuDate:SatDec820:58:052018+0800[dev]Version4我们会发现commit和hash值之间多了一个<或>,其中<表示仅在master分支上提交,>表示仅在dev分支上提交。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!