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


440

난 항상 생각했습니다 git resetgit 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인덱스 가 재설정 되고 지정된 커밋으로 인덱스는 물론 작업 트리로 인덱스를 체크 아웃합니다.

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

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

다른 형태 resetcommit경로 와 공급.

에 당신이 경로를 제공하면 reset사용자가 제공 할 수없는 --hardreset 단지 공급의 버전으로 공급 경로의 인덱스 버전을 변경합니다 커밋 (또는 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.