난 항상 생각했습니다 git reset
과 git checkout
모두가 특정 커밋을하는 프로젝트 등을 가지고 있다는 점에서, 동일로. 그러나 중복 될 수 있기 때문에 정확히 동일 할 수는 없다고 생각합니다. 이 둘의 실제 차이점은 무엇입니까? svn svn co
은 커밋을 되돌려 야하기 때문에 약간 혼란 스럽습니다 .
추가
VonC과 찰스의 차이점을 설명 git reset
하고 git checkout
정말 잘합니다. 내 현재 이해는 git reset
모든 변경 사항을 특정 커밋으로 되 돌리는 반면 git checkout
지점을 준비하는 것은 다소 있습니다. 다음 두 다이어그램 이이 이해에 매우 유용하다는 것을 알았습니다.
추가 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 master
‘develop
‘ 가 실행 되면 ‘ ‘자체는 이제 동일한 커밋을 가리 킵니다.master
‘않습니다.반면에 우리가 대신 달리면
git checkout master
‘develop
‘는 움직이지 않을HEAD
것입니다.HEAD
이제 ‘master
‘를 .따라서 두 경우 모두
HEAD
commit을 가리 키도록 이동 하고A
있지만 그렇게하는 방법은 매우 다릅니다.reset
분기HEAD
지점을 가리키고, 결제는HEAD
다른 지점을 가리 키도록 이동 합니다.
그러나 그 점에서 :
그러나이 답변의 첫 번째 단락은 오해의 소지가 있습니다. ”
git checkout
… 분기를 체크 아웃 한 경우에만 HEAD가 업데이트됩니다 (그렇지 않은 경우 HEAD가 분리됨)”.
사실이 아님 :git checkout
브랜치가 아닌 커밋을 체크 아웃하더라도 HEAD를 업데이트합니다 (그렇습니다. 분리 된 HEAD로 끝나지만 여전히 업데이트됩니다).git checkout a839e8f updates HEAD to point to commit a839e8f.
@LarsH가 정확합니다.
두 번째 글 머리 기호는 HEAD가 무엇인지에 대한 오해가 있으므로 지점을 체크 아웃하는 경우에만 HEAD가 업데이트됩니다.
머리는 그림자처럼 당신이 어디에 있든갑니다.
브랜치가 아닌 참조 (예 : 태그) 또는 커밋을 직접 확인하면 HEAD가 이동합니다. 분리 된 헤드는 HEAD에서 분리 된 것이 아니라 헤드가 분기 참조에서 분리 된 것을 의미합니다 (예 🙂git log --pretty=format:"%d" -1
.
- 연결된 헤드 상태는로 시작합니다
(HEAD ->
.- detached는 여전히을 표시
(HEAD
하지만 분기 참조에 대한 화살표는 없습니다.
답변
가장 간단한 형태로 reset
작업 트리를 건드리지 않고 색인을 재설정합니다.checkout
변경합니다.
일치하도록 색인을 재설정합니다 HEAD
작업 트리를 그대로두면 .
git reset
개념적으로 작업 트리에 인덱스를 체크 아웃합니다. 실제로 모든 작업을 수행하려면 -f
로컬 변경 사항을 덮어 쓰 도록 사용해야 합니다. 이것은 “논쟁 없음”형식이 파괴되지 않도록하기위한 안전 기능입니다.
git checkout
매개 변수 추가를 시작하면 겹치는 부분이있는 것입니다.
checkout
일반적으로 분기, 태그 또는 커밋과 함께 사용됩니다. 이 경우 HEAD
인덱스 가 재설정 되고 지정된 커밋으로 인덱스는 물론 작업 트리로 인덱스를 체크 아웃합니다.
사용자가 제공 또한, 만약 --hard
에 reset
당신은 요청할 수 있습니다reset
작업 트리를 덮어 쓰고 색인을 재설정 .
현재 지점을 체크 아웃 한 경우 대체 지점 또는 커밋을 제공하는 시점 reset
과 checkout
시점 사이에 중요한 차이점이 있습니다.reset
현재 커밋은 선택된 커밋을 가리 키도록 변경하는 반면 checkout
현재 브랜치는 홀로 남겨두고 제공된 브랜치를 체크 아웃하거나 커밋합니다.
다른 형태 reset
commit
경로 와 공급.
에 당신이 경로를 제공하면 reset
사용자가 제공 할 수없는 --hard
및reset
단지 공급의 버전으로 공급 경로의 인덱스 버전을 변경합니다 커밋 (또는 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의 답변을 참조하십시오.동일한 기사에서 참조하십시오.
물론 어떤 효과에 대한 자세한 내용이 있습니다 checkout
reset
어떤 매개 변수가 사용되는지에 따라 인덱스 및 작업 트리에 과 있습니다. 두 명령간에 많은 유사점과 차이점이있을 수 있습니다. 그러나 내가 알 수 있듯이 가장 중요한 차이점은 현재 지점의 끝을 움직이는 지 여부입니다.
답변
두 명령 (재설정 및 체크 아웃)은 완전히 다릅니다.
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