source

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

nicesource 2023. 7. 3. 22:57
반응형

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

전 항상 생각해왔어요git reset그리고.git checkout마찬가지로, 두 가지 모두 프로젝트를 특정 커밋으로 되돌린다는 의미에서.하지만, 저는 그것들이 중복될 수 있기 때문에 정확히 같을 수 없다고 생각합니다.둘 사이의 실질적인 차이는 무엇입니까?svn만 가지고 있기 때문에 조금 혼란스럽습니다.svn co커밋을 되돌립니다.

추가된

는 Von C와 Charles의 했습니다.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, 에서 체크아웃 및 재설정을 통해 기본 재배치를 에뮬레이트할 수 있습니다.

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

  • git reset 특히 색인을 업데이트하고 HEAD를 이동하는 입니다.
  • git checkout 작업 트리(인덱스 또는 지정된 트리)를 업데이트하는 작업입니다.분기를 체크아웃한 경우에만 HEAD가 업데이트됩니다. 그렇지 않은 경우 HEAD가 분리됩니다.
    (사실, Git 2.23 Q3 2019를 사용하면, 이것은 반드시 그렇지는 않을 것입니다.git checkout)

이에 비해 svn에는 인덱스가 없으므로 작업 트리만 별도의 디렉토리에 지정된 리비전을 복사합니다.
은값가록수울까에음에 가까운 한 것.git checkout편집:

  • svn update (같은 지점에 있는 경우, 같은 SVN URL을 의미)
  • svn switch (예를 들어 동일한 지점을 체크아웃하지만 다른 SVN repo URL에서 체크아웃하는 경우)

이 세 가지 작업 트리 수정 사항(svn checkout,update,switch .git checkout.
그러나 git는 인덱스(레포와 작업 트리 사이의 "스테이지 영역")의 개념도 가지고 있기 때문에, 당신은 또한 가지고 있습니다.git reset.


Thinkeye댓글에서 "Reset Demystified" 기사를 언급합니다.

를 들어, 두 의 분기가 ' 를들어두가개, 리의가지있지다면고를예가우▁',,있면▁for, ',masterdiscovery'develop커밋을 저희는 로다른커가며리키현, 는재우리서밋을'를 하고 .develop(그래서 HEAD는 그것을 가리킵니다) 그리고 우리는 달려갑니다.git reset master, 'develop' 자체라이동제약가것그입다니리킬속을일한는가▁'▁that그▁commit▁same다것▁itself니입▁now▁point▁to▁will'와 같은 커밋을 것입니다.master합니다.

반면에, 만약 우리가 도망친다면,git checkout master, 'develop움직이지 않을 것입니다.HEAD그 자체가 그럴 것입니다. HEAD이제 '를 가리킬 것입니다.master'.

그래서 두 경우 모두 우리는 이동할 것입니다.HEAD를 범하다A하지만 우리가 그렇게 하는 방법은 매우 다릅니다. reset 분를이것입니다할동기▁the▁branch▁move다것▁will를 이동합니다.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가 이동합니다.것은되었다는 것을 수 를 들어, 헤가분 되었다는것의것헤것는하분는이아미헤니분라다것의분기니합드가미을는다었되기리서준에을리드서드다되에었리드가은헤▁detached,▁head▁doesn,▁is▁ref다니▁head▁from의합것▁e▁see미▁branch▁can▁detached▁the을▁which'▁the▁you▁you▁a▁it는▁meansve,'▁from다▁detached었▁from▁headg분되리분기서에헤드준기t▁mean 예를 들어, 다음과 같이 볼 수 있습니다.git log --pretty=format:"%d" -1.

  • 는 첨된헤상다시로작다니합으로 입니다.(HEAD ->,
  • 에도 분된상계표시니다됩속가태리가 표시됩니다.(HEAD하지만 지점 심판에 대한 화살표는 없을 것입니다.

가장 단순한 형태로,reset작업 트리를 건드리지 않고 인덱스를 재설정하는 동안checkout인덱스를 건드리지 않고 작업 트리를 변경합니다.

일치하도록 인덱스를 재설정합니다.HEAD방치된 작업 트리:

git reset

개념적으로 인덱스를 작업 트리로 체크아웃합니다.는 사해야하모작든업실을제면수행려하로용는면▁to수려▁use▁have하행▁to▁would▁you▁to▁anything사▁do▁it실▁get를 사용해야 합니다.-f로컬 변경사항을 덮어쓰도록 강제합니다.이것은 "인수 없음" 양식이 손상되지 않도록 하는 안전 기능입니다.

git checkout

매개 변수를 추가하기 시작하면 일부 중복이 있는 것이 사실입니다.

checkout일반적으로 분기, 태그 또는 커밋과 함께 사용됩니다. 이경우재됩다니정설다니▁will▁reset▁in됩이를 재설정합니다.HEAD지정된 커밋에 대한 인덱스와 작업 트리에 대한 인덱스 체크아웃을 수행합니다.

또한, 만약 당신이 공급한다면.--hardreset물어볼 수 있습니다reset작업 트리를 덮어쓰고 인덱스를 재설정합니다.

현재 지점을 체크아웃한 경우 다음과 같은 중요한 차이가 있습니다.reset그리고.checkout대체 분기 또는 커밋을 제공하는 경우. reset하는 반면, " " " " 은 " " 은 " 을 지정합니다.checkout현재 분기는 그대로 유지되지만 제공된 분기를 체크아웃하거나 대신 커밋합니다.

의 다른 형태들reset그리고.commit경로 제공을 포함합니다.

경를제는로에 reset은 공할수없다를 제공할 수 .--hard그리고.reset커밋의 " " " " "에서 " "라는 이름의 으로 변경됩니다.HEAD커밋을 지정하지 않은 경우).

경를제는로에 checkout,맘에 들다reset커밋( 제공경인 또버전제커을공밋된스덱의는로된또커(▁of밋▁the▁the▁it▁will▁to▁update▁match된▁version제공▁(는or▁index제)에 맞게 업데이트됩니다.HEAD그러나 항상 작업 트리에 제공된 경로의 인덱스 버전을 확인합니다.

변경 사항을 반환할 때 한 가지 간단한 사용 사례:
수정된 파일의 스테이징을 취소하려면 재설정을 사용합니다.
준비되지 않은 파일/s에 대한 변경사항을 취소하려면 체크아웃을 사용합니다.

간단히 말해서 핵심적인 차이점은reset 현재 분기 참조를 이동하는 동안checkout그렇지 않습니다(헤드 이동).

ProGit 책이 Reset Demystified에서 설명했듯이,

첫번째로resetHEAD가 가리키는 것을 이동합니다.이것은 HEAD 자체를 바꾸는 것과 같지 않습니다.checkout 함);reset HEAD가 가리키는 분기를 이동합니다.이것은 HEAD가 다음으로 설정되어 있는 경우를 의미합니다.master 당신은 현재 지즉(점, 당현재)에 .master 중인 분기, 실git reset 9e5e6a4만드는 것으로 시작할 것입니다.master을 가리키다.9e5e6a4[추가됨]

같은 기사에서 발췌한 매우 유용한 텍스트와 다이어그램에 대한 VonC의 답변도 참조하십시오. 여기서는 이를 복제하지 않겠습니다.

어떤 가 있는지에 는 훨씬 더 이 있습니다.checkout그리고.reset사용되는 매개 변수에 따라 인덱스 및 작업 트리에 를 둘 수 있습니다.두 명령 사이에는 많은 유사점과 차이점이 있을 수 있습니다.하지만 제가 보기에 가장 결정적인 차이는 그들이 현재 가지의 끝을 움직이느냐 하는 것입니다.

간단한 니모닉:

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

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

checkout X그렇지 않음reset --hard X

이름이라면, X가 분이면이름기,면,checkout X를 변경하는 동안에 변경됩니다.reset --hard X하지 않을 것이다.

다음은 모호성에 대한 설명입니다.

  • git checkout은 HEAD를 다른 커밋(지점 이름을 사용하여 변경할 수도 있음)으로 이동하지만, 다음과 같습니다.
    1. 분기에 관계없이 해당 분기의 끝에 대한 포인터(예: "메인")는 변경되지 않은 상태로 유지됩니다(따라서 분리된 헤드 상태가 될 수 있음).

    2. 또한 준비 영역과 작업 디렉토리는 변경되지 않은 상태로 유지됩니다(체크아웃 전과 유사한 상태).

예:

git checkout 3ad2bcf <--- checkout to another commit
git checkout another-branch <--- checkout to another commit using a branchname
  • 또한 Git reset을 사용하면 HEAD가 다시 이동하지만 두 가지 차이점이 있습니다.

    1. 현재 분기의 끝에 있는 커밋을 가리키는 포인터도 이동합니다.예를 들어, 현재 분기에 대한 포인터의 이름이 "main"이라고 지정된 다음 git-reset을 수행하면, 이제 메인 포인터가 다른 커밋을 가리키고 HEAD도 해당 커밋을 가리킵니다(기본적으로 HEAD는 메인 포인터를 가리킴으로써 간접적으로 커밋을 가리킵니다. 여전히 연결된 헤드(!)입니다.하지만 여기서는 아무런 차이가 없습니다.)

    2. Git-reset은 재설정을 수행하기 전과 동일한 상태로 준비 영역과 작업 디렉토리를 유지하지 않아도 됩니다.아시다시피 재설정에는 소프트, 혼합(기본값) 및 하드의 세 가지 유형이 있습니다.

      • 소프트 리셋을 사용하면 스테이징 영역과 작업 디렉토리가 모두 리셋 전 상태로 유지됩니다(체크아웃과 유사하지만 차이점 #1).
      • 기본 재설정 유형인 혼합 재설정을 사용하면 #1의 차이 외에도 스테이징 영역의 제안된 다음 커밋(기본적으로 추가한 것)도 새로 가리킨 헤드별 커밋으로 설정됩니다.그러나 작업 디렉토리에서는 모든 파일에 대한 최신 편집 내용이 그대로 유지됩니다. 따라서 작업이 손실되지 않도록 이러한 유형의 재설정이 기본값입니다.
      • 하드 재설정을 사용하면 #1의 차이 외에도 세 가지 트리가 모두 헤드, 스테이징 영역 및 작업 디렉토리가 새로 지정된 머리 단위 커밋으로 변경됩니다.

예:

git reset --soft 3ad2bcf
git reset da3b47

git reset-> 준비된 영역에서 모든 파일을 제거합니다.git add <files>

git reset <commit_ID>-> 커밋을 취소하고 지정된 커밋 후 모든 파일의 스테이징을 해제합니다.

--hard reset 명령을 사용하면 준비영역에서 파일을 제거하고 디렉터리에서 파일을 삭제합니다.

git checkout <commit_ID> -> 지정된 커밋 상태로 돌아갑니다.

git branch -a당신은 당신이 안에 있다는 것을 알게 될 것입니다.

(HEAD가 <commit_에서 분리됨)아이디>)

.

콘솔에 따라:

'헤드 분리' 상태입니다.이 상태에서 수행한 커밋은 분기로 다시 전환하여 분기에 영향을 주지 않고 삭제할 수 있습니다.

두 가지 옵션이 제공됩니다.

  1. git switch -c <new-branch-name>해당 커밋에서 새 분기가 생성되고 현재 분기가 됩니다.
  2. git switch -c-> 기본적으로 체크아웃 명령을 실행 취소하여 이전 지점으로 돌아갑니다.

언급URL : https://stackoverflow.com/questions/3639342/whats-the-difference-between-git-reset-and-git-checkout

반응형