나는 git에서 내 커밋을 취소하려고했습니다. 사용하는 것이 위험 git reset --hard HEAD~1
합니까?
에 대한 다른 옵션의 차이점은 무엇입니까 git reset
?
답변:
git reset
소프트, 혼합, 하드, 병합 및 유지의 다섯 가지 "모드"를 알고 있습니다. 일반적으로 접하게되는 모드이므로 처음 세 가지부터 시작하겠습니다. 그 후에는 약간의 보너스를받을 수 있으므로 계속 지켜봐주십시오.
사용할 때 git reset --soft HEAD~1
현재 분기에서 마지막 커밋을 제거하지만 파일 변경 사항은 작업 트리에 유지됩니다 . 또한 변경 사항은 인덱스에 유지되므로를 따라 git commit
가면 이전에 "제거한"커밋과 똑같은 변경 사항이 적용된 커밋이 생성됩니다.
이것은 기본 모드이며 소프트와 매우 유사합니다. 커밋을 "제거"할 때 git reset HEAD~1
변경 사항은 여전히 작업 트리에 유지되지만 인덱스에는 유지되지 않습니다. 따라서 커밋을 "다시 실행"하려면 커밋 git add
하기 전에 변경 사항 ( ) 을 추가해야합니다 .
사용 git reset --hard HEAD~1
하면 마지막 커밋에 도입 된 변경 사항 외에도 커밋되지 않은 모든 변경 사항 이 손실됩니다 . 변경 사항은 작업 트리에 유지되지 않으므로 git status
명령을 실행하면 저장소에 변경 사항이 없음을 알 수 있습니다.
이것으로 조심스럽게 밟으십시오. 추적하지 않은 커밋되지 않은 변경 사항을 실수로 제거한 경우 git
(말 : 커밋되거나 적어도 인덱스에 추가됨)을 사용하여 다시 가져올 방법이 없습니다 git
.
git reset --keep HEAD~1
흥미롭고 유용한 것입니다. 현재 HEAD
커밋과 주어진 커밋 이 다른 파일 만 재설정합니다 . 이러한 파일 중 하나라도 커밋되지 않은 변경 사항이있는 경우 재설정을 중단합니다. 기본적으로 더 안전한 버전의 hard
.
이 모드는 변경 사항이 많고 이러한 변경 사항을 잃지 않고 다른 분기로 전환하려는 경우 (예 : 잘못된 분기에서 작업을 시작한 경우) 특히 유용합니다.
이에 대한 자세한 내용은 git reset documentation 에서 확인할 수 있습니다 .
참고 커밋을 제거
할 때 git reset
커밋은 실제로 손실되지 않으며, 커밋이나 자식을 가리키는 참조가 없습니다. git reset
예를 들어,와 같은 명령을 사용하여 SHA-1 키를 찾아서 "삭제"된 커밋을 복구 할 수 있습니다 git reflog
.
--hard
, --keep
훨씬 더 안전하고 --hard
작동 하는 대부분의 시나리오에 적용되는 것처럼 옳은 일은 거의 없습니다 . 손가락을 사용하도록 훈련 --keep
하면 언젠가는 구할 수 있습니다.
keep
. ;)
Git 재설정에는 소프트, 혼합, 병합, 하드, 유지의 5 가지 주요 모드가 있습니다 . 차이점은 헤드, 스테이지 (인덱스), 작업 디렉토리 를 변경하거나 변경하지 않는 것입니다 .
Git reset --hard는 헤드, 색인 및 작업 디렉토리를 변경합니다.
Git reset --soft는 머리 만 변경합니다. 색인, 작업 디렉토리에 대한 변경 사항이 없습니다.
즉, 커밋을 실행 취소하려면 --soft가 충분해야합니다. 그러나 그 후에도 여전히 색인과 작업 디렉토리에 잘못된 커밋으로 인한 변경 사항이 있습니다. 파일을 수정하고, 수정하고, 색인에 추가하고 다시 커밋 할 수 있습니다.
--hard를 사용하면 프로젝트에서 완전히 깨끗한 슬레이트를 얻을 수 있습니다. 마지막 커밋에서 변경 사항이없는 것처럼. 이것이 당신이 원하는 것이라고 확신한다면 앞으로 나아가십시오. 그러나 이렇게하면 마지막 커밋을 완전히 잃게됩니다. (참고 : 손실 된 커밋을 복구하는 방법은 여전히 있습니다.)
이것은 reset 명령에 대한 설명을 그래픽으로 보여주는 유용한 문서입니다.
https://git-scm.com/docs/git-reset
Reset --hard는 검사하지 않고 작업 복사본을 덮어 쓰므로 매우 위험 할 수 있으므로 파일을 전혀 커밋하지 않으면 사라집니다.
소스 트리에 관해서는 커밋을 취소하는 방법이 없습니다. 어쨌든 덮개 아래에서 재설정을 사용할 가능성이 큽니다.
git reset --help
5 가지 모드 또는 적어도 OP가 요청한 2 가지 모드를 (내 의견으로는) 잘 설명하는 것도 언급 할 것이다 .