'git reset --hard HEAD ~ 1'과 'git reset --soft HEAD ~ 1'의 차이점은 무엇입니까?


답변:


177

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.


1
나는이 3 개가 우리가 일반적으로 사용해야하는 것들에 동의하지 않는다. 그들은 처음 사용 가능한 3 개이므로 사람들은이 3 개에 대해 더 많이 이야기하지만 --hard, --keep훨씬 더 안전하고 --hard작동 하는 대부분의 시나리오에 적용되는 것처럼 옳은 일은 거의 없습니다 . 손가락을 사용하도록 훈련 --keep하면 언젠가는 구할 수 있습니다.
Matthieu Moy

나는 우리 그것들 을 사용해야한다고 제안하지 않았습니다 . 단지 이것이 대부분의 시간에 마주 치는 명령 들일뿐입니다. 적절하다고 판단되면 자유롭게 답변을 수정하십시오.
Sascha Wolf

좀 더 자세한 내용을 추가하려면 git reset --soft HEAD ~ 1 후 git commit --reuse-message = HEAD @ {1}를 사용하여 여기에 표시된 것처럼 보존 된 이전 인덱스로 마지막 커밋을 재사용합니다. stackoverflow.com/a/ 25930432/2883282
englealuze

3
@MatthieuMoy, 3 년 늦었지만 keep. ;)
Sascha Wolf

마지막 커밋을 어떻게 취소 할 수 있습니까? 도와주세요. git reset --soft HEAD ~ 1을 사용하면 다음과 같은 메시지가 나타납니다. fatal : ambiguous argument 'HEAD ~ 1': 알 수없는 개정 또는 경로가 작업 트리에 없습니다. 다음과 같이 '-'를 사용하여 개정판에서 경로를 분리하십시오. 'git <command> [<revision> ...]-[<file> ...]'
elvis

6

Git 재설정에는 소프트, 혼합, 병합, 하드, 유지의 5 가지 주요 모드가 있습니다 . 차이점은 헤드, 스테이지 (인덱스), 작업 디렉토리 를 변경하거나 변경하지 않는 것입니다 .

Git reset --hard는 헤드, 색인 및 작업 디렉토리를 변경합니다.
Git reset --soft는 머리 만 변경합니다. 색인, 작업 디렉토리에 대한 변경 사항이 없습니다.

즉, 커밋을 실행 취소하려면 --soft가 충분해야합니다. 그러나 그 후에도 여전히 색인과 작업 디렉토리에 잘못된 커밋으로 인한 변경 사항이 있습니다. 파일을 수정하고, 수정하고, 색인에 추가하고 다시 커밋 할 수 있습니다.

--hard를 사용하면 프로젝트에서 완전히 깨끗한 슬레이트를 얻을 수 있습니다. 마지막 커밋에서 변경 사항이없는 것처럼. 이것이 당신이 원하는 것이라고 확신한다면 앞으로 나아가십시오. 그러나 이렇게하면 마지막 커밋을 완전히 잃게됩니다. (참고 : 손실 된 커밋을 복구하는 방법은 여전히 ​​있습니다.)


5

이것은 reset 명령에 대한 설명을 그래픽으로 보여주는 유용한 문서입니다.

https://git-scm.com/docs/git-reset

Reset --hard는 검사하지 않고 작업 복사본을 덮어 쓰므로 매우 위험 할 수 있으므로 파일을 전혀 커밋하지 않으면 사라집니다.

소스 트리에 관해서는 커밋을 취소하는 방법이 없습니다. 어쨌든 덮개 아래에서 재설정을 사용할 가능성이 큽니다.


공식 문서 링크 +1. 나는 또한 git reset --help5 가지 모드 또는 적어도 OP가 요청한 2 가지 모드를 (내 의견으로는) 잘 설명하는 것도 언급 할 것이다 .
ThanksForAllTheFish

1
링크가 끊어졌습니다. 현재 버전 일 가능성이 높습니다 : git-scm.com/docs/git-reset
Kiki Jewell

1

이것은 use git reset --hardgit reset --soft 의 주요 차이점입니다 .

--soft

인덱스 파일이나 작업 트리를 전혀 건드리지 않습니다 (그러나 모든 모드와 마찬가지로 헤드를로 재설정합니다). 이렇게하면 git 상태가 표시하는 것처럼 변경된 모든 파일이 "변경 사항이 커밋 될"상태가됩니다.

--hard

색인 및 작업 트리를 재설정합니다. 이후 작업 트리에서 추적 된 파일에 대한 변경 사항은 무시됩니다.


1
이것이 제가 찾던 것입니다. 간결하고 정확합니다.
Qasim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.