본문 바로가기

IT/이론

[Git] 오픈소스 컨트리뷰트 중 Pull Request를 올리기 위해 깃 커밋 로그 깔끔하게 하기

반응형

길게 설명할 필요가 없는 간단한 방법이다.

 

오픈소스 컨트리뷰트를 막 시작하면 대체로 깃 커밋 로그가 뒤죽박죽이라던가...Upstream(Fork해온 레포지토리의 원본 레포지토리)의 master와 맞지 않아서 머지가 안된다던가...하여간 여러 문제점에 봉착하게 되는데,

 

이 모든 것을 해결해주는 두 가지 마법의 Git 명령어가 있다.

 

1. git rebase -i HEAD~n

간단하게 설명하자면 이 명령어는 하나의 PR(Pull Request)에 여러 커밋이 들어있는데,그 중에서 몇 개는 빼야하거나 커밋을 하나로 합쳐야 하는 등의 애로사항이 펼쳐졌을 때 사용하게 되는 마법의 명령어다.

 

# Terminal

$ git rebase -i HEAD~5

위와 같이 명령어를 치면 대화형 스크립트 창이 뜨며 최신 5개의 커밋 로그가 뜬다.

그리고 pick, drop, squash... 등의 여러 명령어가 있는데, 그 중 가장 자주 쓰는 것만 정리해보겠다.

  • pick: 그냥 커밋을 내버려둔다. 기본값이다.
  • drop: 해당 커밋을 drop해버린다. 없던 커밋 취급한다. 아예 커밋 로그도 지워버리고 변경점도 무효화시킨다.
  • reword: 커밋을 그대로 쓰되, 커밋 메시지 내용만 고친다. (그렇게 자주 쓰지는 않고 커밋 메시지에 오타가 생겼을 때 닫은 경우에만 사용)
  • squash: 커밋에서 일어난 변경점은 적용하되, 해당 커밋 로그를 바로 전 커밋 로그랑 합쳐버린다. 커밋 메시지 또한 바로 전 커밋 로그와 합쳐버린다.
  • fixup: 커밋에서 일어난 변경점은 적용하되, 해당 커밋 로그를 바로 전 커밋 로그랑 합쳐버린다. 커밋 메시지는 무효화된다.

2. git reset --hard upstream/master

사실 이 명령어가 진정한 magic word가 아닌가 싶을 정도로 자주 쓴다.

물론 별 건 아니고 현재 나의 HEAD를 Forked Repository의 원본 레포지토리(즉, upstream)의 master와 맞춰주는 것 뿐인데, 이거 하나만으로도 깃 커밋 메시지가 더럽게 꼬여있던 것이, 혹은 그로 인해 뭔가 컴파일이 안되거나 문제가 발생하던 것이 모두 해결된다.

# Terminal

$ git fetch upstream
$ git reset --hard upstream/master

주의할 점으로는, `reset --hard`는 아예 upstream에서의 변경점을 로컬 저장소(당신의 PC)에 덮어씌워버리기 때문에, 혹시 새로운 수정을 가하던 게 있다면 반드시 소스 백업을 해두자.

아니면 이전 포스팅에서 했던 복잡한 브랜치 작업을 하던가...


 

반응형