[git] “git reset”과 “git checkout”의 차이점은 무엇입니까?

난 항상 생각했습니다 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

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



답변

  • 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 masterdevelop‘ 가 실행 되면 ‘ ‘자체는 이제 동일한 커밋을 가리 킵니다.master ‘않습니다.

반면에 우리가 대신 달리면 git checkout masterdevelop‘는 움직이지 않을 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하지만 분기 참조에 대한 화살표는 없습니다.

답변

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

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

git reset

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

git checkout

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

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

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

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

다른 형태 resetcommit경로 와 공급.

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

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


답변

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


답변

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

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

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

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

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


답변

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

checkout X 아니다 reset --hard X

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


답변

간단한 니모닉 :

git reset HEAD           :             index = HEAD
git checkout             : file_tree = index
git reset --hard HEAD    : file_tree = index = HEAD


답변