일할 때 유용했던 git 잡기술 정리
1. tag
tag 생성
git tag -l # tag list 보기
git tag v1.2.0 # tag 생성
git push origin v1.2.0 # 생성한 tag pushtag 덮어쓰기
git tag -f v1
git push origin v1prune
fetch prune-tags는 remote에서 제거된 tag를 local에서 자동으로 제거해준다.
git fetch --prune-tagslocal에만 있던 tag도 remote에 없으면 제거될 수 있으니 주의.
2. rebase
git rebase -i 뒤에 뭐가 오는건지 항상 헷갈렸는데, 어떤 상태를 base로 할 건지를 적으면 된다.
git rebase -i origin/main
git rebase -i HEAD~3origin/main이라면 로컬에 저장된 remote-tracking ref인 origin/main을 base로 하고 그 이후 커밋을 interactive rebase한다는 뜻이고,
HEAD~3이라면 현재 HEAD의 3번째 조상 커밋을 base로 하고 그 이후 커밋 3개를 rebase하겠다는 뜻이다. HEAD가 0번째, HEAD~1이 1번째 이전 커밋이라고 생각하면 된다.
fixup
n번째 이전 커밋에 현재 변경 내역을 집어넣고 force-push하고 싶을 때 유용하다.
git add .
git commit --fixup HEAD~3--fixup 옵션으로 커밋하면 HEAD~3 번째 커밋 메시지에 fixup!이 붙은 형태로 commit된다. (ex. fixup! commands 제거)
git rebase -i HEAD~5위처럼 HEAD~5까지 불러와서 rebase를 해도 된다.
(HEAD~3에 fixup commit을 만들었다면, rebase할 때는 fixup commit이 HEAD~0이 되고 기존 commit이 HEAD~4가 될테니까 HEAD~5를 base로 해야 원하는 작업이 될듯..?)
pick a8f4c2e commands 제거
pick 9b1d6a3 test-actions@v1 actions 사용
pick c7e0f5b fixup! commands 제거위처럼 나온 걸 아래처럼 fixup으로 바꾸고 :wq하면 rebase 완료
pick a8f4c2e commands 제거
fixup c7e0f5b fixup! commands 제거
pick 9b1d6a3 test-actions@v1 actions 사용하지만 더 간단하게 하는 방법은, commit --fixup으로 생긴 커밋은 git이 자동으로 감지한다.
git rebase -i --autosquash HEAD~5autosquash 옵션은 fixup 커밋을 자동으로 찾아서 대상 커밋 아래로 옮기고 fixup으로 바꿔준다.
reword
commit message만 바꾸고 싶을 때 사용한다.
위와 마찬가지로 git rebase -i를 사용하고 pick를 reword (줄여서 r도 가능)로 넣어주면 다음 화면에서 commit message 수정 가능하다.
3. remote
branch 작업 완료 후 origin/main에 merge한 후에 다시 똑같은 브랜치에서 작업하고 싶을 때.
# 1. remote 끊어주기
git branch --unset-upstream
# 2. fetch
git fetch --all --prune
# 3. reset
git reset --hard origin/main
reset --hard는 커밋한 적 없는 tracked 파일의 변경 사항을 복구하기 어려우므로 주의해야 한다.