[Git] 잘못한 커밋 취소하기

이열음·2022년 1월 31일
0
post-custom-banner

🌟Git 커밋 취소하기

너무 살떨리는 경험이였어서 기록합니다..ㅎ
컴퓨터가 실수에서 배우는게 많지만 이럴때마다 심장철렁하는건 어쩔수가 없네요

발단을 간단하게 얘기하자면 포크떠놓은 레포를 본 레포와 동기화시키려고 병합을 했는데 나중에 알아보니 이는 포크 레포를 본 레포에 반영 시키는 것 였더라고요.

완전 반대로 생각했었습니다.. 으휴
아무튼 제 목표는 머지했던 코드를 이전으로 되돌리는 것 이었습니다.

❗들어가기에 앞서 주의사항!.
저는 모든 작업 내용을 원격에 푸시한 뒤, 머지만 하고 이후에 다른 작업은 하지 않았습니다. 다음에 나올 '머지직전 커밋으로 시점을 되돌린다' 는 '머지 전 상태가 가장 마지막 상태이다' 를 가정하고 진행하는 것이며, 만일 머지 후 무언가를 작업하셨다면 어딘가에 백업해두시길 바랍니다(커밋시점을 되돌리면 그 내용들은 날아가니까요.)

🎯 머지직전 커밋으로 시점되돌리기

git reset --hard HEAD~커밋하는게 상위로부터 몇번째인지

해당 명령어를 통해 동기화하기 직전, 즉 내가 남기고 싶은 코드들로 상태를 바꿔줍니다.
이상태에서 git push origin master하게되면 로컬이 원격보다 뒤에있는데 푸시한다고 에러가나게 됩니다.
일반적으로는 로컬에서 수정한 내용을 원격에 반영 하는 순이였지만
지금상태는 원격에 반영은 됐지만 로컬은 반영 전 시점인데? 라서 생기는 에러인데
당최 뭔말이냐 싶으신 분들을 위해 비유적으로 표현해볼까 합니다.
지금 창의력이 빛나는 시간대가 아니라 예시가 구리지만 로컬이 잡지사고 원격이 구독자라고 해봅시다.
정상적인 순서를 비유해보자면 다음과 같습니다.

잡지사가 구독자에게 잡지를 보내줍니다. 구독자는 그 잡지를 읽고 정보를 머리속에 넣습니다.

근데 지금나는 에러를 이 예시로 표현해본다면 다음과 같아집니다.

잡지사는 구독자를 위한 잡지를 아직 보내지 않았는데,
구독자는 이미 그 잡지에 대한 정보가 머릿속에 있습니다.

이상하죠? 지금 깃이 보기에는 이렇게 이상한 상황인겁니다.
그럼 이걸 어떻게 해결할까요?

🎯 되돌린 사실을 커밋으로 남기기

구독자 머릿속에서 정보를 지우는 대신 잘못된 정보가 있었다고 알려주는 방법입니다.

git revert --no-commit HEAD~되돌리고싶은 커밋 시작..되돌리고싶은 커밋 끝
git commit -m "revert commit 어쩌구"
git push origin 브랜치명

이렇게 해주면 이전작업들의 이력은 남아있지만 원격저장소에서는 사라지며
되돌리고싶은 커밋의 시점으로 이동되어있습니다.
또한 이때 어떤 커밋시점으로 되돌아갔는지를 커밋으로 남겨둘 수 있습니다.
예시로 라버트를 진행하면

1-2-3-4 의 커밋이 있다면
1 = 나 4로 되돌아갈거임! 4까지의 코드는 없는걸로 치자!
2 = 코드에서는 삭제(뭐했는지는 남아있음)
3 = 코드에서는 삭제(뭐했는지는 남아있음)
4 = 코드는 이상태로 돌아와있음.

이런식으로 남게됩니다.

🎯 로컬저장소의 커밋을 원격으로 덮어씌우기

외쳐볼까요 오블리비아테..^-^

구독자한테 마법을 걸어서 정보를 지우고 아무일 없다는 듯이 잡지를 건네는 방법입니다.

git push -f origin master

이렇게 원격저장소의 기억을 지우고 로컬이 새거인것마냥 강제로 push를 하게되면
부끄러운 과오를 남기지 않을 수 있습니다. 대신 협업중인데 다른팀원이 그새 풀해가서 작업하고 있었고, 이 작업이 끝난 뒤 푸시하면? 과오도 다시 업로드된다는 단점이 있습니다.

🎯 결론

이런걸 방지하기 위해서는 앞서말한 revert가 더 나을 것 같군요.
실제로도 revert가 더 자주 사용되는 방법이고, 덮어씌우기는 단독으로 프로젝트를 할때처럼 커밋을 어떻게 구워삶아도 별 타격이 없을때 쓰시는게 좋을 듯 합니다!
뭐 이러나 저러나 실수로 인해 하게되는 고생(?)이니 다음부턴 웬만하면 이렇게 되돌리지말고 처음부터 제대로 하는걸로...잘하자...

post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 7월 8일

글 잘 봤습니다! 저는 협업하다가 다른 사람이 커밋해 놓은것에 강제 푸시를 해버려서 이전 레포지토리가 다 사라지고 제 커밋만 남았는데 이 상황도 같은 상황인건가요?

답글 달기