커밋 메시지, hunk 별로 스테이징, stash, 커밋 수정

도토리·2023년 4월 7일
0

git & github

목록 보기
8/10

커밋 메시지 작성 방법

  • 어떤 작업이 이뤄졌는지 누가 보더라도 알 수 있어야 한다(미래의 나도 이 커밋에서 무엇을 했는지 알 수 있어야겠지^^).
  • 한 단위의 작업은 하나의 커밋에 담긴다. 한 단위의 작업을 두 커밋에 담거나, 서로 관련 없는 두 작업을 하나의 커밋에 담으면 안 된다.
  • 커밋 메시지 작성 예시) 물개 악당 체력 감소시키기, 캐릭터 필살기 추가, 결전의 찜질방 맵 추가, 캐릭터 귤맨 추가, 시작 메뉴 디자인 변경

커밋 메시지 컨벤션(convention)



일반적으로는 type, subject만 적는다.


hunk 별로 스테이징하기

git add -p
git commit -v


2개의 파일을 수정하였다.

  • tigers.yaml의 manager를 'Thanos', coach를 'Ronan'으로 변경, members에 'Gamora', 'Nebula' 추가
  • leopards.yaml의 manager를 'Peter', coach를 'Rocket'으로 변경, members에 'Drax', 'Groot' 추가

이러한 변화들을 한 번에 커밋하고 싶지 않다. git commit -am '커밋 메시지' (x)
hunk 별로 하나씩 add하고 싶다.

git add -p (p는 patch의 약자)


파일을 수정한 부분을 헝크(hunk) 라고 부른다.
예를 들어, leopards.yaml의 3~5를 hunk1, 14-15를 hunk2라고 하는데, hunk가 이러한 이유는, 바뀐 부분(3~5, 14-15) 사이에 바뀌지 않은 부분이 존재하기 때문.

'Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?'

  • ? 입력: y ~ ?의 의미를 알려준다.
  • y 입력: 해당 hunk를 add한다(해당 hunk를 staging area에 넣는다)
  • n 입력: 해당 hunk를 add하지 않는다.
  • 하나의 파일 내에서 부분 별로 add를 할 수 있는 것이다!



'git status'를 입력해보자.


leopards.yaml, tigers.yaml이 '스테이지에 올라간 파일', '스테이지에 올라가지 않은 파일'에 모두 존재함을 볼 수 있다.


git commit -v

무엇을 커밋할 것인지를 보여준다. 'git diff --staged' + 'git commit'이라고 보면 됨

참고) add 이후 이번 커밋에 담길 변화가 무엇인지 확인할 때

git diff --staged

작업하던 것을 다른 곳으로 치워두기 - stash

[작업 치워두기]
git stash
(git stash -m '메시지')
(git stash -p)


[치워둔 작업 가져오기]
git stash pop


  • 등장 배경: 커밋은 한 작업이 완전히 끝난 후에 해야지, 작업 중에 커밋하면 안 된다. 그런데, 작업 도중 오류 수정이나 다른 일을 처리해달라고 하는 경우, 기존에 작업하던 것을 커밋할 수도 없고 어떻게 해야 할까?
  • 기존에 작업 중이던 것을 잠시 다른 공간에 치워두는
  • stash를 하기 위해서는 tracking 상태여야 함
    (git status했을 때, untracked files가 없는 상태)



1. tigers.yaml의 members에 'Stash' 추가, tomcats.yaml 파일 생성하였다.
(그리고 git add tomcats.yaml. stash를 하기 위해서는 tracking 상태여야 하니까)

git stash




무엇에 대한 stash인지 알 수 있도록, 메시지와 함께 stash하기

git stash -m '메시지'

2. 다른 일을 처리하고 난 후, 같은 브랜치 또는 다른 브랜치의 커밋 위에 다시 적용하기

git stash pop




3. 원하는 것만 stash하기
상황: leopards.yaml의 members에 'Stash2' 추가, jaguars.yaml의 members에 'Stash3' 추가하였다. 그리고 전자를 먼저 stash -> 후자를 그 다음에 stash하고 싶다.

ⅰ.

git stash -p

'Stash this hunk [y,n,q,a,d,e,?]?'

  • y 입력: 해당 hunk를 stash한다.
  • n 입력: 해당 hunk를 stash하지 않는다.

ⅱ.

n
y
git stash -m 'Stash3'



ⅲ. stash 목록보기

git stash list



ⅳ. stash 번호를 가지고, stash 다시 적용하기

git stash pop stash@{1}

또는

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

stash를 내 프로젝트에 적용 -> stash list에서 stash 삭제
apply, drop을 한 번에 하려면 pop

참고1) apply, drop, pop은 끝에 번호(EX. stash@{1})가 없으면, 치워둔 마지막 항목을 대상으로 한다.

참고2) pop을 하는데, 새로운 branch에 pop하기

git stash branch stash-branch
  • stash-branch라는 branch를 만들고 여기에 pop하기
  • 이유: main branch에 다른 작업을 하고 난 후 pop하면, 충돌이 발생할 수 있다. 다른 branch에 pop하고 충돌 해결한 후에, main으로 merge하는 것이다.

GUI(소스트리)로 stash 다루기

  • 현재 작업 치워두기

    메시지 입력 가능(git stash -m '메시지')



  • 치워둔 작업 적용하기


    '적용 후 삭제' 버튼을 선택하면, pop(apply+drop)하는 것


마지막 커밋 수정하기

1. 커밋 메시지 수정하기

git commit --amend

또는 

git commit --amend -m '커밋 메시지'



커밋 메시지를 '횻홍' -> 'Add a member to Panthers'로 수정하였다.

2. 커밋 수정하기

EX) pumas.yaml의 members에 'Poki' 추가하는 것을 까먹었다.

git add .
git commit --amend

또는 

git commit -a --amend

또는 

git commit -a --amend -m '커밋 메시지'


이전 커밋 수정하기

다음과 같은 커밋 히스토리가 있다.

수정 사항은 다음과 같다.

  • '횻홍' 커밋: 커밋 메시지 수정
  • '뻘짓' 커밋: 커밋 삭제
  • '결전의 찜질방 맵 추가중' 커밋, '결전의 찜질방 맵 추가 완료' 커밋 합치기
  • '캐릭터 귤맨 추가, 시작메뉴 디자인 변경' 커밋을 두 커밋으로 나누기

수정1. 커밋 메시지 변경

git rebase -i (수정하려고 하는 커밋 이전 커밋의 해시)
git rebase -i (25b1bb1c318d12456c48174d2eedea6fd0e7ee6b)
참고) '주인공 필살기 궁둥의 권 추가' 커밋의 해시임

  • pick -> reword

  • 커밋 메시지를 '버그 수정'으로 변경


수정2. 커밋 삭제

pick -> drop


수정3. 커밋 합치기

pick -> squash



커밋 메시지를 위와 같이 수정한다.
(기존에는 커밋이 2개니까 커밋 메시지가 2개였음)


수정4. 2개의 작업이 존재하는 하나의 커밋을, 두 커밋으로 나누기

pick -> edit
해당 커밋으로 돌아가서, 커밋을 직접 수정하겠다는 뜻

ⅰ. file-3.txt, file-4.txt 파일은 존재하지만 add하기 전 상태로 돌아간다.

git reset --mixed HEAD^

ⅱ. file-3.txt, file-4.txt 각각에 대해 커밋한다.

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

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

git rebase --continue

0개의 댓글