🔥 문제
최근에 강의를 듣다가 커밋을 수정할 때가 와서, 마침 프로젝트 때 앞으로 적용할 스쿼시를 연습하려고 했다.
따라서 최근에 민철 님께 배운
git rebase ~i
를 통해 squash
를 성공적으로 해서 두 커밋 내역이 합쳐진 하나의 커밋이 나왔다.그러나 내가 실수로
pull
하라는 명령을 듣고 pull
후 push
를 해버렸더니, 다음과 같이 기존 합치려고 했던 애들들이 recursive merge
가 되어버리면서, 합쳐져버렸다.
아구야... 이게 아닌데... 내 맘은 이게 아닌데...😂
이런 상황에서, 나는
2e5e355
를 마지막 커밋으로 남겨주고 싶다. 어떻게 해야할까?📢 답변
만약 push
를 하지 않았는가? --abort
를 하자!
git merge --abort
는 merge
충돌이 났을 때, 이를 아예 취소시켜주는 역할을 해준다. 따라서 머지 충돌 이전으로 되돌릴 수 있는 유용한 친구라고 한다.하지만 나는 이미 원격 저장소에 merge
를 해버렸는 걸...?
따라서 위의 명령어는 소용이 없다.
그렇다면 어떻게 해야할까?
1. 내가 마지막으로 남기고 싶은 커밋 쪽으로 이동한다.
난 현재 베이스에서 한 단계 뒤로 쳐진 커밋을 마지막으로 남기고 싶었다.
따라서 다음을 입력한다.
git reset HEAD^
2. 강제 푸시해버린다.
이동 한 후에는
git push -f origin main
을 해준다.즉, 여기를 origin 의 main으로 강제로 해버릴 거야~를 의미한다.
이 이외의 방법을 찾으려 했지만 아직의 나로서는 역부족이었다. 왜냐하면
merge
라는 명령어가 꽤나 강력할 줄은 몰랐기 때문이다.만약 이것이 틀린 답이면, 깃린이에게 조언을 해주기를 바란다.
🖥 결과
아구야, 커밋 내역이 이쁘게 수술이 됐다!!
나중에 커밋을 합칠 때가 있을 때, 누군가가 다음과 같은 이슈가 발생한다면 꼭 요긴하게 쓰길 바란다! (무엇보다,
-f
옵션이니 3번은 고민하고 쓰자!)
🏃🏻♂️ 배운 점
- push -f가 정말 나쁜 건 아니다.
아직은 너무나 서툴러
-f
라는 명령어가 무섭기 그지 없다. 하지만, 언젠가 내가 실수를 만들었을 때, 머지한 브랜치 내역이 정말 꼭 필요한 게 아니라면, 한 번쯤은 고려해야 할 옵션이라고 생각하게 되었다. merge
, 3번은 고민하고 적용하자.
revert
reset
등 모든 방법을 총 동원했음에도 불구하고, 머지된 커밋은 쉽사리 없앨 수 없었다. 따라서 항상 머지만큼은 주의해서 적용해야겠다고 생각하게 되었다.