[Git] 다른 브랜치로 커밋 이동하기

River Kim·2023년 3월 2일
1
post-thumbnail

자바를 처음 배우기 시작하면서 만들었던 개인 프로젝트의 리팩토링 작업을 시작하게 됐다. 마음 먹고 시작한 건 아니었다. 과거를 들추다보니 당시 작업했던 프로젝트가 재밌어 보였다. 자바 텍스트 게임이었는데 다시 한번 실행해보고 싶었으나 실패했다. 그래서 여기 저기 조금씩 손보면서 여러 개의 커밋을 남겨버렸는데 이럴 거면 refactoring 브랜치를 만들어서 작업할 걸.. 싶었다. 그래서 기존 커밋을 다른 브랜치로 옮기는 방법을 알아봤다.

우선 나의 상황과 요구사항을 정리하면 다음과 같다.

  • master 브랜치에서 작업 후 커밋
  • master 브랜치에 있는 커밋을 refactoring 브랜치로 옮기고 싶음
  • master 브랜치는 리팩토링 전 상태로 돌아가길 원함

들어가기 전에..

  • 명령어는 터미널에서 실행했다.
  • 브랜치 변경 및 병합, 커밋 이동 과정 등의 이해를 돕기 위해 GitKraken 의 그래프를 캡쳐하여 첨부했다.
  • 쉘 명령어 아래 내용은 나의 상황을 기준으로 작성했다.

작업 전 그래프작업 전 그래프


1. 이동 대상 브랜치로 체크아웃 (없으면 생성)

git checkout [이동 대상 브랜치명]

커밋을 이동할 대상 브랜치로 체크아웃 한다. 아직 브랜치가 없다면 생성한다. 이 때 중요한건 이동 대상 브랜치의 HEAD 위치다. 브랜치를 생성하고 싶었던 커밋 위치에 HEAD가 있어야 한다.

나의 경우에는 Update README.md 커밋 위치에 refactoring 브랜치를 생성했다. 이렇게 되면 HEAD 커밋 이후로 존재하는 커밋들이 refactoring 브랜치로 이동된다.

Update README.md 커밋에 refactoring 브랜치를 생성하고 체크아웃한 상태. refactoring 브랜치 기준에서 보면 master 브랜치가 다른 분기로 뻗어있는 것을 볼 수 있다.


2. 커밋이 있는 브랜치를 병합

git merge [커밋이 있는 브랜치명]

나의 경우에는 master 브랜치에 커밋이 있기 때문에 git merge master 를 실행했다.

master, refactoring 두 브랜치의 HEAD가 동일한 위치에 존재하게 됐다.


3. 커밋이 존재하는 브랜치로 체크아웃

git checkout [커밋이 있는 브랜치명]

master 브랜치에 커밋이 존재하므로 git checkout master 를 실행했다.

현재 브랜치가 refactoring에서 master 브랜치로 변경된 것을 확인할 수 있다.


4. 커밋이 존재하는 브랜치의 HEAD를 원하는 곳으로 이동

git reset --keep HEAD~[뒤로이동하고싶은커밋수]

나는 master 브랜치가 Update README.md 커밋에 위치하길 원한다. 현재 위치를 기준으로 5번째 전 커밋이므로 git reset --keep HEAD~5 를 실행했다.

로컬저장소의 master 브랜치의 HEAD가 Update README.md 커밋 위치로 이동한 것을 확인할 수 있다.


5. 현재 브랜치를 원격저장소로 force push

git push -f

현재 내 로컬저장소의 master 브랜치는 Update README.md 커밋 위치에 존재하지만 원격저장소의 master 브랜치는 refactoring 브랜치와 동일한 위치에 HEAD가 존재한다.

그래프를 보면 로컬저장소의 master 브랜치는 원격저장소의 master 브랜치보다 뒤에 있다. 그냥 git push 를 실행하면 원격저장소의 master 브랜치 내용이 로컬저장소의 master 브랜치 내용으로 덮어 써지기 때문에 push가 거부된다.

force push를 지양하지만 해당 프로젝트는 개인 프로젝트이고 refactoring 브랜치에 병합된 커밋 외에는 다른 커밋도 없다. 그래서 로컬저장소의 master 브랜치를 원격저장소에 force push 했다.

master 브랜치를 force push 한 상태


6. 이동 대상 브랜치 push

git checkout [대상브랜치]
git push

refactoring 브랜치도 원격저장소에 저장했다. git checkout refactoring 명령어로 refactoring 브랜치로 체크아웃 한 후 git push 명령어로 원격저장소에 push했다.

그래프가 원하던 대로 완성됐다!


마치며..

더 좋은 방법이 있을 수 있지만.. 난 아직 모른다. 그 방법.

이 방법 마저도 참고한 글이 있다. delftstack 이라는 사이트의 글인데 한글 번역이 된건지.. 적혀있는건 한글이지만 뭘 의미하는지 정확하게 이해하기 어려웠다. 해당 글에서 필요한 부분의 명령어를 따라하면서 내 프로젝트에 적용한 글을 남긴다.

해당 사이트의 번역은 아쉽지만 다른 정보도 많아 보인다.(광고도 많다)

delftstack 에 대해 찾아보니 다국어를 지원하는 것 같다. 내가 참고한 건 한글로 번역된 글이었지만.. 영어로 보는 것을 추천! 참조에 원문 링크를 추가했다.


참조

profile
언제까지 개발자로 살 수 있을까..

0개의 댓글