Git Revert, Checkout 및 Reset의 차이점은 무엇입니까?


273

나는 복원 또는 롤백 파일과 프로젝트를 이전 상태로,과의 차이를 이해하지 않는 방법을 배우고 노력하고 git revert, checkout하고 reset. 겉보기에는 같은 목적을 위해 세 가지 명령이있는 이유는 무엇입니까?

답변:


461

이 세 명령은 완전히 다른 목적을 가지고 있습니다. 그것들은 원격으로 비슷하지도 않습니다.

git revert

이 명령은 이전 커밋의 변경 사항을 취소하는 새 커밋을 만듭니다. 이 명령은 프로젝트에 새 기록을 추가합니다 (기존 기록은 수정하지 않음).

git checkout

이 명령은 저장소에서 컨텐츠를 체크 아웃하고 작업 트리에 넣습니다. 명령 호출 방식에 따라 다른 영향을 줄 수도 있습니다. 예를 들어 현재 작업중인 지점을 변경할 수도 있습니다. 이 명령은 기록을 변경하지 않습니다.

git reset

이 명령은 조금 더 복잡합니다. 실제로 호출 방법에 따라 몇 가지 다른 작업을 수행합니다. 색인 (소위 "스테이징 영역")을 수정합니다. 또는 현재 지점 헤드를 커밋하는 변경 사항입니다. 이 명령은 분기가 참조하는 커밋을 변경하여 기존 기록을 변경할 수 있습니다.

이 명령 사용

커밋이 프로젝트 히스토리 어딘가에서 이루어지고 나중에 커밋이 잘못되어 수행되어서는 안된다고 결정한 git revert경우 작업을위한 도구입니다. 잘못된 커밋으로 인한 변경 사항을 취소하고 기록에 "실행 취소"를 기록합니다.

작업 트리에서 파일을 수정했지만 변경 내용을 커밋하지 않은 경우 git checkout저장소의 최신 사본을 체크 아웃하는 데 사용할 수 있습니다 .

커밋을했지만 다른 사람과 공유하지 않았고 원하지 않는 경우에는 git reset커밋을 한 적이없는 것처럼 보이도록 기록을 다시 작성하는 데 사용할 수 있습니다 .

이들은 가능한 사용 시나리오 중 일부일뿐입니다. 일부 상황에서 유용 할 수있는 다른 명령이 있으며 위의 세 명령은 다른 용도로도 사용됩니다.


13
따라서 세 가지 명령을 사용하여 일부 작업을 실행 취소 할 수 있습니다. 즉, "완전히 다른"것은 아닙니다. 같은 개념, 다른 맥락.
Bruno Santos

16
@BrunoSantos : 촛대, 리드 파이프, 단검 및 로프는 모두 사람들을 살해하는 데 사용될 수 있지만 그중 어느 것도 특히 비슷하다는 것을 의미하지는 않습니다.
Dan Molding

12
@Dan Mounlding는 - 사실,이 경우 대부분의 경우입니다 git resetgit checkout똑같은 일을 할 수 있습니다. 그것들이 "원격 적으로 비슷하지 않다"고 말하는 것은 단순히 과장된 것이 아니라 원격으로도 사실이 아닙니다. 이 두 명령은 매우 다양한 작업을 수행 할 수 있으며 그 중 일부는 완전히 겹칩니다. 예 : git reset --hardgit checkout -- .똑같은 일을 할 것입니다. 그리고 논리적으로 말하기, git reset --hard <path>git checkout <path>도 똑같이해야 - 자식 그러나 그 일을하지 못하도록합니다. 이 두 명령을 혼동하는 것은 매우 쉽습니다.
DanGordon

5
@ DanGordon 나는 우리가 아마도 여기에 의견 차이가있을 것이라는 것을 알고 있습니다. 그럼에도 불구하고, 나는 약간의 설명을 제공해야한다고 생각합니다. 두 명령이 완전히 다른 작업을 수행하기 때문에 정확하게 git reset --hard <path>할 수 있는 것처럼 할 수 없습니다 . Git에게 HEAD를 다른 커밋으로 옮기라고 지시합니다. 반면에 Git은 HEAD와 관련하여 아무것도하지 말 것을 요구하지 않습니다. HEAD 만 남겨두고 파일을 체크 아웃합니다. 예, 비슷한 효과를내는 방식으로 제작할 수 있습니다. 그러나 그들이 실제로 하는 일은 완전히 다릅니다. git checkout <path>git resetgit checkout
Dan Molding

46

커밋을했다고 가정 해 봅시다.

C
B
A

git revert B의 변경 사항을 취소하는 커밋을 만듭니다 B.

git revert A의 변경 사항을 취소 A하지만 변경 사항을 건드리지 않는 커밋을 만듭니다.B

의 변경 사항이의 변경 사항에 B종속 되는 경우 A되돌릴 A수 없습니다.

git reset --soft A커밋 히스토리 및 저장소를 변경합니다. 스테이징 및 작업 디렉토리는 여전히 상태입니다 C.

git reset --mixed A커밋 히스토리, 저장소 및 스테이징이 변경됩니다. 작업 디렉토리는 여전히 상태입니다 C.

git reset --hard A커밋 히스토리, 저장소, 스테이징 및 작업 디렉토리를 변경합니다. 당신은 A완전히 상태로 돌아갑니다 .


1
직관적 인 답변입니다. 결제는 어떻
MJ Studio

29
  • git revert이전 커밋을 취소하는 데 사용됩니다. 자식에서는 이전 커밋을 변경하거나 지울 수 없습니다. (실제로는 할 수 있지만 문제가 발생할 수 있습니다.) 따라서 이전 커밋을 편집하는 대신 되돌리기는 이전 커밋을 되 돌리는 새로운 커밋을 도입합니다.
  • git reset 아직 커밋되지 않은 작업 디렉토리의 변경 사항을 취소하는 데 사용됩니다.
  • git checkout다른 커밋에서 현재 작업 트리로 파일을 복사하는 데 사용됩니다. 파일을 자동으로 커밋하지 않습니다.

7
"git reset"이 틀렸다고 생각합니다. "git reset"은 HEAD를 이전 커밋 중 하나로 재설정하지만 작업 디렉토리는 재설정하지 않습니다. 작업 디렉토리는 "git checkout [filename]"에 의해 "재설정"됩니다
luigi7up

11
git reset --softHEAD 만 git reset --hard재설정하고 HEAD 및 작업 디렉토리를 재설정합니다.
Ehryk

git reset --mixed (기본값) : 커밋 해제 + 비 스테이지 변경
NattyC

21
  • git checkout 작업 트리를 수정하고
  • git reset 현재 지점을 가리키는 참조를 수정합니다.
  • git revert 커밋 실행 취소 변경 사항을 추가합니다.

4
git reset 분기가 가리키는 커밋을 수정하는 것뿐만 아니라 인덱스에서 파일을 스테이지 해제하는 데 사용되며 작업 사본을 git reset --mixed(기본값)으로 수정할 수 있습니다 .

git reset --soft : 변경 사항을 커밋하지 않고 변경 사항이 준비됩니다 (색인). git reset --mixed (기본값) : uncommit + unstage changes, 변경 사항은 작업 트리에 남아 있습니다. git reset --hard : uncommit + unstage + delete changes, 아무것도 남지 않았습니다.
NattyC

6

재설정- 커밋 수준에서 재설정은 분기의 끝을 다른 커밋으로 이동하는 방법입니다. 현재 브랜치에서 커밋을 제거하는 데 사용할 수 있습니다.

되돌리기- 되돌리기는 새로운 커밋을 만들어 커밋을 취소합니다. 커밋 기록을 다시 쓸 기회가 없으므로 변경 사항을 취소하는 안전한 방법입니다. 이것을 기존 커밋 히스토리를 변경하는 git reset과 대조하십시오. 이러한 이유로 git revert를 사용하여 공개 브랜치에서 변경 사항을 취소하고 git reset을 개인 브랜치에서 변경 사항을 취소하기 위해 예약해야합니다.

이 링크를 볼 수 있습니다- 재설정, 체크 아웃 및 되돌리기


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