Git 커밋과 푸쉬를 실수 했을 때, 되돌리는 법

원글 주소 : http://whiteship.me/?p=13516

git reset HEAD^ 
커밋 하나를 되돌립니다.


git reset HEAD~2 
커밋 두개를 되돌립니다.

그 다음 다시 commit 하고 난 뒤 push를 하면 …

error: failed to push some refs to~To prevent you from losing history, non-fast-forward updates were rejected

원글의 내용에 따르면 이런 메시지가 나오는데, 저장소에 있는 정보가 손실 될 수 있기 때문에 푸시가 거절 된답니다.

git push origin +master

이럴 때 위의 명령어로 푸시를 하면 됩니다.

그렇게 생기는 부작용은 밑의 깃 튜토리얼에서 확인할 수 있습니다.
https://www.atlassian.com/git/tutorials/undoing-changes/git-checkout

When you undo with git resetthere is no way to retrieve the original copy.
Atlassian Git Tutorials 갈무리

git reset으로 되돌린 내용은 다시 되돌릴 수 없다는 말입니다. 잘못된 내용을 되돌리겠지만, 한번에 많은 양을 되돌릴 경우 정상적인 내용은 저장해놓지 않았다면 그냥 삭제되는 것 밖에는 안되겠네요.

원글의 댓글에서 git revert가 안전하다는 내용이 있어서 찾아보았습니다.

Instead of deleting it, git revert added a new commit to undo its changes.
Atlassian Git Tutorials 갈무리

git revert는 삭제하는 대신 되돌리기를 통해 전 상태를 새로 커밋합니다.

직접 실험을 통해 알아보았습니다.

1-1. 아무 내용이나 커밋 후 푸시합니다.

아무 내용이나 README.md 파일에 적습니다.

md 파일을 커밋하고 푸시합니다.

푸시 결과 한글이 잘(?) 깨져서 등록되었습니다.

1-2. reset 합니다.

reject 되어서 git push origin +master로 푸시합니다.

1-3. 내용에는 변화가 없고 커밋만 지워집니다.

reset 후 내용에는 변함이 없습니다.

“아무 내용이나” 라는 커밋이 지워지고 git reset이 생겼습니다.

2-1. 아무 내용이나 커밋 후 푸시합니다.

최초 anything을 적었습니다.

최초로 anything을 커밋합니다.

reset 후 바로 revert를 하려고 하니 난리(?)가 나서 정상적인 상태에서 테스트를 시도합니다.

두번째 커밋 “anything 2nd”

커밋이 정상적으로 푸시 되었습니다.

2-2. revert 합니다.

git revert HEAD^ 실행합니다.

왜 바로 전 커밋으로 내용이 추가되지 않은 걸까 싶어서 Git 튜토리얼을 다시 봤는데, revert는 임의의 커밋 히스토리가 추가된답니다. 튜토리얼에서는 별로 좋은 방법이 아니라고 설명되있습니다.

Needless to say, this is not an elegant undo solution.
Atlassian Git Tutorials 갈무리

이 외에도 되돌리기에는 git checkout과 git clean 등이 있습니다. 이것 체크하느라, 잔다고는 자정 쯤에 말했는데 지금은 5시 20분입니다… 시간 가는 줄도 모르고, 목도 말라서 계속 물 마셔야지 물 마셔야지 했는데 그게 벌써 다섯시간 정도 지났네요.

이만 취침을…..

끝.

from Blogger http://j-iwon.blogspot.com/2016/09/git.html
via IFTTT

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중