git——merge & revert & log filter & cherry-pick

有时候会遇到错误Merge的情况,这种情况需要使用-m参数。

             如:

$ git log

commit 414b65a80446********8281c4479f01
Merge: eb027*****3268
Author: CHN\user <user@****.com>
Date:   Wed Mar 4 14:46:27 2020 +0800

    Merge branch 'feature/v*.*.1' of http://giturl into feature/v*.*.1

这个commit错误地合并了分支,需要撤销merge:

git revert -m {1 or 2} 414b65a80446********8281c4479f01

如果要revert到第一个commit,参数选择1,如果要revert到第2个commit,选择2.

 

 

在旧代码分支中被错误了引入了新代码的情况:根据情况选择

1.利用revert撤销

2.cherry-pick重新应用相关的commit。

可以考虑按照如下步骤处理,需要利用到git-bash:

  1. 先确认准确版本的Commit信息
  2. 根据新Commit的数量决定处理策略,有以下两种方式
    1. 直接用git revert撤销相关修改
    2. 用git reset hard会到指定commit,然后使用git cherry-pick命令应用相关修改

一般来说,commit的过滤可以参考如下方式进行。

git log  --branches=*v2.0*  --since 2019-03-26  --pretty=format:"%an %h %aD %s " --reverse |grep  -i  "panpan\|tiantian"

再利用cut -d “ “ -f2可取得commit number。随后可利用xargs -n 1 进行批量处理了。

 

panxi@**** MINGW64 /d/Projects/projectname (feature/v1.1)
$ git log --branches=*feature/v1.1_issues_p1* --since 2020-03-01 --pretty=format:"%an %h %aD %s " --reverse |grep  -i  "panpan"
CHN\panpan 6ec***1f Wed, 4 Mar 2020 12:03:40 +0800 Feature #8858
CHN\panpan eb8***ba Wed, 4 Mar 2020 14:22:41 +0800 Feature #8858
CHN\panpan cb***2b4 Wed, 4 Mar 2020 15:10:23 +0800 Feature #8858
CHN\panpan  8f***bad Wed, 4 Mar 2020 17:54:05 +0800 fix 账户充值:如果存在未完成的钱包绑定,则不允许赠送
CHN\panpan 60***250 Wed, 4 Mar 2020 17:55:01 +0800 Merge branch 'feature/v1.1_issues_p1' of http://****** into feature/v1.1_issues_p1
CHN\panpan 0e***19b Wed, 4 Mar 2020 18:47:37 +0800 代码优化
CHN\panpan d***4fc Wed, 4 Mar 2020 21:08:24 +0800 fix Feature #8858
CHN\panpan 80***c5 Fri, 6 Mar 2020 12:46:01 +0800 fix 18854
CHN\panpan c7***db Fri, 6 Mar 2020 12:47:49 +0800 Merge branch 'feature_v1.1_issues_p1_pan' into feature/v1.1_issues_p1
CHN\panpan 8a***57 Fri, 6 Mar 2020 12:48:13 +0800 Merge branch 'feature/v1.1_issues_p1' of http://****** into feature/v1.1_issues_p1
CHN\panpan 5e***08b Fri, 6 Mar 2020 19:20:42 +0800 Bug #8974
CHN\panpan 0b7***3f Mon, 9 Mar 2020 13:24:28 +0800 update es setting


panxi@**** MINGW64 /d/Projects/projectname (feature/v1.1)
$ git log --branches=*feature/v1.1_issues_p1* --since 2020-03-01 --pretty=format:"%an %h %aD %s " --reverse |grep  -i  "panpan" | cut -d " "  -f2 | xargs -n 1
6e***21f
eb***fba
cb***2b4
8f***ad
60***250
0e7***19b
d1***4fc
80***c5
c7***db
8***57
5e***8b
0***3f


$ git cherry-pick 6e***21f #如果有冲突,需要处理之后 git add && git commit
$ git push

  

Git revert -m

 

这其实是个非常简单的指令,甚至用AS,直接右键操作不需要两秒钟
但今天使用命令行的方式操作的时候居然发现了点不一样的地方:
如下我希望revert某个commit,找到了它的id,跑一下命令之后居然发现报错了,如下

$ git revert d2e4217b332e8bf1

error: commit d2e4217b332e8bf1 is a merge but no -m option was given.
fatal: revert failed

然后看了下help发现,你需要用 -m 指定1或是2:git revert [id] -m [1|2]
为什么呢,不是直接反向执行下这个commit进行的修改吗,commit加一行revert就减一行吗?为什么还要选1还是2模式

这正好就触及到你对git实现原理的本质理解了,git并不是基于diff进行管理的(有这样的版本管理系统),git的每个commit都是一个当前版本的快照,简单说每个commit都是一个完整的仓库版本,所以当你需要revert某个commit的时候,GIT需要知道你到底是希望revert哪个commit与这个commit间的改动

不过其实并没有那么复杂,你要revert一个commit,就是revert掉这个commit和它上个commit间的改动,所以大部分时候,你直接revert就好了,不用指定-m参数

不过当你要revert的的commit的上面有两个commit节点的时候,问题就来了

A -> B -> 
            E -> F
C -> D ->

比如这里的E节点,它是AC两个分支合并的节点,这里假设是你在A分支使用命令merge C,那么E就有两个上游节点了,当你在新的分支F(其实就是之前的A分支)revert E 时,你就需要加上-m参数了,当你指定1时,就是revert 掉 B到E的改动,当你指定2时,你也可以revert 掉 D到E的改动,其实大部分时候我们都是选1就好了~

 

 

posted @ 2020-03-09 14:11  PanPan003  阅读(313)  评论(0编辑  收藏  举报