실무에서 유용했던 git 명령어

이하은·2021년 5월 14일
4

default

목록 보기
2/7
post-thumbnail

git 명령어

git reflog

모든 git 명령어 수행한 기록이 남아있다. reset --hard 도 되돌릴 수 있다. 거의 만능 기능. git checkout [커밋넘버] 와 함께 사용하자.
망하기 직전 커밋으로 이동해서 백업 브런치파고 여차저차 복구한 다음에,
망한 브런치를 삭제하고 백업 브런치를 git branch -m [이전이름] [이후이름] 으로 망한 브런치 이름으로 리네이밍 하면 흔적도 없이 깨끗한 증거인멸을 할 수 있다.

참고 링크

git reset & revert

둘다 롤백할때 쓰이는 명령어다.

1. revert

특정 커밋을 지정하여 해당 커밋만 롤백 하며, revert 한 기록이 최상단에 커밋된다.
revert 를 한번에 여러개를 할 수도 있다.

1) git revert --no-commit [되돌리고 싶은 commit의 hash]
revert를 그냥 하면 revert 할때마다 커밋이 자동으로 생겨난다. 이때 --no-commit 옵션을 이용하면, revert를 위한 커밋을 하나만 생성할 수도 있다. 하지만 revert 명령어는 되돌리고 싶은 커밋 수만큼 일일히 쳐줘야 한다.

2) git revert --no-commit [되돌리고 싶은 커밋의 범위]
revert 명령어 한번으로 복수개의 커밋을 한번에 revert 하는 방법.
커밋의 hash 값이 아니라 범위를 입력하는거다.
예를 들면, git revert --no-commit--no-commit HEAD~3.. / 또는 master~3..master

2. reset

reset이 revert와 다른점은 특정 커밋의 '시점'으로 이동한 다는 것이다.
revert가 해당 커밋만 롤백한다면, reset은 해당 커밋은 멀쩡하고 그 이후의 커밋들이 모조리 롤백된다.

옵션 : --mixed(default) / --soft / --hard
mixed, soft 는 코드 수정한것은 남아있지만 커밋 기록을 삭제하는 것이고 hard 는 코드 수정과 커밋 기록까지 모조리 제거하는 것이다.

soft: commit 취소
mixed: add 취소 + commit 취소
hard: add 취소 + commit 취소 + 코드작성 취소

** 이미 원격 리파지토리에 push 를 한 상태라면 reset을 사용하면 reset 하기 이전으로 되돌리기 전까지는 push 할 수 없게된다. (물론 force라는 위험한 옵션이 있긴함) 그래서 이미 push 한 코드라면 미련을 버리고 revert를 해야한다.

참고 링크 1
참고 링크 2

git cherry-pick

망해버린 브런치에서 필요한 특정 커밋만 콕 찝어서 가져오고 싶을때 유용하다.

참고 링크

git stash

코드 작성 중 branch 왔다 갔다 할 일이 많을때 유용하다. checkout 하기 전 커밋 기록을 남기기 모호할 때 임시저장함 처럼 사용할 수 있다. git stash list, git stash save, git stash pop, git stash apply, git stash drop 들을 주로 쓴다.

stash 한 코드를 pop 하기 전에 코드 내용이 뭐였는지 미리 보고싶으면 아래와 같이 사용하면 된다.
git stash show -p stash@{0}

참고 링크

git checkout

git checkout [커밋해시]

특정 커밋의 시점으로 이동할 수 있다. 그 이후 브런치를 생성하면 특정 시점으로 이동한 온전한 브런치가 생긴다.
아래와 같이 옵션으로 특정한 파일만을 특정 시점으로도 되돌릴 수 있다.

$ git checkout [커밋해시] -- [파일경로] [또다른 파일경로 추가가능]
$ git checkout 73a23a1 -- scr/app.js

git checkout -

바로 직전의 branch로 checkout이 가능하다. brach 명을 일일히 다 적을 필요가 없어서 편하다.





알면 편한 추가 사용법

git log --grep [text]

[text] 에 지정한 문자가 커밋 로그에 포함되는 커밋만을 표시한다.

git log 를 시각적으로 보기

alias 에 저장해놓고 사용하면 유용하다. stash 기록까지 같이 보여준다.

git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all

커밋 메시지 수정하기

git commit --amend 를 사용하면 가장 최신의 커밋을 수정할 수 있다. 최신 말고 그 이전의 커밋메세지를 수정하려면 rebase 와 같이 사용해야 하는데 자세한 내용은 아래 링크 참고.

참고 링크

git 과거 특정 커밋의 코드 내용을 수정하기

  1. git rebase --interactive
  2. 수정하려는 특정 커밋 바로 직전 커밋해쉬로 git rebase --interactive [커밋해쉬] 진행
  3. vim 창에서 수정할 커밋의 pick를 edit으로 변경
  4. 원하는 코드 내용을 수정
  5. git add . && git commit --amend
  6. :!q 를 입력하여 커밋 vim 창에서 빠져나온 후 git rebase --continue

참고링크

굉장히 위험한 옵션 git push --force

git push --force [원격 저장소 명] [브런치 명]

--force 혹은 -f 로 사용한다.
로컬에 있는 커밋과 원격저장소에 있는 커밋이 다를때 강제로 로컬 커밋을 원격커밋에 적용하는 옵션이다.
로컬에 없고 원격에만 있었던 커밋들은 모두 날라간다. 다른 팀원들이랑 레포지토리를 공유하는 상황이면 아주 곤란해질 수 있다.
이미 원격에 올라간 커밋을 흔적도 없이 지우고 싶어서 reset --hard 한 후에 git push --force 옵션을 쓸 수도 있기는 하다. force 옵션을 쓰려면 아래 조건들을 체크하고 신중히 사용해야한다.

  • 나 혼자만 사용하는 브랜치에 커밋을 push하였고, 이를 깔끔히 되돌리고 싶은 경우
  • 팀원들과 직접 커뮤니케이션해서 내가 되돌린 커밋을 pull로 땡겨간 팀원이 없다고 확인된 경우

하지만 보통 원격에 올라간 커밋을 롤백을 하려는 경우는 흔적이 남기는 해도 안전한 revert 를 사용하는 것을 추천한다.

여기에 보다 더 자세한 설명이 적혀있다.

++) 추가 URl

유용하게 사용한 git 명령어를 계속 추가할 예정입니다.

git rebase 취소하기
특정파일 특정 상태로 되돌리기

profile
완벽함보단 꾸준함으로

0개의 댓글