본문 바로가기

Git&GitHub

커밋 관리하기(커밋 컨벤션, hunk, stash, 과거 커밋 수정,삭제,병합,분할)

커밋 컨벤션

커밋을 할때 한 단위의 작업은 커밋(버전) 하나에 담기는 것이 좋습니다. 만약 서로 관련이 없는 두 작업이 하나의 커밋에 담겨있고, 이 둘 중 하나만 취소해야 하는 일이 생긴다면 이를 해결하기 쉽지 않겠죠??

 

type: subject

body (optional)
...
...
...

footer (optional)

위 형식은 일반적인 커밋 컨벤션을 보여줍니다. 예시와 함께 조금더 상세히 알아보겠습니다

feat: 압축파일 미리보기 기능 추가

사용자의 편의를 위해 압축을 풀기 전에
다음과 같이 압축파일 미리보기를 할 수 있도록 함
 - 마우스 오른쪽 클릭
 - 윈도우 탐색기 또는 맥 파인더의 미리보기 창

Closes #125

각 커밋 메세지에는 우선 해당 작업이 대략 어느 부류에 속하는지 바로 알 수 있도록 앞에 type을 지정해 줍니다. 이때 일반적으로 타입을 지정하는 형식은 다음과 같습니다

 

위의 형식에 맞게 타입과 서브젝트를 작성한 후 다음에 한줄을 비워 바디를 작성하고, 또 한줄을 비운후 footer를 작성하게 됩니다. 여기서 footer는 보통 특정 이슈에 대한 해결 커밋인 경우, 해결한 이슈의 번호를 적을때 사용됩니다.


세심하게 스테이징 하고 커밋(hunk)

Git에서 hunk파일에서 수정된 섹션이나 조각을 가리킵니다. 이를 통해 Git은 파일에서의 변경사항을 더욱 세부적으로 관리할 수 있게 도와줍니다. 즉 hunk의 존재는 Git이 우리가 일하는 방식을 보다 세분화하여, 보다 정밀한 버전 관리를 가능케 합니다.

 

위와 같이 현재 두개의 파일에 hunk test라는 부분을 추가한 상황이 있다고 가정해보겠습니다. git diff 명령어를 실행하면 Git은 수정된 파일을 분석하여 각각의 hunk를 찾아냅니다.

 

이때 두 파일 각각에 대한 수정사항을, 각각의 hunk 형식으로 보여주는것을 확인할 수 있습니다.

만약 hunk 단위로 각각 스테이징하고 싶다면 

 

git add -p

위 명령어를 사용하면 됩니다.

 

git add -p를 입력시 각각에 hunk에 대해 해당 부분을 스테이징 할 것인지 물어봅니다. 

만약 한 파일 내에 있는 작업 내용들을 hunk를 기준으로 어떤것은 스테이징 한 반면, 어떠한 내용은 스테이징 하지 않는다면 위와 같은 상황을 보실 수 있습니다.(Lions.yaml이 양쪽 다 위치)


커밋하기 애매한 변화(stash)

만약 한참 어떠한 작업을 수행중에, 동료분이 급하게 오류를 수정해 달라하거나, 다른 새로운 기능을 추가해달라고 한다면 기존의 커밋 내용을 어떻게 해야 할지 난감한 상황이 오게 됩니다.

 

이럴때 유용하게 사용할 수 있는 것이 바로 Stash 입니다.

 

예를들어 Lions.yaml이라는 파일에 어떠한 작업을 하던 중간에 다른 작업 요청을 받았다고 가정해보겠습니다.

 

이때 이러한 변경 사항을 stash영역에 보내기 위해 아래 명령어를 작성합니다.

git status save를 통해 현재 변경사항들을 status 영역으로 보냈습니다. 이후 요청하신 작업을 마친후 아까 하던 작업을 다시 불러내기 위해

git stash pop을 하게 되면 해당 내용을 다시 불러올 수 있습니다 :)

 


과거 커밋들 수정, 삭제, 병합, 분할

위 커밋들 중 수정하고자 하는 것은 다음과 같습니다.

  1. 흇훙 이라는 커밋의 메세지 변경, 뻘짓 이라는 커밋 제거
  2. 추가중, 추가 완료를 하나로 합치기
  3. 캐릭터 추가, 시작메뉴 디자인 변경을 두개의 커밋으로 나누기

이때 위에 3가지 작업을 하기 위해서 rebase를 사용하게 됩니다.

git rebase -i (수정 하려는 대상의 바로 이전 커밋의 해시코드)

각 커밋에 대한 작업 옵션은 다음과 같습니다.

 

1번 작업을 하기 위해 git rebase -i 에 주인공 필살기 궁둥의권 추가(흇훙 이전 커밋)에 해시 코드를 입력해보겠습니다.

입력시 위와 같은 창이 뜨고 pick 1c799ad 흇훙을 보실 수 있으실 겁니다.

여기서 pick부분을 r(또는 reward)로 바꾸면, 커밋 메세지를 수정하는 칸이 나오는데 거기서 해당 메세지를 변경하시면 됩니다. 저는 bug fix로 커밋메세지를 수정하였습니다.

 

2번작업(뻘짓 커밋 지우기)을 위해 앞서 변경하였던 bug fix 해시코드를 통해 rebase -i를 해보겠습니다.

 

이때 뻘짓 앞에 pick이 아닌 d를 입력하게 되면 해당 커밋은 지워지게 됩니다.

 

 

마지막으로 3번 작업(귤맨 추가와 시작메뉴 디자인 변경을 각각의 커밋으로 분리)을 하기 위해 우선 rebase -i 결전의 찜질방 맵 추가의 해시코드를 입력합니다.

 

이후 분리하고자 하는 커밋앞에 e를 하고 wq를 하게 되면 캐릭터 귤맨 추가, 시작 메뉴 디자인 변경이라는 내용을 딱 커밋한 그 시점으로 돌아갑니다. 이때 이 커밋이 커밋 되기 이전 상황으로 돌리기 위해 git reset을 사용합니다.

 

// 밑에서 mixed 라는 디폴트 옵션 사용시 캐릭터 귤맨 추가, 시작 메뉴 디자인 변경 내용이 워킹 디렉토리에 저장됨
git reset HEAD ^ -> 디폴트값이 mixed

// 이후 각각을 따로 커밋 하면 됨
git add file-3.txt
git commit -m  '캐릭터 귤맨 추가'

git add file-4.txt
git commit -m '시작 메뉴디자인 변경'

// 해당 코드로 마무리
git rebase --continue