방금 커밋을 날리다가, 잘못해서 build 파일까지 github에 push를 해서 되돌리면서 시도한 해결 방안을 기록한다.
1. git commit 취소하기
- git commit -m "~~"로 로컬에서 git의 내부 인덱스에 파일 및 디렉터리를 저장한 경우
git reset HEAD^
명령어를 통해 전 커밋으로 이동 가능
현재 origin&master의 HEAD가 "Add HelloController, testCode"를 가리키고 있는데 "gitignore 추가" 커밋으로 HEAD가 이동하며 최상단 커밋을 취소하고 커밋한 파일들을 unstaged 상태로 되돌린다. (add 전)
즉, 제일 최근 커밋이 취소된다고 보면 된다.
이후에 커밋 취소한 파일들을 다시 작업을 해서 git commit -m "~~"로 커밋 날리면 된다.
- 옵션 설명
git reset -- hard HEAD^ : 위험한 옵션, unstaged 상태 + 작업한 파일들까지 삭제
git reset -- mixed HEAD^ : 기본 옵션이고, 위에서 설명한 것처럼 unstaged상태 + 작업한 파일들 보존
git reset -- soft HEAD^ : 말 그대로 soft, stage 상태 유지 + 작업한 파일들 보존
2. git push 취소하기
이게 나의 경우였다. 아무 생각 없이 원격 저장소에 push까지 했는데, 필요 없는 파일들까지 push 돼버렸다.
현재 원격 저장소에 "Add HelloController, testCode" 커밋이 push 된 상태.
난 이 커밋을 바꾸고 싶다!
git reset HEAD^
역시 이 reset 명령어로 커밋을 되돌린다.
되돌리면, 보다시피 master HEAD가 전 커밋인 "gitignore 추가"를 가리키고 있다.
그리고 파일을 가보면
기존에 커밋을 했던 파일들의 상태가 모두 unstage 상태로 바뀐 것을 확인할 수 있었다.
이 시점에서 잘못된 것, 또는 내가 수정하고 싶었던 내용을 수정하고 다시 커밋을 날려주면 된다.
1. 코드 수정
2. git add (staging)
3. git commit -m "~~"
4. git push origin +master
마지막 4번 명령어인 git push origin +master(+를 붙인다)를 해주면 그대로 원격 저장소에 있던 커밋을 강제로 덮어쓴다.
즉, reset HEAD로 HEAD는 전 커밋으로 가져왔어도, 원격 저장소는 특정 행동을 해주기 전까지 그 커밋 push가 남아있으므로 수정된 커밋을 강제로 덮어써주는 것이다.
조심해야 한다! 특히 같이 작업하는 공간일 경우 코드를 덮어쓰는 것이므로 나중에 충돌이 날 수도 있다.
코드 수정 후, add 해주고, 커밋해주고, push origin +master 해준 결과 수정한 커밋(커밋 메시지가 달라진 걸 확인할 수 있다)이 잘 붙은 걸 볼 수 있다.
'개발 공부 > Git' 카테고리의 다른 글
[Git] git tag를 통해 release version 관리해보기 (0) | 2022.11.17 |
---|