git commit 순서 바꾸기
● 순서 바꾸는 이유
프로젝트 개발을 진행하다 개발계에서 운영계로 배포 시 특정 대상들만 배포를 해야 하는 경우가 발생하였다.
git cherry-pick 을 이용할 수도 있지만 중간 중간 선택해서 배포를 해야 하기 때문에 어느부분까지 배포되었는지 기억을 해줘야 한다. git의 순서를 변경하여 배포를 진행한다면 조금 더 깔끔하게 브랜치를 관리할 수 있다.
예를 들어 본다면
왼쪽과 같이 commit 내용이 있다.
이번 운영에 A,B,C 기능을 배포하려고 했지만 A기능에 이슈가 발생하여 배포에서 제외하기로 했다.
그렇다면 배포시 A를 제외해야 하는데 cherry-pick을 이용할 경우 A가 배포된 브랜치의 맨 마지막에 위치하게 되어 배포된 브랜치와 분리가 이루어져서 관리가 이루어져야 한다.
● 참고 URL
개인적인 이야기를 하다 내용이 길다면 참고 url을 참고하시기 바랍니다.
https://minsone.github.io/git/git-reorder-commit
● 커밋 순서 변경
B와 C의 commit을 변경하여 commitC에서 배포 브랜치를 만들어 배포한다면 더 깔끔하게 브랜치 관리를 할 수 있다.
1. rebase를 이용하여 순서 변경하기 (git rebase --interactive )
commitA를 맨 위로 올릴 것이며 rebase시 commitA의 직전 주소(9ff7167)을 입력한다.
// git rebase --interactive ${수정할 커밋 직전 주소} or git rebase --i ${수정할 커밋 직전 주소}
git rebase -i 9ff7167
2. commit 순서 변경하기
git rebase -i 9ff7167 를 입력하면 위처럼 커밋 순서가 나오게 된다.
vi에디터를 이용하여 순서를 변경 후 저장하면 된다.
i를 눌러 에디터 모드에서 순서를 변경해줘도 되지만 잘라내기(dd)와 복사(p)를 이용하면 더 쉽게 가능하다.
B -> C -> A 로 커밋 순서를 변경하였다(아래로 내려갈수록 최신 commit)
3. 저장
:wq 로 vi를 저장한다면 커밋 순서가 변경된 것을 볼 수 있을 것이다.
이제 commitC에서 배포용 브랜치를 생성하여 배포하면 브랜치가 좀 더 깔끔하게 관리될것이다.
4. 충돌 발생
만약 충돌이 발생한다면 커밋별 충돌을 해결후 rebase를 계속 진행하면 된다.
rebase 과정에서 소스 충돌이 이루어졌고 두개의 충돌을 모두 해결하면 순서가 변경이 된다.
git rebase --continue
// rebase를 중지하려면 abort한다.
git rebase --abort