개별파일 원복
git checkout -- <파일> : 워킹트리의 수정된 파일을 index에 있는 것으로 원복
git checkout HEAD -- <파일명> : 워킹트리의 수정된 파일을 HEAD에 있는 것으로 원복(이 경우 --는 생략가능)
git checkout FETCH_HEAD -- <파일명> : 워킹트리의 수정된 파일의 내용을 FETCH_HEAD에 있는 것으로 원복? merge?(이 경우 --는 생략가능)
index 추가 취소
git reset -- <파일명> : 해당 파일을 index에 추가한 것을 취소(unstage). 워킹트리의 변경내용은 보존됨. (--mixed 가 default)
git reset HEAD <파일명> : 위와 동일
commit 취소
git reset HEAD^ : 최종 커밋을 취소. 워킹트리는 보존됨. (커밋은 했으나 push하지 않은 경우 유용)
git reset HEAD~2 : 마지막 2개의 커밋을 취소. 워킹트리는 보존됨.
git reset --hard HEAD~2 : 마지막 2개의 커밋을 취소. index 및 워킹트리 모두 원복됨.
git reset --hard ORIG_HEAD : 머지한 것을 이미 커밋했을 때, 그 커밋을 취소. (잘못된 머지를 이미 커밋한 경우 유용)
git revert HEAD : HEAD에서 변경한 내역을 취소하는 새로운 커밋 발행(undo commit). (커밋을 이미 push 해버린 경우 유용)
Push 가 된 상태라면 reset 후 원복된 내용을 Commit 다시하고 Push 하면된다.
워킹트리 전체 원복
git reset --hard HEAD : 워킹트리 전체를 마지막 커밋 상태로 되돌림. 마지막 커밋이후의 워킹트리와 index의 수정사항 모두 사라짐.
(변경을 커밋하지 않았다면 유용)
(변경을 커밋하지 않았다면 유용)
git checkout HEAD . : ??? 워킹트리의 모든 수정된 파일의 내용을 HEAD로 원복.
git checkout -f : 변경된 파일들을 HEAD로 모두 원복(아직 커밋하지 않은 워킹트리와 index 의 수정사항 모두 사라짐. 신규추가 파일 제외)
* 참조 : reset 옵션
--soft : index 보존, 워킹트리 보존. 즉 모두 보존.
--mixed : index 취소, 워킹트리만 보존 (기본 옵션)
--hard : index 취소, 워킹트리 취소. 즉 모두 취소.
* untracked 파일 제거
git clean -f
git clean -f -d : 디렉토리까지 제거
필요한 작업은 두가지. 하나는 reset 하는 다시 push. 덤으로 remote에 있는 저장소와 pull을 해서 다시 한번 동기화 맞춰주기.
세번째 작업은 부가적인거니까 일단 앞에 두개만 해보자.
git reset HEAD^
이 명령을 사용하면 커밋 하나를 되돌릴 수 있다. 두개를 되돌리려면
git reset HEAD~2
이렇게 되돌린 다음엔 다시 커밋을 하고..
git commit -m ‘머라머라’
이제 Push를 해야되는데.. Github같은 곳에 있는 저장소로 올리려고 push하면 다음과 같은 메시지가 떨어진다.
$ git push origin master
To git@github.com:keesun/telepathy.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ‘git@github.com:keesun/telepathy.git’
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. ‘git pull’) before pushing again. See the
‘Note about fast-forwards’ section of ‘git push –help’ for details.
원격 저장소에 있는 정보가 손실 될 수 있는 작업이라서 리젝트 시킨다. 오호.. 상당히 똑똑하다. 그런데 어쩌겠는가.. 내가 원하는 작업이 바로.. 그 작업이라네.. 없애주길 바래.
이럴때 사용할 수 있는게 +다.
git push origin +master
이렇게 +를 붙여주면 경고는 무시하고 데이터가 손실되도 push한다.