질문 : “git reset”과“git checkout”의 차이점은 무엇입니까?
git reset
과 git checkout
을 같은 것으로 생각했는데, 둘 다 프로젝트를 특정 커밋으로 되 돌린다는 의미에서. 그러나 중복되므로 정확히 같을 수는 없다고 생각합니다. 둘의 실제 차이점은 무엇입니까? svn에는 커밋을 되돌릴 svn co
만 있기 때문에 약간 혼란 스럽습니다.
VonC와 Charles는 git reset
과 git checkout
의 차이점을 정말 잘 설명했습니다. 내 현재 이해는 git reset
은 모든 변경 사항을 특정 커밋으로 되 돌리는 반면 git checkout
은 어느 정도 분기를 준비한다는 것입니다. 이 이해를 돕기 위해 다음 두 다이어그램이 매우 유용하다는 것을 알았습니다.
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에는 인덱스가없고 작업 트리 만 있기 때문에 svnsvn checkout
은 별도의 디렉토리에 주어진 개정판을 복사합니다.git checkout
더 가까운 것은 다음과 같습니다.
svn update
(동일한 분기에있는 경우 동일한 SVN URL을 의미 함)svn switch
(예를 들어 동일한 분기를 체크 아웃하지만 다른 SVN 리포지토리 URL에서)
세 가지 작업 트리 수정 ( svn checkout
, update
, switch
git checkout
에서 하나의 명령 만 가지고 있습니다.
그러나 git에는 인덱스 (repo와 작업 트리 사이의 "스테이징 영역") 개념도 있으므로 git reset
도 있습니다.
Thinkeye 는 댓글 에서 " Reset Demystified "라는 기사를 언급합니다.
예를 들어, 다른 커밋을 가리키는 master
'와 ' develop
develop
'(따라서 HEAD가 가리키고 있음)를 실행하고 git reset master
실행하면 ' develop
'자체가 이제 master
'와 동일한 커밋을 가리 킵니다.
반면에 git checkout master
를 실행하면 ' develop
'가 이동하지 않고 HEAD
자체가 이동합니다. HEAD
는 이제 ' master
'를 가리 킵니다.
따라서 두 경우 모두 HEAD
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
, 분기 참조에 대한 화살표가 없습니다.
출처 : https://stackoverflow.com/questions/3639342/whats-the-difference-between-git-reset-and-git-checkout
'개발관련 > Git' 카테고리의 다른 글
커밋하기 전에 'git add'를 실행 취소하는 방법 (0) | 2021.10.06 |
---|---|
모든 Git 기록에서 문자열을 검색 하는 방법 (0) | 2021.10.06 |
Git 원격 분기가 삭제되었지만 여전히 'branch -a'에 나타납니다. (0) | 2021.10.05 |
Git은 푸시 할 때마다 사용자 이름을 물어보지 않도록 하는 방법 (0) | 2021.10.05 |
[git] 현재 지점에 대한 추적 정보가 없습니다. (0) | 2021.10.05 |