[Git] 커밋 관리하기(hunk, stash, 커밋 삭제 및 통합 및 분할)

WOOK JONG KIM·2022년 12월 22일
0

Git&GitHub

목록 보기
12/19
post-thumbnail

커밋 시 권장 사항

한 단위의 작업은 커밋(버전) 하나에 담기는것이 좋음

커밋 메세지를 작성하는 형식은 컨벤션

커밋 메세지 작성 방식

예시

type: subject

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

footer (optional)
feat: 압축파일 미리보기 기능 추가

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

Closes #125

각 커밋 메세지에는 해당 작업이 대략 어느 부류에 속하는 지 바로 알 수 있도록 앞에

이 중 하나를 추가함

타입과 서브젝트 작성 후 다음에 한줄을 비워 바디를 작성하고, 한 줄 비우고 footer 작성
-> 특정 이슈에 대한 해결 커밋일 때 해당 이슈의 번호를 적을 때 Footer에 작성

앞에 Gitmoji를 사용하기도 함(타입 처럼 활용됨)


세심하게 스테이징 하고 커밋

두개의 파일을 수정하였음

git에서 hunk는 파일에서 수정 된 섹션을 의미
-> git은 파일을 작은 조각으로 나누어 "hunk"라고 부름
-> 이렇게 하면 파일을 수정한 내용을 자세히 살펴볼 수 있게 됨

예를 들어, 파일을 수정한 후 git diff 명령어를 사용해 수정 내용을 볼 경우 git은 파일의 수정 사항을 hunk의 시리즈로 보여줌
-> 각 hunk는 파일에 추가된, 수정된 또는 삭제된 줄과 그 주변의 일부 컨텍스트 줄을 포함한 수정 사항을 보여줌

git add -p 명령어를 사용하면 hunk별로 수정 사항을 상태 저장(stage) 할 수 있다
-> 이는 큰 수정 사항을 작은, 집중된 커밋으로 나누고 싶을 때나 커밋하기 전에 수정 사항을 자세히 살펴보고 싶을 때 유용

이러한 형식으로 하나의 hunk를 보여줌

y, n을 통해 각 hunk들을 스테이징

특정 헝크는 staging 된 반면 특정 헝크는 스테이징 되지 않은 것을 볼 수 있다

변경 사항을 확인하고 커밋하기 위해

git commit -v

아까 n으로 스테이징 하지 않은 것을 따른 버전으로 커밋 가능


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

예를들어 항상 어떤 작업을 수행중에, 급하게 어떠한 오류를 수정해 달라거나 뭘 좀 처리해달라고 할 때 커밋도 못하고 난감
-> 이때 하던 것들을 잠시 깃의 따른 공간에 치워두는 기능이 stash

tigers 수정, 새로 만든 tomcats는 add

이후 git stash를 했을 때 수정 사항이 없어지고, 새로 만든 파일이 지워 짐

stash라는 공간에 작업 내용이 저장되어 있음

원하는 시점에 stash 적용하기 위해(다른 브랜치에서도 적용가능)

git stash pop

원하는 것만 stash 하기

우선 두 파일에 stash 멤버들 추가

git stash -p

이 명령어를 통해 Stash2 멤버가 추가된 내용만 stash로 설정(y/n)

Stash3 멤버가 추가된 내용은

메세지와 함께 Stash

git stash list를 통해 목록 확인

이 Stash들을 프로젝트에 다시 적용하기 하기
-> 커밋하는 것 X, 수정된 상태로만 돌려두는 것

git stash apply stash@{1}
git stash drop stash@{1}

이러한 반영 및 stash 삭제 작업을 동시에 하는 기능이 pop

git stash pop

사용법 정리

새로운 브랜치를 만들고 거기에 stash 내용을 pop 할려면

ex) git stash branch stash-branch


커밋 수정하기

커밋 메세지 수정하기

git commit --amend

커밋 변화 추가
-> 특정 커밋에 적용하지 못한 내용을 과거 커밋에 포함 시키기

메세지 변경 이후 적용하지 못한 내용들이 과거 커밋에 적용된것을 볼 수 있음


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

  1. 횻홍 커밋 메세지 변경, 뻘짓 커밋 제거(revert가 아닌 존재 자체 제거)

  2. 추가 중, 추가 완료 커밋 하나로 합치기

  3. 캐릭터 추가, 디자인 변경 커밋 2개로 나누기

수정을 위해

git rebase -i (수정 할려는 대상 바로 이전 커밋)

git rebase -i + 주인공 필살기 커밋 코드 (입력)

위 vim에서 pick ~ 흇훙을 r ~ 흇훙으로 체인지
-> 커밋 메세지를 수정하는 화면 나옴(bug fix로 체인지)

이후 뻘짓 커밋 지우기 위해 bug fix 로 rebase -i

스쿼시 화면에서 하나로 통합할 커밋 메세지 설정

이후 캐릭터 추가, 디자인 변경 작업이 커밋된 상태로 되돌아 가있음

git reset --mixed 명령은 Git 저장소의 상태를 이전 커밋 상태로 되돌림
-> 이 명령을 사용하면 커밋을 취소할 수 있지만, 워킹 디렉토리(working directory)에 있는 파일은 수정 사항을 유지

git reset HEAD^ -> mixed

git add file-3.txt
git commit -m  '캐릭터 귤맨 추가'

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

git rebase --continue

깃은 모든 커밋들이 순차적으로 저장
-> 그런데 만약 특정 커밋(ex: 성능개선)의 과거 커밋들이 변경된다면 특정 커밋 또한 다른 커밋이 되는 것
-> 따라서 커밋을 어느 시점에서 딱 자른 후, 그 위에 커밋들을 새로 다 작성한 후 rebase로 갖다 붙이는 느낌

profile
Journey for Backend Developer

1개의 댓글

comment-user-thumbnail
2024년 2월 5일

좋은 예제 감사합니다~

답글 달기