개발관련/Git

“git reset”과“git checkout”의 차이점

Rateye 2021. 10. 5. 10:52
728x90
반응형
질문 : “git reset”과“git checkout”의 차이점은 무엇입니까?

git resetgit checkout 을 같은 것으로 생각했는데, 둘 다 프로젝트를 특정 커밋으로 되 돌린다는 의미에서. 그러나 중복되므로 정확히 같을 수는 없다고 생각합니다. 둘의 실제 차이점은 무엇입니까? svn에는 커밋을 되돌릴 svn co 만 있기 때문에 약간 혼란 스럽습니다.

VonC와 Charles는 git resetgit checkout 의 차이점을 정말 잘 설명했습니다. 내 현재 이해는 git reset 은 모든 변경 사항을 특정 커밋으로 되 돌리는 반면 git checkout 은 어느 정도 분기를 준비한다는 것입니다. 이 이해를 돕기 위해 다음 두 다이어그램이 매우 유용하다는 것을 알았습니다.

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

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 자체가 다른 지점을 가리 키도록 이동합니다.

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.

댓글의 콘테스트 :

@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
728x90
반응형