Git: 실수를 되돌리는 5가지 방법

작가 허락을 받고 번역한 글입니다.(원문)

개발자 업무 방식에 익숙한 사람이라면, Git이 어떻게 사용되는지 잘 알고 계실 겁니다. Git은 코딩을 하다가 만들어진 애매한 상황을 대부분 해결 해주는 좋은 도구입니다.

Git은 분산처리 되어 있기 때문에 모든 상황에서 되돌리기 기능을 제공하지는 않습니다. 하지만, 대부분의 상황에 적절한 해결방법을 가지고 있습니다. 가장 흔한 시나리오를 확인해봅시다.

 

Tip #1

험난한 시작: unstaged된 변경사항 버리기

파일을 변경하기로 결정했지만, 더 좋은 방법으로 바꿔야겠다고 생각 했을 때,

$ git checkout -- <filename>

파일이 unstaged상태이고 그 변경사항을 버리고 싶다면, 위 명령어를 사용하시면 됩니다.

파일의 현재 버전은 최근 staged 되어 있는 버전이거나, 커밋된 버전으로 바뀝니다. 그리고 버린 변경사항들은 저장되지 않습니다. 디렉토리에 있는 수정사항들을 버리고 싶을 때도 이 명령어를 사용할 수 있습니다.

$ git checkout -- <dirname>

 

Tip #2

개발의 울타리: 인덱스에서 staging 되지 않은 파일들

점심 전에 꽤 괜찮은 작업을 했거나 방금 작업한 것이 지금 하려고 하는일에 적절하지 않지만, 삭제 하기 싫다면

$ git reset <filename>

Index는 준비 영역으로 커밋에 어떤 변경사항을 허락할지 결정하는 공간입니다.

git add 명령어를 통해 변경사항을 이미 staged 했지만, 해당 파일을 커밋할 준비가 되어 있지 않다면, 위 명령어를 통해 unstage 시킬 수 있습니다.

이 명령어를 사용하면 변경사항은 unstage되지만, 실제로 삭제되지는 않습니다. 이 변경사항은 커밋이 될 때 까지 뒤로 미뤄지게 됩니다. 하지만 영구적 변경사항 삭제를 원한다면 아래 명령어를 쓰시면 됩니다.

$ git reset --hard <filename>

 

Tip #3

한 발자국 뒤로 물러나 봅시다: 커밋된 변경사항 되돌리기

잘못된 커밋을 찾으려고 했으나, 변경 이력에 파묻혀있다면..

$ git revert <commit>

좋은 소식은 git revert 명령어를 통해 쉽게 해결할 수 있다는 것입니다.
위 명령어는 새로 혹은 잘못 커밋된 최근 커밋을 되돌리는데 사용됩니다. 잘못된 커밋을 삭제하지 않고, 되돌리는 커밋을 새로 만들기 때문에 git 로그를 재작성하지 않아 안전한 사용이 가능합니다. 또한 로컬과 레포지토리 두 경우 모두 사용할 수 있습니다.
커밋 아이디를 찾기 위해서는 아래 명령어를 사용하면 됩니다.

$ git log --oneline

 

Tip #4

cherry-picking의 예술성: 다른 브랜치에 있는 커밋 적용해보기

잘못된 브랜치에 커밋을 했다면, 브랜치 전체를 병합하지 않고 제대로된 곳에 적용하고 싶을 겁니다.

$ git cherry-pick <commit>

Cherry-pick은 커밋 하나를 특정 브랜치에서 다른 브랜치로 적용할 수 있게 해줍니다. 실행을 위해서는 커밋하고 싶은 브랜치로 이동하고 위 명령어를 실행시키면 됩니다. 잘못 적용한 브랜치에서 해당 커밋 삭제하는 것을 잊어버리시면 안됩니다. 해당 커밋을 삭제는 아래 명령어를 사용하시면 됩니다.

$ git reset --hard HEAD{index}

💡 Git에 push나 pull하지 않고 코드를 공유하고 싶다면? GitLive를 통해 커밋하지 않은 변경사항을 cherry-pick하여 로컬에서 복사해서 직접 동료에게 보낼 수 있습니다. 이걸 읽어보시면 됩니다. ******

Tip #5

시간을 되돌릴 수 있다면 : 오래된 커밋의 메시지 변경하기

커밋 로그를 보는 동안 오래된 커밋 메시지에 오타가 있을 수 있습니다.

$ git rebase -i <sha>

위 명령어를 사용하면 쉘에서 메뉴를 바꿔가며 해당 커밋을 수정, 삭제, 병합할 수 있습니다. 경험 상, 저장소의 git 로그를 수정해선 절대 안됩니다. 하지만 로컬에서는 안전하게 할 수 있습니다.

연습을 위해 샘플 저장소를 만들어 rebase를 시도해보셔도 좋습니다. 실행을 하면 커밋 목록을 확인할 수 있을 겁니다.

$ git log --oneline

interactive rebase-1.png

다섯번째 커밋 메시지의 오타를 수정하기 위해서는 $ git rebase -i <sha>를 실행시키고, sha를 5번째 커밋의 해쉬 값으로 교체하면 됩니다.

interactive rebase-2.png

이 명령어를 치고 난 후에는 기본으로 지정된 에디터가 열립니다. 지시에 따라 실행시킬 동작을 선택하십시오.
커밋 메시지를 수정하기 위해서는 단어 pickr로 교체하고 저장 후 에디터를 닫으면 됩니다.
메시지는 지금 바로 변경하면 안됩니다. 에디터가 다시 열리고 메시지 수정을 유도할 겁니다. 이제 에디터를 끄고 쉘로 돌아오면 됩니다.

git log -oneline 명령어를 실행시키면 오타가 수정된 것을 볼 수 있습니다. 참 쉽죠?

interactive rebase-3.png

 

읽어 주셔서 감사합니다. 이 방법들을 통해 그 어떤 Git 문제도 여러분을 힘들게 하지 않길 바랍니다.
더 많은 Git 팁을 원한다면,
우리 Git 시리즈의 이전 포스팅을 확인하시면 됩니다: Top 5 Git Tips & Tricks and 5 Git Tips To Level Up Your Workflow.
Happy Git-ing!

Comments