이 할미는 자꾸만 까먹으니 기록을 해야해...
작업을 하고나서 때마다 사진을 찍듯이 찍어주어야 하는 commit
하지만 자꾸만 commit
을 실수하거나, 실수로 commit
한 작업을 실수로 push
까지 해버릴 때가 있다..
그러니 commit
을 되돌리는 방법부터 push
를 취소하는 방법까지 정리해서
다시 구글을 뒤적거리는 일은 없도록 하자.
나는 git alias
를 통해 단축명령어를 써서 commit
을 한다.
특정 작업을 마치면 $ gaa && gcmsg "commit 내용"
을 통해
git add all
+ git commit -m
작업을 한꺼번에 해버린다.
그러다보니 가끔 원하지 않던 파일이 낄껴로 포함되서 같이 올라가거나,
commit
메세지를 수정하고 싶을 때가 있다.
그럴 경우엔 아래의 단계를 거쳐서 되돌리렴. 미래의 나야.
git commit
을 되돌리는 방법에는 크게 두가지가 있다.
돌아가려는 commit 이후의 내용은 삭제해버리는 reset
,
돌아가려는 commit까지의 내용을 새롭게 commit을 하는 revert
개인프로젝트의 경우엔 reset
을 남발해도 상관 없지만,
협업의 경우엔 변경이력까지 남기는 revert
를 사용하라고 한다.
reset
명령어 옵션 종류
- hard : 돌아간 커밋 이후의 변경 이력 모두를 삭제(워킹디렉토리, index영역 모두 초기화)
- mixed(default) : 변경이력 삭제, 내용은 남아있음(워킹디렉토리는 변경되지 않음, index영역은 초기화)
- soft : HEAD위치만 변경, 변경이력 삭제, 내용은 남아있음(워킹디렉토리, index영역 모두 변경되지 않음)
// git log 단축명령어 - commit 목록 확인
$ glo
// 커밋 ID를 통해 되돌리기(hard 옵션)
$ git reset --hard [commit ID]
// 가장 최신의 커밋 1개 되돌리기
$ git reset HEAD^
특정 커밋에서의 변경 사항을 제거하는 또 다른 커밋을 생성하는 명령어로
아래와 같이 사용하면 된다.
$ git revert [commit ID]
만약 커밋이 A -> B -> C
순으로 쌓여있다고 가정할 때,
다시 되돌리기 위해서는
A -> B -> C
에 더해서 C -> B -> A
순으로 거꾸로 revert
해야 한다.
흔히 작업할 때 사용하는 실행취소 프로세스를 생각하면 된다.
그렇기 때문에 100개의 커밋을 되돌리려면 100개의 revert
커밋이 생겨나는건데,
복수의 revert
커밋을 올리기 위해서는 아래와 같이 사용한다.
$ git revert --no-commit HEAD~N // N은 되돌리고 싶은 커밋범위의 갯수
$ git commit --amend
명령어를 입력하면 편집기가 뜨게 된다.
커밋 내용을 수정한 후 esc
-> :wq
를 입력하면,
수정된내용이 저장되고, 편집기에서 나갈 수 있다.
그냥 로컬에서만 작업하던 commit
과는 달리, push
를 하게 되면
원격저장소(github)에 변경사항이 업데이트되서 내용이 변경되게 된다.
원격저장소에 push
된 내용을 변경하기 위해서는
강제로 이전 내용 위에 덮어씌우거나,
변경 내용을 커밋한 후 revert 커밋을 추가하는 방법을 사용한다.
reset
명령어로 커밋을 되돌린 후에,
그냥 git push
작업을 하려 하면 로컬-원격저장소의 커밋히스토리의
위치가 맞지 않기 때문에 에러가 발생한다.
그래서 아래와 같이 로컬의 내용을 원격저장소에 강제로 덮어씌우는 작업을 해준다.
$ git push -f [branch name]
또는
$ git push --force [branch name]
만약, 협업의 상황에서 어쩔 수 없이 사용해야 할 경우엔
아래의 상황이 되도록(?) 만든 뒤 사용하도록 하자,,
pull
하지 않은 경우 force push
를 수행한 이후, 모든 사용자들로 하여금 새로운 사본을 clone
하도록 하고 그들의 변경사항을 새로운 사본 기반으로 재적용 하도록 한다.원격저장소에 강제로 내용을 덮어씌우는 것은
변경이력까지 삭제해버리는 작업이기 때문에, revert
를 사용해서
변경이력까지 커밋에 남겨두는 작업을 통해
협업할 때 다른사람이 수정내용을 알 수 있게 하는 것이 좋다(고 한다.)
참고했습니다 :)