2018年8月6日 星期一

git revert merge commit心得

情境
developer_c 將未測過的分支merge到主分支上,然而要如何處理此情況?
(下圖中 developer_c 所有的提交都是沒測過的,線上git log沒有的)

$ git log --graph --decorate
* commit 17d7378fbc6158ba78dda5bee3888946262dae00 (origin/v/1.0)
| Author: developer_c <you@example.com>
| Date:   Wed Aug 1 14:27:36 2018 +0800
|
|     developer_c commit 2
|
*   commit 343d7522c01f0a23694c23bf100e64c73fd564ac
|\  Merge: 11a53f7 d785818
| | Author: developer_c <you@example.com>
| | Date:   Wed Aug 1 14:26:41 2018 +0800
| |
| |     Merge branch 'v/1.0' of www.gitlab.com:root/admin into v/1.0.cy
| |
| *   commit d7858187c1047c3070b7cf22e8ecc73662fa36ff
| |\  Merge: 3152999 3aa9df2
| | | Author: developer_y <developer_y@example.com>
| | | Date:   Mon Jul 30 16:43:21 2018 +0800
| | |
| | |     Merge branch 'v/1.0' of www.gitlab.com:root/admin into v/1.0
| | |
| | * commit 3aa9df2a1bce8a2140dbdc284c99281101d13c28
| | | Author: developer_k <developer_k@developer_k-VirtualBox>
| | | Date:   Sat Jul 28 14:39:24 2018 +0800
| | |
| | |     developer_k commit 3
| | |
| | * commit 5613362f2dd3f880dd51e93490674b09ad002658
| | | Author: developer_k <developer_k@developer_k-VirtualBox>
| | | Date:   Sat Jul 28 13:42:34 2018 +0800
| | |
| | |     developer_k commit 2
| | |
| | * commit c1c959dff6814d3265f83a74abe7ada284d1fcd4
| | | Author: developer_k <developer_k@developer_k-VirtualBox>
| | | Date:   Fri Jul 27 18:44:38 2018 +0800
| | |
| | |     developer_k commit 1
| | |
| | * commit 061a2e49e399a52fa9750f6ac283f00bdfdbc839
| | | Author: developer_b <developer_b@example.com>
| | | Date:   Thu Jul 26 16:55:41 2018 +0800
| | |
| | |     developer_b commit 1
| | |
| * | commit 315299970b9e47c35e1f5b623fbfc063a9f2f2b7
| |/  Author: developer_y <developer_y@example.com>
| |   Date:   Mon Jul 30 16:43:01 2018 +0800
| |
| |       developer_y commit 4
| |
| * commit ea2d0d563cfd576a59d174d684411d3d7209f7c4
| | Author: developer_y <developer_y@example.com>
| | Date:   Thu Jul 26 10:03:13 2018 +0800
| |
| |     developer_y commit 3
| |
* |   commit 11a53f77caf39dc0444852d97e7e647cf1a2227c
|\ \  Merge: daa70a6 67528e6
| |/  Author: developer_c <you@example.com>
| |   Date:   Wed Jul 25 18:49:01 2018 +0800
| |
| |       Merge branch 'v/1.0' of www.gitlab.com:root/admin into v/1.0.cy
| |
| * commit 67528e6cd2e20c128637f23adb9672d7eddfbca4
| | Author: developer_y <developer_y@example.com>
| | Date:   Tue Jul 24 15:27:15 2018 +0800
| |
| |     developer_y commit 2
| |
| * commit 24ea51e72478735b03a86e9beab9d49036d62278
| | Author: developer_y <developer_y@example.com>
| | Date:   Mon Jul 23 13:51:06 2018 +0800
| |
| |     developer_y commit 1
| |
* | commit daa70a6a8514ee0ff790b15433f92d0d2f58d6c7 (origin/v/1.0.cy)
|/  Author: developer_c <you@example.com>
|   Date:   Fri Jul 20 10:27:21 2018 +0800
|
|       developer_c commit 1
|

developer_c commit 2 ( 17d7378 ) 因為是合併後再提交的,所以直接revert就好
$ git revert 17d7378fbc6158ba78dda5bee3888946262dae00

Merge branch 'v/1.0' of www.gitlab.com:root/admin into v/1.0.cy ( 343d752 ) 因為是merge 的commit ,必須指名 -m 參數才能revert。然而這分支中間又合併了一次 Merge branch 'v/1.0' of www.gitlab.com:root/admin into v/1.0.cy (11a53f7
所以必須 -m 2343d752 分支上的  11a53f7daa70a6 回復
$ git revert -m 2 343d7522c01f0a23694c23bf100e64c73fd564ac

使用git log -p file_name、 git show commit 檢查中間commit(如 3aa9df2、3152999)的修改沒有受影響

參考資料:
https://stackoverflow.com/questions/7099833/how-to-revert-a-merge-commit-thats-already-pushed-to-remote-branch  How to revert a merge commit that's already pushed to remote branch?