[git] git commit/push 되돌려줘,,,

Grace·2021년 11월 4일
2

Git

목록 보기
2/2
post-thumbnail

이 할미는 자꾸만 까먹으니 기록을 해야해...

⏪ 자꾸만 백지가 되는 git 되돌리기 작업

작업을 하고나서 때마다 사진을 찍듯이 찍어주어야 하는 commit
하지만 자꾸만 commit을 실수하거나, 실수로 commit한 작업을 실수로 push까지 해버릴 때가 있다..

그러니 commit을 되돌리는 방법부터 push를 취소하는 방법까지 정리해서
다시 구글을 뒤적거리는 일은 없도록 하자.

git commit 변경

나는 git alias를 통해 단축명령어를 써서 commit을 한다.
특정 작업을 마치면 $ gaa && gcmsg "commit 내용" 을 통해
git add all + git commit -m 작업을 한꺼번에 해버린다.

그러다보니 가끔 원하지 않던 파일이 낄껴로 포함되서 같이 올라가거나,
commit메세지를 수정하고 싶을 때가 있다.
그럴 경우엔 아래의 단계를 거쳐서 되돌리렴. 미래의 나야.

git commit 되돌리기

git commit을 되돌리는 방법에는 크게 두가지가 있다.
돌아가려는 commit 이후의 내용은 삭제해버리는 reset,
돌아가려는 commit까지의 내용을 새롭게 commit을 하는 revert

개인프로젝트의 경우엔 reset을 남발해도 상관 없지만,
협업의 경우엔 변경이력까지 남기는 revert를 사용하라고 한다.

1. git reset

reset 명령어 옵션 종류

  • hard : 돌아간 커밋 이후의 변경 이력 모두를 삭제(워킹디렉토리, index영역 모두 초기화)
  • mixed(default) : 변경이력 삭제, 내용은 남아있음(워킹디렉토리는 변경되지 않음, index영역은 초기화)
  • soft : HEAD위치만 변경, 변경이력 삭제, 내용은 남아있음(워킹디렉토리, index영역 모두 변경되지 않음)
// git log 단축명령어 - commit 목록 확인
$ glo

// 커밋 ID를 통해 되돌리기(hard 옵션)
$ git reset --hard [commit ID]

// 가장 최신의 커밋 1개 되돌리기
$ git reset HEAD^

2. git revert

특정 커밋에서의 변경 사항을 제거하는 또 다른 커밋을 생성하는 명령어로
아래와 같이 사용하면 된다.

$ 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 메세지 수정하기

$ git commit --amend

명령어를 입력하면 편집기가 뜨게 된다.
커밋 내용을 수정한 후 esc -> :wq 를 입력하면,
수정된내용이 저장되고, 편집기에서 나갈 수 있다.

git push 취소하기

그냥 로컬에서만 작업하던 commit과는 달리, push를 하게 되면
원격저장소(github)에 변경사항이 업데이트되서 내용이 변경되게 된다.

원격저장소에 push된 내용을 변경하기 위해서는
강제로 이전 내용 위에 덮어씌우거나,
변경 내용을 커밋한 후 revert 커밋을 추가하는 방법을 사용한다.

1. git push force

reset 명령어로 커밋을 되돌린 후에,
그냥 git push작업을 하려 하면 로컬-원격저장소의 커밋히스토리의
위치가 맞지 않기 때문에 에러가 발생한다.
그래서 아래와 같이 로컬의 내용을 원격저장소에 강제로 덮어씌우는 작업을 해준다.

$ git push -f [branch name]
또는 
$ git push --force [branch name]

만약, 협업의 상황에서 어쩔 수 없이 사용해야 할 경우엔
아래의 상황이 되도록(?) 만든 뒤 사용하도록 하자,,

  • 덮어쓰기 하려는 변경사항을 현재 사용자 외에 다른 사람들이 pull 하지 않은 경우
  • force push 를 수행한 이후, 모든 사용자들로 하여금 새로운 사본을 clone 하도록 하고 그들의 변경사항을 새로운 사본 기반으로 재적용 하도록 한다.

2. git revert 커밋 추가하기

원격저장소에 강제로 내용을 덮어씌우는 것은
변경이력까지 삭제해버리는 작업이기 때문에, revert를 사용해서
변경이력까지 커밋에 남겨두는 작업을 통해
협업할 때 다른사람이 수정내용을 알 수 있게 하는 것이 좋다(고 한다.)


참고했습니다 :)

profile
쉽게 사는건 재미가 없더군요, 새로 시작합니다🤓

0개의 댓글