git 현재커밋과 이전커밋 합치기
들어가기에 앞서
git을 사용하다보면 의도치 않은 커밋이 생기기 마련이다. 예를 들면 특정 기능을 완료하고 커밋을 했는데 다시 살펴보니 자잘한 오타가 있어서 오타를 수정하는 커밋을 작성해야 하는 경우가 있을 수도 있다. 이런 경우에 그냥 커밋을 하나 더 생성해도 되겠지만 그렇게하면 커밋내용이 깔끔하지 못할 수도 있기 때문에 오타를 수정하고 커밋을 한 뒤에 바로 직전에 했던 커밋과 합쳐버리는 방법을 사용하면 커밋하나로 깔끔하게 정리 할 수 있다.
원치않은 커밋 합치기
원치않은 커밋을 합치는 방법은 2가지를 생각해 볼 수 있다.
- git reset
- git rebase -i
git reset
reset을 사용하면 가장 최근 커밋의 내용으로 이동한다. 커밋을 하고 아무 수정도 하지 않은 상태라면 최근에 올린 커밋을 없애고 해당 수정내용들을 staged상태로 되돌아가게 된다. 여기까지 왔다면 이 상태에서 오타를 수정하고 다시 커밋을 하면 된다. 그럼 커밋하나로 깔끔하게 완료할 수 있다.
참고로 reset은 기본값이 mixed이기 때문에 staged상태로 되돌아가는 것이다.
git rebase -i [커밋 ID]
커밋 ID는 두 종류로 입력할 수 있다.
- 수정하고자 하는 커밋 직전의 커밋 ID
- HEAD를 이용한 커밋 위치
해당 명령어를 사용하면 현재 커밋부터 지정한 '커밋 ID'의 앞의 커밋까지의 커밋들이 CLI창에 나타나게 된다.
현재 커밋내역이다. 여기서 세 번째 커밋의 ID인 58b3dad를 사용해보자
# 커밋 ID를 이용하는 방법
git rebase -i 58b3dad
# HEAD를 이용하는 방법
git rebase -i HEAD~2
둘 중 하나의 명령어를 사용하면 아래와 같은 화면이 나타난다.
커밋 내역 왼쪽에 pick이라고 되어있는데 이것을 수정해서 커밋을 합칠 수 있다. rebase에서 사용할 수 있는 커맨드는 사진의 아래부분에 나와있다. 이것외에도 더 많은 커맨드들이 있지만 여기서는 수정에 관한 커맨드인 squash만 살펴보자
커맨드를 적용시키고 싶으면 커밋 내역 앞에있는 pick을 원하는 커맨드로 수정하면 된다. squash로 풀네임으로 적어도 되고 s라고 축약형으로 적어도 된다. 이때 반드시 내가 합치고 싶은 커밋앞에 다른 커밋이 있어야 한다. 예를들어 지금 2개의 커밋중에서 '네 번째 커밋'이 먼저 작성되고 '다섯 번째 커밋'이 나중에 작성되었다. 그렇기에 '다섯 번째 커밋'을 수정할 수 있는 것이다. 만약 '네 번째 커밋'에 s를 입력하면 원하는대로 동작하지 않는다.
커맨드를 변경한 후 저장하고 빠져나가는 :wq를 입력해주면
이런 화면이 나타난다. #이 붙어있는 내용은 모두 주석으로 커밋후에 사라지게 된다. 현재 '네 번째 커밋'과 '다섯 번째 커밋'에 #이 붙어있지 않기 때문에 이대로 저장하고 종료하면 두 커밋 내용이 모두 저장된다. 필요없는 내용은 삭제하거나 내용앞에 #을 붙여서 주석으로 만들어주자. 그리로 나머지 커밋 내용을 내가 저장하고 싶은 내용으로 수정하면 된다.
모든 내용을 완료했으면 :wq를 이용해서 저장하고 빠져나가면 커밋 내용이 합쳐진채로 저장된다.
주의 사항
혼자서 github없이, 새로운 브랜치 없이 작업하는 거라면 전혀 문제될 것이 없다. 하지만 현업에서는 github도 연결하고 브랜치도 여러개를 만들어서 작업하게 된다. 이 경우에 나타날 수 있는 상황들이 여러가지가 있다.
- 로컬과 remote가 같은 위치에 있을 때 커밋 내용을 수정하면 remote에 push할 때 --force를 사용해야 한다.
- 다른 브랜치에 merge된 내용을 수정하면 다시 merge할 때 conflict가 발생한다.
이 두 문제 모두 커밋의 ID가 달라지기 때문에 나타나는 문제이다. 커밋 내용을 수정하면 기존 커밋에서 내용만 바뀐다고 생각할 수 있지만 사실 기존의 커밋을 없애고 새로운 커밋이 만들어지는 과정이 이루어진다. 그렇기 때문에 커밋 ID가 달라져서 remote에서는 기존의 커밋을 못찾아서 로컬과 다른 커밋 내용을 가지게 되고 이미 merge된 브랜치에서도 다른 커밋이라고 인식해서 conflict가 나게 되는 것이다.
만약 다른사람과 함께 사용하고 있는 브랜치를 수정한다면 커밋내역이 이상하게 변할 수 있기 때문에 협업할 때는 주의해서 작업해야 할 것이다. 이러한 문제들을 잘 고려하고 작업한다면 충분히 매력적인 git을 사용할 수 있다.
'Git' 카테고리의 다른 글
git 반복되는 컨플릭트 해결하기 (0) | 2022.10.27 |
---|---|
git 공부하기(4)_깃허브 연결하기 (0) | 2022.09.05 |
git 공부하기(3)_브랜치 사용하기 (0) | 2022.09.02 |
git 공부하기(2)_기본 사용방법 (0) | 2022.09.02 |
git 공부하기(1)_설치 및 설정 (0) | 2022.09.02 |
댓글
이 글 공유하기
다른 글
-
git 반복되는 컨플릭트 해결하기
git 반복되는 컨플릭트 해결하기
2022.10.27 -
git 공부하기(4)_깃허브 연결하기
git 공부하기(4)_깃허브 연결하기
2022.09.05 -
git 공부하기(3)_브랜치 사용하기
git 공부하기(3)_브랜치 사용하기
2022.09.02 -
git 공부하기(2)_기본 사용방법
git 공부하기(2)_기본 사용방법
2022.09.02