본문 바로가기

개인개발

[소스관리, Git] 레벨3 - 코드를 잘못 커밋했을 때 되돌리려면

지난시간: http://stanleykou.tistory.com/entry/Git-레벨2-두-사람이-개발할-때-소스는-어떻게-저장하나요


원래는 브랜치에 대해 다루려고 했는데, 그건 다음 시간으로 미루고 간단한 팁 앤 트릭을 알아보겠습니다. 개발하다가 맞닥뜨리게 되는 몇 가지 상황과 해결법으로 꾸며보았습니다.



현재 git의 상태를 알고 싶을 때:

git status



현재 어떤 브랜치에 있는지, 어떤 파일이 수정되었는지, 어떤 파일이 add 되었는지 표시해 줍니다. 만약 로컬의 모든 내용이 git의 내용과 동일하다면, "nothing to commit, working tree clean" 이라고 




git 커밋의 목록을 보고 싶을 때:

git log



커밋한 내용의 목록이 출력됩니다.

또는, --oneline 이라고 옵션을 붙여주면 한 커밋을 한 줄로 (더 많은 목록을) 보여줍니다.




방금 커밋한 내용의 코멘트를 수정하고 싶을 때

git commit --amend


리눅스의 문서편집기인 vi를 이용하여 방금 커밋의 코멘트를 수정할 수 있습니다.



이런 화면이 나오면 당황하지 말고, 알파벳 "i"를 누르세요. 인서트 모드 (편집모드)로 변합니다.

그 다음 원하는 내용을 수정하면 됩니다.

# 으로 시작하는 내용은 주석이라 실제 커밋에는 표시되지 않으니, 무시하면 됩니다.



내용을 모두 수정했다면, ESC 키를 누른 뒤 ":wq"를 입력하고 엔터를 칩니다. 저장하고 종료하라는 의미입니다.


그 다음, git push --force 를 입력하여 방금 수정한 주석을 git에 강제커밋합니다.

(실제로는 이전의 커밋을 지우고 새로운 커밋을 생성하여 방금전 커밋과 바꿔치기하게 됩니다. 만약 동료가 이미 그 커밋을 받은 상태라면, 동료에서 fetch를 받아서 새로 sync하라고 알려줘야 합니다)



방금 커밋한 내용에 파일을 추가하고 싶을 때

git add .

git commit --amend

git push --force


방금전에 이용한 방법과 유사합니다. 

먼저 수정하고 싶은 파일을 git add . 명령을 이용하여 추가합니다.



그리고 git commit --amend를 입력하여 수정커밋합니다. (주석내용은 그대로 유지해도 됩니다. :wq 를 입력하면 끝!)



그냥 push 를 하면 아마도 git에서 거부하게 될겁니다. 다른 사람이 이미 push한 내용을 받았다면 그 사람 git이 살짝 꼬일 수도 있으니까요.


그래서 git push --force 로 강제커밋해 줍니다.



여러 커밋을 하나로 합치기

git rebase -i [브랜치명]~합칠 개수

예) git rebase -i develop~2


브랜치는 다음 시간에 다룰거지만, 일단 유용한거니까 알아두고 넘어가겠습니다.


놓친 수정사항이 굉장히 많아서, 한 이슈인데 여러 커밋을 올려버렸다고 가정 해 봅시다. 하나의 수정사항은 하나의 커밋으로 만드는 것이 개발하기도 쉽고, 관리하기도 쉽습니다. (고급기능을 이용하면 특정 커밋만 다른 브랜치로 이동시킨다든가 하는 작업이 가능하기 때문에, 되도록이면 한 이슈를 한 커밋으로 만들어야 합니다)


하지만 이미 여러 개로 나누어 커밋되어 버렸다면 어떻게 할까요? rebase를 이용하여 하나로 합칠 수 있습니다.


먼저 git rebase -i develop~2 를 입력하여 최근 develop에 추가된 2개의 브랜치를 합쳐보겠습니다.




vi 화면이 나옵니다. 당황하지 말고 찬찬히 내용을 읽어봅니다.

상단에 보면 두 줄의 코멘트가 보이는데, 그것이 합칠 커밋입니다.

내용을 살펴보면, 

pick: 이 커밋을 이용

51a64c8: 커밋 번호. 모든 커밋은 고유의 랜덤번호를 가집니다.

added Example: 이 커밋을 올릴 때 입력한 제목




위에 있는 것이 더 오래된 커밋입니다. 이것을 기준으로, 그 다음에 커밋되었던 것을 합쳐버리겠다는 의미로 두 번째 커밋의 커맨드를 "s" 로 변경합니다. "squash"로 변경해도 동일합니다.




저장을 위해 ESC, :wq를 입력합니다.



주석을 수정할 수 있는 화면이 나옵니다.





원하는대로 수정하고, 저장합니다.



이 상태에서 소스트리를 이용하여 git의 상태를 보겠습니다. 기존의 두 커밋이 아직 보이고 있고, 방금 "합친 커밋" 하나가 보입니다.




강제 커밋!



아름답게 하나로 합쳐졌습니다.


만약 다른 개발자가 이미 이 커밋을 받은 상태라면, 그 사람 git이 꼬여있을 수 있으니 소스트리를 이용해 fetch를 받도록 합니다. 


이렇게 커밋을 변경하더라도 해당 커밋이 완전히 사라지는 것은 아닙니다. 커밋의 고유번호만 알고 있다면 그 번호를 이용하여 변경/수정으로 인해 사라진 커밋을 다시 불러올 수 있습니다.