- Worst
ex)$ mv [바꾸기 전 파일명.확장자] [바꿀 파일명.확장자]
: git상에서 기존 파일은 지워지고(deleted) 새 파일이 생긴 걸로 인식해서 다시 add해야함.
또한, 나중에 다시 봤을 때 "내용은 같은데 지우고 새로운 파일이 생겼네? 왜지?" 라고 헷갈릴 수 있음.
* 여기서 다시 mv로 원래 이름으로 바꿔주면
$ git status
했을 때도 원래대로 돌아감!Q. 이름 바꾸기 전 파일(지워진 파일)인데 왜 add, commit이 가능한가?
A. ???
- Best !
ex)$ git mv [바꾸기 전 파일명.확장자] [바꿀 파일명.확장자]
: git상에서 renamed로 인식해서 다시 add할 필요없음.
- 파일의 history를 남기기 위해서는 '삭제 후 생성'이 아닌 '이름 바꾸기'로 추적
- 형식:
$ git restore [파일명.확장자]
(이전엔 checkout이었음)restore
는undo
(수정 내용 복구하기)!!!!!!
(reset이나 cancel과 다름!!)- working 디렉토리에서 작업했던 부분을 되돌리는 것!
: 즉, commit까지 했던 파일을 vi로 재수정 후, restore하면 수정 전(
최신 commit 상태
)으로 복구됨.- 여러 개 파일도 취소 가능!
:
$ git restore .
하면 현재 위치 아래에 있는 모든 파일에 대해 restore(복구)를 실시cf) shell 명령 취소는
ctrl+c
/ git 취소는undo
- 형식:
$ git reset HEAD [파일명.확장자]
=>
$ git restore --staged [파일명.확장자]
도 가능함!!
- add했던 것(staging했던 것)을 내리는 것.
(add이전 상태로!)=> HEAD는 최신의 상태를 의미한다.
82103@LAPTOP-NBT556I5 MINGW64 ~/Documents/dev/revert-practice (main) $ git status On branch main Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: LICENSE # 스테이징된 파일이 있다!(커밋 준비 완료) 82103@LAPTOP-NBT556I5 MINGW64 ~/Documents/dev/revert-practice (main) $ git reset HEAD LICENSE Unstaged changes after reset: M LICENSE # git reset으로 언스테이징해줌. 82103@LAPTOP-NBT556I5 MINGW64 ~/Documents/dev/revert-practice (main) $ git status On branch main Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: LICENSE no changes added to commit (use "git add" and/or "git commit -a") # 스테이징된 파일이 없다는 내용 확인할 수 있음.
$ git commit --amend
: 수정 등의 문제로 직전 커밋 메시지를 다시 열고 싶을 때
$ git log
로 커밋 이름 확인
(위로 갈수록 최신 커밋)
$ git rebase --interactive(혹은-i) [바꾸고 싶은 커밋의 직전 커밋ID]
ex) // 위쪽이 최신 커밋 //
commit 7fb9deb (HEAD -> master)
commit 9b6b873
commit 95b2f13
commit cc28abb
- 여기서 95b2f13의 내용을 바꾸고 싶다면 하나 이전인 cc28abb를 입력해야한다.
$ git rebase -i cc28abb
로 바로 커밋 ID로 쳐도 되고,
$ git rebase -i HEAD~3
로 입력해도 된다.- vim 창에서 바꿀 커밋의
pick
부분을edit
으로 바꾸고 저장한다.
$ git commit --amend
를 입력해 수정하고 싶은 파일들을 수정하고, 완료됐을 때$ git rebase --continue
를 입력한다.
위의 과정 중
$ git rebase -i [커밋]
을 통해 내용을 edit으로 바꾸는 등의 과정 중,$ git rebase --abort
을 입력하면 rebase작업이 중지된다.
$ git rebase --continue
- Worst case
:Reset
없던 일로 만들 수는 있지만 다른 협업 파트너에게 이미 갔다면, 다시 pull받을 때 파일이 살아올 수 있다!
또한 과거 이력에서 깔끔히 사라져버려서 commit log 추적이 힘들어진다!ex) commit후 push까지 한 직전 3개의 commit을 아래와 같이 삭제한 후, remote에 강제 push
$ git reset --hard HEAD~3 $ git push -f origin [branch이름]
- solution : 잘못한 이력도 commit으로 박제하고 수정한 이력을 남기자!
- Best case
:Revert
잘못하기 전 과거로 돌아가 최신을 유지하면서 되돌렸다는 이력을 commit으로 남겨 모든 팀원이 이 사항을 공유하고 주지시킬 수 있다.ex) 현재 HEAD에서 직전의 3개의 commit을 순서대로 거슬러 올라가 해당 내역에 대해 commit, push 수행
# 현재 3개의 파일을 각각 add commit까지 완료한 상태임. $ git revert --no-commit HEAD~3.. # 최신 상태로부터 한칸씩 순차적으로 올라가며 되돌려라! 라는 뜻(..은 상위니까 3번째 꺼부터 맨위까지를 가리킴) # 그래서 --no-commit이 없으면 돌아갈때마다 하나씩 commit해야함! 82103@LAPTOP-NBT556I5 MINGW64 ~/Documents/dev/revert-practice (main|REVERTING) $ git status On branch main Your branch is ahead of 'origin/main' by 5 commits. (use "git push" to publish your local commits) You are currently reverting commit e8ce93c. (all conflicts fixed: run "git revert --continue") (use "git revert --skip" to skip this patch) (use "git revert --abort" to cancel the revert operation) Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: a.md deleted: b.md deleted: c.md # 3개의 커밋을 지웠다는 내용이 남고 이걸 커밋으로 남겨주면 다른 사람들도 확인 가능 $ git commit $ git push origin [branch명]
- commit을 따로 안할땐
--no-edit
- merge commit을 되돌릴 땐
-m
ex)$ git revert -m {1 or 2} [merge commit id]
)