728x90

git stash

(working directory에) 작업중인 사항이 있는데

긴급히 다른 브랜치의 코드를 가져와 확인해야 한다면,

stash를 이용!

 

미완성 코드를 commit 하지 않고

stash stack에 임시로 보관했다가

다른 작업을 충분히 수행한 후,

내 코드를 다시 가져와 작업을 이어갈 수 있다.

 

혹은 버그를 잡기위한 시도를 하던중

잘 안됐더라도 의미 있는 작업을 했을때

임시 보관을 위해 stash에 저장해둘수도 있다.

# stash에 작업중인 사항 보관하기 - 1
git stash

# stash에 작업중인 사항 보관하기 - 2
git stash push

# msg와 함꼐 stash
git stash -m "<메세지>"

# 작업내역을 유지한채 stash에도 추가 (stash에 현재 작업내용 카피 떠두는 개념)
git stash -m "<메시지>" --keep-index

# untracking 파일포함 보관하기
git stash -u

# stash 목록 보기
git stash list

# stash 이력별 수정내용 보기
git stash show <stashId> -p

# stash 목록에서 최신 stash 다시 가져오기 (stash는 유지됨)
git stash apply

# stash 목록에서 선택해 stash 다시 가져오기
git stash apply <stashId>

# stash 목록에서 최신 stash 다시 가져오기 (stash는 제거됨)
git stash pop

# stash 제거
git stash drop <stashId>

# stash 전체 삭제
git stash clear

# 최신 stash를 가져오면서 새 브랜치에 적용
git stash branch <브랜치명>

 

git restore

working directory에 있는 작업중인 사항을 초기화

# working directory내 전체 초기화
git restore .

# 새로 추가된 파일은 restore로 제거되지 않음, 이때 사용하는 force directory
git clean -fd

# working directory내 특정 파일 초기화
git restore <파일명>

# add되어 staging area에 있는 파일을 working directory로 다시 가져옴
git restore --staged <파일명>

# add되어 staging area에 있는 모든 파일을 working directory로 다시 가져옴
git restore --staged .

# commit history로 초기화
git restore --source=<해시코드> <초기화할파일>

 

git commit --amend

commit 메시지를 잘못 적은 경우,

commit한 파일을 수정해야되는 경우,

직전에 수정한 commit을 수정할 수 있다

# 직전 커밋 메시지 수정하기
git commit --amend -m "<메시지>"

# 커밋한 파일의 내용을 수정해야할때, 추가 커밋없이 파일 수정
커밋했던 파일 현재 working directory에서 수정
git commit --amend

 

git reset

특정한 커밋으로 모든것을 초기화(지움) 할수있다.

원하는 버전의 해시코드로 reset하면 그 사이의 커밋은 제거된다.

 

--mixed

커밋 히스토리를 삭제하면서 해당 내용을

working directory로 작업 내역이 옮겨짐

 

--soft

커밋 히스토리를 삭제하면서 해당 내용을

staging area로 작업 내역이 옮겨짐

 

--hard

커밋 히스토리를 삭제하면서 해당 내용도 완전히 삭제

# 현재 ~ 해당 해시코드 사이의 commit 제거 + 내용은 working directory로 이동 - 1
git reset <해시코드>

# 현재 ~ 해당 해시코드 사이의 commit 제거 + 내용은 working directory로 이동 - 2
git reset --mixed <해시코드>

# 현재 ~ 해당 해시코드 사이의 commit 제거 + 내용은 staging area로 이동
git reset --soft <해시코드>

# 현재 ~ 해당 해시코드 사이의 commit 제거 + 내용은 삭제
git reset --hard <해시코드>

**주의사항

현재 working directory에 수정사항이 있는 상태에서

reset을 진행했다면 (특히, --hard)

작업중이 사항을 전부 잃을 가능성이 매우 높다

 

reset을 하기전에 working directory에 있는 파일들은

가능한 commit/stash 해두도록 하자.

 

git reflog

이전에 HEAD가 가리키고 있던 내역들을 전부 확인할 수 있다.

(내가 여태까지 실행했던 명령과 HEAD가 가리켰던 포인터들을 전부 확인 가능)

# 명령 이력 조회
git reflog

# 특정 해시코드로 돌아가기
git reset --hard <해시코드>

 

git revert

해당하는 커밋의 변경 사항을 완전히 취소할 수 있다.

명령후 revert 된 커밋이 새로 추가된다.

 

특히, 이미 서버 마스터 브랜치에 커밋인 경우

rebase, reset보다는 revert를 사용하는것이 맞다.

 

--no-commit을 쓸때, revert 커밋에서는 다른 파일을

수정, 삭제 등을 진행하는일은 절대로 없도록 한다.

# 특정 커밋 완전히 제거 + 취소사항 커밋
git revert <해시코드>

# 특정 커밋 완전히 제거 + 취소사항 staging area로 이동
git revert --no-commit <해시코드>

 

git rebase -i (interactive)

이전에 커밋된 사항을 수정할 수 있다.

이미 서버에 업로드된 사항은 다루지 말자.

 

오래된 순으로

5,4,3,2,1 이라는 커밋이 있을때

4라는 커밋을 수정하고 싶다면

4가 가리키는 이전 커밋인 5를 기준으로 해야한다.

 

rebase하게되면 기준 이후의 커밋들이

전부 수정되는 개념이기 때문이다.

(실제로, rebase 범주내 커밋들은 rebase후 해시코드가 변경됨)

# interactive rebase
git rebase -i <해시코드>

interactive 옵션

pick(p): 이거 써

reward(r): ok, 메시지는 변경

edit(e): ok, 변경사항 변경

squash(s): 여러가지 커밋 묶기 + 새 커밋 메시지

fixup(f): 여러가지 커밋 묶기

drop(d): 해당하는 커밋을 제거

 

 

git rebase & reset으로 커밋 분할

하나의 커밋에는 하나의 작업단위만 수행하는게 일반적이다.

예를들면, 버그수정 / 기능추가 / 라이브러리 추가 등.

그래야만 문제가 발생했을때 빠르게 revert해서 대응한다거나

문제의 커밋으로 되돌아가서 수정하는것이 수월하기 때문이다.

 

근데 나를 포함한 많은 개발자들이 실수하는게 여러개의

작업을 하나의 커밋에 추가하는 것이다.

 

실수를해야 사람이다.

실수로 여러 작업을 한 커밋을 다시 분할하는 방법에 대해 알아본다.

# A라는 비대한 커밋을 쪼개보자
# 1. A직전 커밋 해시코드 확인
git status

# 2. rebase interactive
git rebase -i <A직전 커밋 해시코드>

# 3. interactive - edit (커밋 수정하기 옵션)
pick -> e

# 4. reset으로 커밋을 working directory로 가져오기
git reset <가져올 해시코드>

# 5. 가져온 커밋에서 작업단위로 쪼개서 commit 하기
git add <특정 작업파일들>
git commit -m "<작업메시지>"
git add <특정 작업파일들>
git commit -m "<작업메시지>"

#6. continue
git rebase --continue

 

그런가 하면 commit들을 하나의 commit으로 묶는것도 가능하다.

# 1. 작업 범주 해시코드 확인
git status

# 2. rebase interactive
git rebase -i <squash할 범위 +1의 해시코드>

# 3. squash
squash(커밋 묶기)를 진행할때는 가장 최근 commit은 pick으로 유지한채
그외의 묶을 것들의 옵션을 s(squash)로 변경한다.

# 4. 커밋 메시지 작성하기
필요없는 내용은 지우고 커밋 메시지 작성

 

 

단, 혼자 작업하는게 아니라면

서버에 업로드된 작업에대해 절대로 rebase를 사용하지 말자

728x90
반응형

'개발, 코딩' 카테고리의 다른 글

순수함수 (pure function)  (0) 2022.11.06
객체지향 프로그래밍 핵심 개념  (0) 2022.10.27
git 기본기_백과사전 (1)  (0) 2022.10.24
git 협업하기 - 실무편  (0) 2022.10.23
Webpack 구성 이해하기  (0) 2022.10.04