[Git] revert commit is ignored when merge branch

문제

branchA 에 revert commit 이 ν¬ν•¨λ˜μ–΄ 있고 main μ—λŠ” 없을 λ•Œ, branchA μ—μ„œ `git merge main` 을 μˆ˜ν–‰ν•˜λ©΄ main 브랜치의 μƒνƒœμ™€ λ™μΌν•˜κ²Œ revert commit 이 μ—†λŠ” κ²ƒμ²˜λŸΌ λ¬΄μ‹œν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

merge recursive μ „λž΅

git μ—μ„œλŠ” merge λͺ…λ Ήμ–΄ μ‚¬μš© μ‹œ κΈ°λ³Έ μ „λž΅μœΌλ‘œ recursive λ₯Ό μ‚¬μš©ν•˜λŠ”λ°, 이 μ „λž΅μ€ λ‹€μŒκ³Ό 같이 λ™μž‘ν•©λ‹ˆλ‹€.

1. 두 μ»€λ°‹μ˜ 곡톡 쑰상 컀밋을 μ°ΎμŠ΅λ‹ˆλ‹€.

2. 각 브랜치의 λ³€κ²½ 사항을 μ‘°ν•©ν•΄ μƒˆλ‘œμš΄ 병합 컀밋을 λ§Œλ“­λ‹ˆλ‹€.

3. 2λ²ˆμ—μ„œ 좩돌이 λ‚˜λ©΄ μ‚¬μš©μžμ—κ²Œ 해결을 μœ„μž„ν•©λ‹ˆλ‹€. (recursive μ „λž΅)

 

이슈 상황 μžμ„Ένžˆ

 

브랜치 상황

μ΄μŠˆκ°€ μƒκ²Όλ˜ 상황을 κ·ΈλŒ€λ‘œ κ°€μ Έμ™€λ΄€μŠ΅λ‹ˆλ‹€.

main branch μ—μ„œ 24.12.0 브랜치λ₯Ό λ”΄ ν›„ react-query commit 을 ν¬ν•¨ν•˜μ—¬ main 에 λ‹€μ‹œ λ¨Έμ§€ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έ ν›„ 24.12.2 브랜치λ₯Ό λ”°κ³  ν•΄λ‹Ή commit 을 revert ν–ˆλŠ”λ°, 이 λ•Œ 24.12.2 브랜치λ₯Ό μ–΄λŠ λΈŒλžœμΉ˜μ—μ„œ λ”°λŠλƒμ— λ”°λΌμ„œ κ²°κ³Όκ°€ λ‹¬λΌμ§‘λ‹ˆλ‹€.

 

1) 24.12.0 λΈŒλžœμΉ˜μ—μ„œ 땄을 λ•Œ.

mainμ—μ„œλŠ” 24.12.0 브랜치λ₯Ό 머지할 λ•Œ squash merge 둜 λ¨Έμ§€ν•˜κΈ° λ•Œλ¬Έμ— react-query commit 이 곡톡 쑰상 컀밋이 될 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ mainκ³Ό 24.12.2 브랜치의 곡톡 쑰상 컀밋은 react-query μ½”λ“œ μ‚½μž… μ΄μ „μ˜ μ½”λ“œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

2) 24.12.0 κ°€ λ¨Έμ§€λœ main λΈŒλžœμΉ˜μ—μ„œ 땄을 λ•Œ.

mainκ³Ό 24.12.2 브랜치의 곡톡 쑰상 컀밋은 24.12.0 브랜치의 머지 컀밋 이후가 될 κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ 곡톡 쑰상 컀밋은 react-query μ½”λ“œ μ‚½μž… μ΄μ „μ˜ μ½”λ“œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 차이둜 24.12.2 λΈŒλžœμΉ˜μ—μ„œ `git merge main` μˆ˜ν–‰ μ‹œ 1)의 μƒν™©μ—μ„œλŠ” react-query μ½”λ“œκ°€ 반영된 μƒνƒœ, 2)의 μƒν™©μ—μ„œλŠ” react-query μ½”λ“œκ°€ revert 된 μƒνƒœ κ°€ λ©λ‹ˆλ‹€.

 

해결법

1. `git merge -s ours main`으둜 -s ours μ˜΅μ…˜μ„ μ£Όλ©΄ 병합 μΆ©λŒμ„ λ¬΄μ‹œν•˜κ³  ν˜„μž¬ 브랜치의 λ‚΄μš©μ„ μš°μ„ μ‹œν•˜μ—¬ 병합할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ΄λŸ¬ν•œ 좩돌이 λ‚˜μ§€ μ•Šκ²Œ squash merge κ°€ μ™„λ£Œλœ λΈŒλžœμΉ˜μ—μ„œ μƒˆλ‘œμš΄ 브랜치λ₯Ό λ”°μ•Ό revert μ‹œ revert 컀밋이 λ°˜μ˜λ˜μ§€ μ•ŠλŠ” 상황을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•