GIT WAY TO BACK, REBASE

git mv, git restore, git --amend, rebase git reset, git revert, git rebase

Posted by iheese on April 02, 2022 · 5 mins read

RENAME

  • mv [파일1] [파일2] : 파일1에서 파일2로 제목 변경
    • git에서는 파일1이 삭제되고 파일2가 생겼다고 판단, commit할 때 살짝 복잡해진다.
  • git mv [파일1] [파일2] : 파일1에서 파일2로 제목 변경, git에서도 rename 임을 알고 있게 된다.


RESTORE ,상태 복구하기

  • git restore [파일 이름] : 특정 파일 HEAD(최신 상태) 커밋으로 복구한다. (add 하기 전 수정했을 때)
  • git restore --staged [파일 이름] : 특정 파일을 Staging Area에서 다시 Unstaging 시킨다. (add 했을 때 add 하기 전으로 되돌리기 )
  • git reset HEAD [파일이름] : 위와 같은 Unstaging 하는 명령어이다.
  • git restore --source HEAD [파일 이름] : HEAD(최신 상태) 커밋 상태로 되돌린다.
  • git restore --source [commit hash] [파일 이름] : commit hash 의 특정 커밋으로 복구할 수 있다.
    • commit hash : git log 를 보면 커밋 기록을 볼 수 있는데 commit 뒤에 해쉬 7자리를 적으면 된다.


AMEND, REBASE, 커밋 내용 수정하기

  • git commit --amend : 바로 직전에 커밋했던 내용 수정한다.
  • 직전이 아닌 3번째 전에 썼던 커밋 수정하기
    1. git rebase -i HEAD~3 : 직전 3개의 해쉬값과 커밋이 뜬다.
    2. vim 창에서 수정할 3번째 부분 pick » edit 으로 바꾸기
    3. git commit --amend : 입력하고 커밋 내용 수정
    4. git rebase --continue : git rebase 커밋 변경 완료
      • git rebase --abort : 중간에 rebase 작업 중지


RESET, 커밋 내용 삭제하기(협업 때는 사용 조심)

  • git reset --hard HEAD~3(or commit hash) : 직전의 3번째 커밋까지 삭제, 어느 시점의 commit hash를 적으면 그 시점 이후의 커밋 내용은 모두 삭제된다.
  • git reset --mixed [commit hash] : commit hash 전 이력은 모두 사라지게 되지만 문서의 변경 내용은 unstaging 상태로 남아있게 된다.
  • git reset --soft [commit hash] : commit hash 전 이력은 모두 사라지게 되지만 문서의 변경 내용은 staging 상태로 남아있게 된다.

협업하는 경우 사용하지 말자

  • 파일들이 다른 복제본에서 살아올 수 있고 과거 이력이 사라져서 log 추적하는 것이 힘들어진다.(정말 필요한데 혼자 작업하는 경우 조심스럽게 사용하자)


REVERT, 커밋 기록 남기면서 삭제하기

  • git revert [commit hash] : 커밋해쉬에 해당하는 커밋의 내용이 삭제되며 commit log에 “Revert commit” 이 남게 된다.
  • git revert --no-commit [commit hash] : 커밋 해쉬에 해당하는 커밋의 내용이 staging 상태로 유지되게 된다. (add까지 마친 상태, 새로 커밋하면 된다.)
  • gir revert [commit hash1] [commit hash2] : 여러 개의 커밋 해쉬 내용이 삭제되고 “Revert 1번 commit”, “Revert 2번 commit” 역시 commit log에 남게 된다.

잘못이 있으면 숨기지 말고 기록을 남기고 수정하자!

  • 커밋을 삭제할 때 커밋을 삭제하는 기록도 남겨야 다른 사람들과 협업할 때 도움이 된다. 어떤 역사를 남기는 사관의 입장으로 커밋을 하자! revert 쓰자!


MERGE, REBASE, 병합하기

  • git switch [branch 이름] : 두 방법 모두 병합될 브랜치에서 명령문 실행

  • git merge main : 현재 A 브랜치에서 main 브랜치의 내용과 비교하여 병합하는 방법, 그 과정에서 conflct가 발생하기도 하여 사용자가 직접 수정해야 한다.
  • base : 현재 A 브랜치가 만들어진 main 브랜치의 커밋 시작 위치
  • git rebase main : 베이스부터 현재 A 브랜치의 커밋 진행 부분을 일시적으로 다른 곳(patch)에 저장하고, HEAD(최신상태) main 브랜치와 저장되어졌던 A 브랜치의 커밋들을 하나씩 병합하여 새로운 커밋을 생성한다.
    • conflct가 없을 때
      1. git switch A : A 브랜치로 이동
      2. git rebase main : main 브랜치 rebase
      3. git switch main , git merge A : A 브랜치 안에 main이 포함되어 있으니 A가 더 큰 브랜치가 되므로 main 브랜치도 merge를 통해 똑같이 만들어준다.
    • conflict가 있을 때
      1. git switch A : A 브랜치로 이동
      2. git rebase main : main 브랜치 rebase
      3. conflict 발생
      4. 해당 파일을 열어 conflict 해결, staging (git add [파일 이름])
      5. git rebase --continue : 다음 과정 진행, merge된 파일과 새로운 commit patch의 merge 과정에서 conflict가 일어나는지 봐야한다.
      6. 3, 4, 5번 반복 후 마무리!


Tip!

  • git log --decorate --all --graph --oneline : 쉘에서 시각적으로 브랜치 모양을 볼 수 있는 명령어
  • git config --global alias.lg "log --color --graph -- pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" : 명령어 git lg 로 요약된 git log를 볼 수 있는 설정 명령어


Reference: