"git reset"과 "git checkout"의 차이점은 무엇입니까?


440

난 항상 생각했습니다 git reset과 git checkout모두가 특정 커밋을하는 프로젝트 등을 가지고 있다는 점에서, 동일로. 그러나 중복 될 수 있기 때문에 정확히 동일 할 수는 없다고 생각합니다. 이 둘의 실제 차이점은 무엇입니까? svn svn co은 커밋을 되돌려 야하기 때문에 약간 혼란 스럽습니다 .

추가

VonC과 찰스의 차이점을 설명 git reset하고 git checkout정말 잘합니다. 내 현재 이해는 git reset모든 변경 사항을 특정 커밋으로 되 돌리는 반면 git checkout지점을 준비하는 것은 다소 있습니다. 다음 두 다이어그램 이이 이해에 매우 유용하다는 것을 알았습니다.

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

추가 3

에서 http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , 체크 아웃 및 재설정 할 수의 에뮬레이션 rebase.

여기에 이미지 설명을 입력하십시오

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

여기에 이미지 설명을 입력하십시오



재 : "정확하지 않거나 지나치게 단순화 되었습니까?" 예, 첫 번째 다이어그램은 체크 아웃과 재설정의 차이와 관련하여 오해의 소지가 있습니다. ( -- files변이 에 관해서는 괜찮을 수도 있지만 확실하지 않습니다.)이 다이어그램을 통해 주요 차이점이 색인 또는 WD에 영향을 미치는지 여부를 알 수 있습니다. 그것에 관한 내 대답을 참조하십시오. 두 번째 및 세 번째 다이어그램은 실제 차이를 보는 데 매우 유용합니다. 네 번째 및 다섯 번째 다이어그램은 이러한 명령의 기능을 이해하는지 여부를 확인하는 데 유용하지만 실제로 도움이되지는 않습니다.
— LarsH

가장 유용한 요약을 제공하기 위해 "Git Tools Reset Demystified"의 "Check it out" 섹션을 찾았습니다 .
— Josiah Yoder

1
prosseek : @LarsH에 동의하면 첫 번째 다이어그램이 오도의 소지가 있음을 제거 할 수 있습니까?
— Josiah Yoder

결제 및 재설정은 rebase의 두 번째 부분 만 에뮬레이트하며 think-like-a-git.net데이터 손실을 방지하기 위해 추가 단계 (링크 된 기사 에서 제공 )가 필요합니다.
— cowlinator

답변:


198
  • git reset특히 HEAD를 이동하여 인덱스 를 업데이트하는 것에 관한 것 입니다.
  • git checkout작업 트리 를 업데이트하는 것입니다 (인덱스 또는 지정된 트리로). 분기를 체크 아웃 할 때만 HEAD를 업데이트합니다 (그렇지 않으면 HEAD 가 분리됩니다 ).
    (실제로, Git 2.23 Q3 2019에서는 git restore반드시 그렇지는 않습니다 git checkout)

이에 비해 svn에는 인덱스가 없기 때문에 작업 트리 만이 svn checkout지정된 개정을 별도의 디렉토리에 복사합니다.
더 가까운 git checkout것은 :

  • svn update (같은 지점에 있다면 같은 SVN URL을 의미)
  • svn switch (예를 들어 동일한 지점이지만 다른 SVN 저장소 URL에서 체크 아웃 한 경우)

그 모든 세 가지 작업 트리 수정 ( svn checkout, update, switch) 자식에 하나의 명령이 있습니다 git checkout.
그러나 git에는 인덱스 개념 (리포지토리와 작업 트리 사이의 "스테이징 영역")도 있으므로 git reset.


Thinkeye 는 주석 에서 " Remy Demystified " 기사를 언급합니다 .

예를 들어, 서로 다른 커밋을 가리키는 ' master'와 ' develop'의 두 가지 분기 가 있고 현재 ' develop'(HEAD 가 가리킴 )에 있고 git reset master' develop' 가 실행 되면 ' '자체는 이제 동일한 커밋을 가리 킵니다.master '않습니다.

반면에 우리가 대신 달리면 git checkout master' develop'는 움직이지 않을 HEAD것입니다. HEAD이제 'master '를 .

따라서 두 경우 모두 HEADcommit을 가리 키도록 이동 하고 A있지만 그렇게하는 방법은 매우 다릅니다. reset분기 HEAD지점을 가리키고, 결제는 HEAD다른 지점을 가리 키도록 이동 합니다.

http://git-scm.com/images/reset/reset-checkout.png

그러나 그 점에서 :

LarsH 는 주석에 다음을 추가합니다 .

그러나이 답변의 첫 번째 단락은 오해의 소지가 있습니다. " git checkout... 분기를 체크 아웃 한 경우에만 HEAD가 업데이트됩니다 (그렇지 않은 경우 HEAD가 분리됨)".
사실이 아님 : git checkout브랜치가 아닌 커밋을 체크 아웃하더라도 HEAD를 업데이트합니다 (그렇습니다. 분리 된 HEAD로 끝나지만 여전히 업데이트됩니다).

git checkout a839e8f updates HEAD to point to commit a839e8f.

De Novo 는 의견에 동의 합니다 .

@LarsH가 정확합니다.
두 번째 글 머리 기호는 HEAD가 무엇인지에 대한 오해가 있으므로 지점을 체크 아웃하는 경우에만 HEAD가 업데이트됩니다.
머리는 그림자처럼 당신이 어디에 있든갑니다.
브랜치가 아닌 참조 (예 : 태그) 또는 커밋을 직접 확인하면 HEAD가 이동합니다. 분리 된 헤드는 HEAD에서 분리 된 것이 아니라 헤드가 분기 참조에서 분리 된 것을 의미합니다 (예 :) git log --pretty=format:"%d" -1.

  • 연결된 헤드 상태는로 시작합니다 (HEAD ->.
  • detached는 여전히을 표시 (HEAD하지만 분기 참조에 대한 화살표는 없습니다.

7
나는 말하고 싶지만 git reset부작용으로 나무 가지 "라벨"을 수정하고 선택적으로 인덱스를 업데이트하거나 작업에 대한 것입니다. git checkout작업 트리를 업데이트하고 현재 "선택된"분기 ( HEAD)를 전환하는 것입니다.
— Mikko Rantalainen

2
@MikkoRantalainen nope. git reset에 대해 100 % HEAD입니다. 분리 된 HEAD 모드 ( stackoverflow.com/a/3965714/6309 ) 에서도 작동하며 분기 가 없는 곳 (!)을 의미합니다. git checkout은 분리 된 HEAD 모드에서 작동하거나 분리 된 HEAD 모드에서 SHA1을 체크 아웃하는 데 사용될 수 있습니다.
— VonC

3
검색 엔진이 여기에 보낸 모든 잃어버린 영혼에 대한 자세한 내용은 가치가 있다고 생각합니다. git-scm.com/blog/2011/07/11/reset.html
— Thinkeye

2
@Thinkeye 좋은 참조. 나는 더 많은 가시성을 얻기 위해 관련 추출과 함께 그것을 포함시켰다.
— VonC

2
Reset Demystified의 설명은 훌륭합니다. 그러나이 답변의 첫 번째 단락은 오해의 소지 가 있습니다 . 사실이 아닙니다 ... git checkout 은 분기가 아닌 커밋을 체크 아웃하더라도 HEAD를 업데이트합니다 (예, 분리 된 HEAD로 끝나지 만 여전히 업데이트되었습니다). 어쩌면 "업데이트"의 의미를 오해하고 있습니까? git checkout a839e8f커밋을 가리 키도록 HEAD를 업데이트합니다 a839e8f.
— LarsH

67

가장 간단한 형태로 reset작업 트리를 건드리지 않고 색인을 재설정합니다.checkout 변경합니다.

일치하도록 색인을 재설정합니다 HEAD작업 트리를 그대로두면 .

git reset

개념적으로 작업 트리에 인덱스를 체크 아웃합니다. 실제로 모든 작업을 수행하려면 -f로컬 변경 사항을 덮어 쓰 도록 사용해야 합니다. 이것은 "논쟁 없음"형식이 파괴되지 않도록하기위한 안전 기능입니다.

git checkout

매개 변수 추가를 시작하면 겹치는 부분이있는 것입니다.

checkout일반적으로 분기, 태그 또는 커밋과 함께 사용됩니다. 이 경우 HEAD인덱스 가 재설정 되고 지정된 커밋으로 인덱스는 물론 작업 트리로 인덱스를 체크 아웃합니다.

사용자가 제공 또한, 만약 --hard에 reset당신은 요청할 수 있습니다reset 작업 트리를 덮어 쓰고 색인을 재설정 .

현재 지점을 체크 아웃 한 경우 대체 지점 또는 커밋을 제공하는 시점 reset과 checkout시점 사이에 중요한 차이점이 있습니다.reset현재 커밋은 선택된 커밋을 가리 키도록 변경하는 반면 checkout현재 브랜치는 홀로 남겨두고 제공된 브랜치를 체크 아웃하거나 커밋합니다.

다른 형태 resetcommit경로 와 공급.

에 당신이 경로를 제공하면 reset사용자가 제공 할 수없는 --hard및reset 단지 공급의 버전으로 공급 경로의 인덱스 버전을 변경합니다 커밋 (또는 HEAD당신은 지정하지 않으면 커밋).

당신에 대한 경로를 제공하는 경우 checkout와 같이, reset이 공급 된 커밋 (또는 일치하도록 제공된 경로의 인덱스 버전을 업데이트합니다 HEAD)를하지만 항상 작업 트리에 제공된 경로의 인덱스 버전을 체크 아웃합니다.


2
"체크 아웃"이 인덱스를 변경하지 않는다고 말하는 것은 사실이 아닙니다. 이는 지점에서 다른 지점으로 이동할 때 변경됩니다.
— wiki1000

가장 간단한 형태로 reset은 작업 트리를 건드리지 않고 인덱스를 재설정하는 반면, checkout은 인덱스를 건드리지 않고 작업 트리를 변경합니다. : 그게 얼마나 혼란 스러운가 : |
— Aditya Gupta

41

변경 사항을 되돌릴 때 간단한 사용 사례 :
1. 수정 된 파일의 준비를 취소하려면 reset을 사용하십시오.
2. 스테이지되지 않은 파일에 대한 변경 사항을 취소하려면 체크 아웃을 사용하십시오.


1
완벽한 답변. 감사합니다.
— user358591

11

요컨대 reset , 현재 분기 참조 를 이동시키는 반면checkout HEAD는 이동하지 않습니다.

Pro Git 책이 Reset Demystified 아래에 설명되어 있듯이 ,

가장 먼저 할 일은 HEAD가 가리키는 것을 옮기는 것 reset입니다 . 이것은 동일하지 않습니다 HEAD 자체를 변경 무엇 인 (checkout 않습니다)를; HEAD가 가리키는 reset 분기 를 이동합니다 . 이는 HEAD가 master지점 (즉 master, 현재 지점에 있음) 으로 설정되어있는 경우을 가리키면서 실행 git reset 9e5e6a4이 시작됨을 master의미합니다 9e5e6a4. [강조 추가]

유용한 텍스트 및 다이어그램 발췌 내용은 VonC의 답변을 참조하십시오.동일한 기사에서 참조하십시오.

물론 어떤 효과에 대한 자세한 내용이 있습니다 checkoutreset 어떤 매개 변수가 사용되는지에 따라 인덱스 및 작업 트리에 과 있습니다. 두 명령간에 많은 유사점과 차이점이있을 수 있습니다. 그러나 내가 알 수 있듯이 가장 중요한 차이점은 현재 지점의 끝을 움직이는 지 여부입니다.


2
이전 답변 외에도 좋은 피드백. +1
— VonC 2019

2

두 명령 (재설정 및 체크 아웃)은 완전히 다릅니다.

checkout X 아니다 reset --hard X

X가 지점 이름이면 checkout X현재 지점은 변경하지만 변경 reset --hard X하지는 않습니다.


2
그러나 X가 파일 또는 폴더이면 동일합니다.
— Ted Bigham

1

간단한 니모닉 :

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