오늘은 커밋 삭제하는 법에 대해서 포스팅 해보려고 합니다.
해당 방법은 푸시 여부와 상관 없이 작동 합니다!
즉, 로컬에만 있는 커밋이든, 이미 푸시 해서 오리진에 올라간 커밋이든 상관없음!
하단에 요약 절차 있습니다.
그러나 설명 정독하시는걸 추천드려요!!!
저도 이 전체 과정을 제대로 이해하고 외우는데 시간이 꽤 걸렸음,,
상황
우선 Github repository에서 본 화면입니다. 저는 최신 커밋 세개는 그대로 두고, 하단에 있는 커밋 하나를 삭제하고 싶었어요.
본격적으로 rebase, 즉 커밋 삭제(조작) 하기 전에 git reflog에 대해서 알아봅시다.
git reflog - 깃 히스토리 확인
1. 터미널에 다음 코드를 작성하면 아래 이미지와 같은 화면이 뜹니다.
git reflog
Git reflog 는 git reset, git rebase로 삭제된 커밋 히스토리 까지 모두 확인할 수 있는 명령어입니다.
기본적으로 가장 가장 왼쪽에 있는 노란색 코드(ex. d5fcbcc4f, ..) 는 각 커밋/히스토리의 고유번호라고 생각하시면 됩니다.
사진에서 1~6번까지 뜯어가며 봐볼게요.
*체크아웃 된 브랜치 : jinnie/text-alignment
1 : 'jinnie/text-alignment' 브랜치의 가장 최신 커밋, 해당 브랜치 기준 'HEAD~0'
2 : 브랜치의 두번째 최신 커밋, 해당 브랜치 기준 'HEAD~1'
3 : 브랜치의 세번째 최신 커밋, 해당 브랜치 기준 'HEAD~2'
4 : 브랜치의 네번째 최신 커밋, 해당 브랜치 기준 'HEAD~3'
3번과 4번 사이의 줄은 'reset'이라고 적혀있는거 보이시죠?
우리는 커밋 내역을 수정할 것이기 때문에 무시해줍니다.
5 : 초록색으로 다른 브랜치명이 적혀있음, 무시
6 : reset, checkout, pull 등 커밋이 아닌 다른 내역.
'reflog' 명령어 자체가 커밋내역만을 보여주는게 아니라 위와 같이 모든 깃 히스토리를 보여줍니다.
위에도 언급 했으나 우린 커밋 히스토리를 수정해줄거기 때문에 무시해줘도 됩니다.
여기서 저는 브랜치의 네번째 최신 커밋 내역을 지우고 싶은 것이기 때문에,
해당 커밋의 고유번호인 '5d8b581e6'나, 'HEAD~3'을 사용해줄겁니다.
2. q 혹은 q! 입력
본격적으로 커밋 내용을 수정하기 전, reflog 명령어에서 나오기 위해서 q나 q!를 입력합니다.
작동이 안된다면 콜론 ':'을 친 뒤에 q 혹은 q! 를 입력합니다.
git rebase 명령어를 이용한 커밋 삭제
3. 다음 두가지 명령어 중 하나를 터미널에 입력해주면 됩니다.
git rebase -i 5d8b581e6 //커밋 고유번호
git rebase -i HEAD~3 //네번째 최신 커밋이므로 head로부터 3 (0, 1, 2, 3)
예를들어 reflog를 확인하지 않더라도
가장 최신 커밋으로부터 열번째 커밋을 지우고 싶다면 아래 명령어를 입력하면 됩니다.
git rebase -i HEAD~9
이때, 삭제하고 싶은 커밋보다 더 큰 숫자, 즉 더 이전 커밋을 입력하면 해당 커밋이 중복될 수 있으므로
꼭! 삭제하고 싶은 커밋번호에 맞춰서 입력해줘야 합니다.
'git rebase -i HEAD~3'을 입력하면 다음과같이 터미널에 4개의 커밋이 뜹니다.
** 이 화면에서는, reflog와는 반대로 최 하단에 있는게 가장 최신 커밋입니다.
저는 네번째 커밋을 지우고 싶었으므로, 최상단에 있는 네번째 커밋이 제가 지워야 할 커밋임!
이때 에디터를 'vi'라고 부르는데,
vi 에선 위, 아래, 좌, 우 네개의 방향키를 이용해 커서의 위치를 옮길 수 있습니다.
맨앞에 'pick'이라고 되어있는 것은, 이 커밋을 사용하겠다는 의미입니다.
이 부분을 아래 사진처럼 drop으로 수정하면 해당 커밋이 삭제되는 것입니다.
4.키보드에서 'i' 입력
-> vi는 기본적으로 수정이 불가능한 read-only 모드입니다. i를 눌러주면 수정모드로 바뀌어서 텍스트를 수정할 수 있습니다.
5. 지우고 싶은 커밋의 'pick'을 지우고 'drop'으로 변경
6. 'esc'자판 클릭
7. 아래 명령어를 터미널에 콜른부터 그대로 입력
:wq
그러면 성공적으로 리베이스가 진행됩니다!!!
이때, 충돌이 있는 경우, 없는 경우의 두가지 상황이 존재합니다.
충돌이 없는 경우
충돌이 없다면 마무리는 간단합니다.
8-1. 절대 그냥 푸시하지 말고, 아래 명령어를 입력해 force push 하기
git push origin jinnie/text-alignment -f
정말 중요합니다. 여기까지 해놓고 그냥 푸시를 하면, 리베이스 초보자들 (과거의 나..)이 정말 흔히 하는 실수로,
커밋이 한번더 생깁니다.
이전에 있던 커밋은 그대로 있고, 위의 세개 커밋이 그대로 또 생기는거에요.
그러니 꼭!!!! force push 하셔야합니다.
충돌이 있는 경우
깃 초보자라면 조금 복잡할수 있지만,,! vsc gui를 사용하면 매우 쉽습니다.
8-2. vsc 좌측 탭 세번째, 'source control'클릭
9. 'staged change' 위에 'conflict'칸에 있는 파일 클릭
이 화면에선 아래 세가지를 확인하면 됩니다.
1, 2는 두가지 커밋에서 충돌이 나는, 즉 서로 다른 코드 부분입니다.
이중에서 하나를 선택하면 되는거에요!
코드를 읽어보고 1을 선택해야 한다면 3번의 'Accept Current Change'를,
2를 선택해야 한다면 3번의 'Accept Incoming Change'를 클릭해주시면 됩니다.
10. Conflict가 난 모든 파일을 확인해가며 위와같은 작업을 해주고 저장해주면 됩니다.
그러면 아래 사진과 같이 conflict칸이 사라지고 평소처럼 'Staged Changes'칸만 남습니다.
11. 터미널에 아래 코드를 입력해줍니다.
git rebase --continue
12. 문제 없이 continue가 됐다면, 마무리로 terminal에 아래 코드를 입력해 force push해주면 됩니다.
git push origin jinnie/text-alignment -f
그럼 아래와같이 커밋 로그에 최신 세개만 남은 것을 볼 수 있습니다!!!
이건 로컬 깃 로그인데, 리베이스하기 전에 로컬에 backup 브랜치를 만들어놓으면 좋습니다.
요약
1. 터미널에 'git rebase -i HEAD~숫자' 입력
(숫자 : 삭제하고 싶은 커밋이 가장 최신 커밋으로부터 몇번째인지-1, 예를들어 3번째 커밋을 지우고 싶으면 'HEAD~2' 입력)
2. 'i' 클릭 (vi 수정모드 전환)
3. 삭제하고 싶은 커밋 맨 앞부분의 'pick'을 지우고 'drop' 입력
4. 'esc'클릭 후 터미널에 ':wq' 입력
5-1. 충돌이 없다 -> 터미널에 'git push origin 브랜치명 -f' 입력해 force push, 끝!
5-2. 충돌이 있다 -> 충돌난 파일을 하나하나 확인하여 충돌 해결
6. 터미널에 'git rebase --continue'입력
7. 'git push origin 브랜치명 -f' 입력해 force push!
끝입니다!
'ETC > Settings' 카테고리의 다른 글
[Android] M1 Mac에서 emulator 실행하기(feat. Android Studio, chrome is stopping, 에뮬레이터 크롬 실행 안됨 해결) (0) | 2022.06.03 |
---|---|
VS Code에서 git clone 하는 방법 (0) | 2022.05.25 |
VS Code 탭 이동 단축기 설정법 (6) | 2021.11.25 |
[Chrome DevTools] 크롬 개발자 도구 ignore, 특정 파일 skip 하고 디버깅 하기 (7) | 2021.09.24 |
[STS] Eclipse, STS 한글 깨짐, 한글 깨짐 복구, UTF-8 설정 방법, 프로젝트 한글 깨짐, 프로젝트 utf-8 설정, SVN 프로젝트 한글 깨짐 (7) | 2021.09.14 |