
git을 배울때 rebase 방식으로 브랜치를 합치는 것은 변경 이력을 남기지 않고 덮어씌우기 때문에 권장하지 않는다고 배웠다.
이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라!
rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다.
공개 저장소에 push한 커밋을 rebase하면 동료는 해당 커밋이 없기 때문에 다시 merge해야한다.
동료의 커밋을 다 지워버릴 수도 있는 작업이라니 설명을 들을때만 해도 나는 절대 쓸일이 없을 것 같다고 생각했다.
그러나 로컬에서 작업할 때 커밋 이력을 깨끗하게 관리하고자 할때마다 git rebase를 자주 사용하게 되어 관련 내용을 정리해두려고 한다.
git rebase : 한 브랜치의 커밋들을 다른 브랜치의 끝으로 재배치(reapply)하는 작업
git rebase -i : 커밋을 세부적으로 조작할 수 있는 상호작용 모드(interactive rebase)
git rebase 실행
git rebase -i HEAD~5 // 최근 5개의 커밋을 대상으로 재배치 시작
git rebase -i <commit ID> // 커밋 아이디 다음부터 ~ 현재 커밋까지 전부 재배치 시작
→ 코드를 실행하면 편집기에서 커밋의 목록이 표시됨
pick abc123 첫 번째 커밋 메시지
pick def456 두 번째 커밋 메시지
pick ghi789 세 번째 커밋 메시지
커밋 편집기(vim) 사용법
커밋 순서를 변경할 때 사용하는 편집기는 기본적으로 vim이고
vim에서는 일반적인 ctrl+c, ctrl+v 단축키를 사용할 수 없다.
- 명령 모드 진입 : vim은 명령 모드 상태로 시작된다.
- `a` or `i` : 명령 모드 → 입력 모드
- `ESC` : 입력 모드 → 명령 모드
- 줄 복사/삭제 후 붙여넣기
- `dd` : 이 줄 잘라내기 (삭제)
- `p` : 삭세한 줄 붙여넣기 (현재 커서 아래에 붙여넣기)
- 커서 이동 : 방향키 or h(왼)-j(아래)-k(위)-l(오)
- vim 저장 및 종료
- `:q` or `:q!`: 저장하지 않고 종료 (!는 강제종료)
- `:wq` or `:wq!` : 저장한 후 종료 (!는 강제종료)
- 커밋 명령어
- pick : 해당 커밋을 그대로 유지 (기본 설정)
- reword : 커밋 메시지만 수정
- edit : 커밋 내용을 수정하거나 추가
- squash : 이전 커밋과 병합 (커밋 메시지 병합 가능: 메세지 수정 가능)
- fixup : 이전 커밋과 병합 (커밋 메시지 무시: 이전 커밋 메세지만 유지)
- drop : 해당 커밋을 삭제
커밋 순서 변경 후, 저장
→ 커밋 순서만 바꿀때는 pick을 그대로 두고, 순서만 이동
pick ghi789 세 번째 커밋 메시지
pick abc123 첫 번째 커밋 메시지
pick def456 두 번째 커밋 메시지
→ 커밋 메세지를 수정할 때는 reword로 수정
pick ghi789 세 번째 커밋 메시지
reword abc123 수정된 커밋 메시지
pick def456 두 번째 커밋 메시지
git push를 사용해야 할 경우, --force 옵션 사용
git push --force origin <원격브랜치>
도움되는 글 잘 읽었습니다.