Git 재설정, 되돌리기 및 체크아웃 명령의 차이점

John Wachira 2024년2월15일
  1. Git Reset, Git Revert 및 Git Checkout 명령의 차이점
  2. 힘내 재설정 vs. 힘내 되돌리기 vs. 힘내 체크아웃
  3. 커밋 수준 작업
  4. 파일 수준 작업
Git 재설정, 되돌리기 및 체크아웃 명령의 차이점

이 기사에서는 git reset, git revertgit checkout 명령의 차이점에 대해 설명합니다. 다음은 리포지토리의 일부 변경 사항을 실행 취소할 수 있는 가장 유용한 Git 유틸리티 중 일부입니다.

명령을 혼합하기는 쉽지만 이 기사가 끝나면 위의 명령으로 리포지토리를 사용하고 탐색하는 데 자신감을 갖게 될 것입니다.

Git Reset, Git Revert 및 Git Checkout 명령의 차이점

Git 리포지토리의 세 가지 주요 구성 요소에 대한 각 명령의 효과를 명확히 알고 있으면 이러한 명령을 이해하기가 더 쉬울 것입니다.

  1. 작업 디렉토리
  2. 단계적 스냅샷
  3. 커밋 내역

위의 구성 요소를 Three Trees라고 부를 수도 있습니다.

힘내 체크 아웃

체크 아웃이란 무엇을 의미합니까?

이 작업은 HEAD 포인터를 지정된 커밋으로 재배치합니다.

git checkout

위의 이미지는 Git 리포지토리의 커밋 시퀀스를 보여줍니다. HEADmain 분기 포인터는 현재 커밋 d에 있습니다.

git checkout 명령을 사용하여 HEAD 참조를 모든 커밋으로 이동할 수 있습니다.

예를 들어 HEAD 참조를 커밋 b로 이동하려면 다음을 실행합니다.

$ git checkout -b

커밋 및 파일 수준에서 git checkout 명령을 사용할 수 있습니다. 파일 수준에서 체크아웃하면 지정된 커밋의 내용으로 파일 내용이 업데이트됩니다.

힘내 되돌리기

되돌릴 때 특정 커밋을 가져와서 지정된 커밋의 효과를 되돌리는 새 커밋을 만듭니다. git revert 커밋은 커밋 수준에서만 적용되며 파일 수준 기능은 없습니다.

힘내 재설정

재설정할 때 우리는 특정 커밋을 가져오고 Three Trees를 재설정하고 지정된 커밋에서 리포지토리의 상태와 일치하도록 리포지토리를 업데이트합니다. 세 나무에 해당하는 세 가지 모드에서 재설정할 수 있습니다.

일반적으로 git resetgit checkout을 사용하여 로컬 또는 개인 변경 사항을 취소합니다. 둘 다 리포지토리의 기록을 수정하고 원격 공용 또는 공유 리포지토리로 푸시할 때 충돌을 일으킬 수 있습니다.

힘내 재설정 vs. 힘내 되돌리기 vs. 힘내 체크아웃

아래 표에는 세 가지 명령에 대한 몇 가지 일반적인 사용 사례가 나와 있습니다.

명령 범위 일반적인 사용 사례
git 재설정 커밋 수준 브랜치에서 로컬로 커밋을 삭제하거나 커밋되지 않은 변경 사항을 버립니다.
git 재설정 파일 수준 인덱스에서 파일을 언스테이징합니다.
git checkout 커밋 수준 이전 커밋을 검사하고 분기 간에 전환합니다.
git checkout 파일 수준 작업 디렉토리의 변경 사항을 버리십시오.
git 되돌리기 커밋 수준 공용 분기에서 커밋의 효과를 되돌립니다.
git 되돌리기 파일 수준 (해당 없음)

커밋 수준 작업

git resetgit checkout 명령에 매개변수를 전달하여 다양한 수준의 작업을 호출합니다. 파일 매개변수를 포함하지 않으면 명령이 전체적으로 커밋에 작용합니다.

커밋 재설정

커밋 레벨에서 재설정하면 HEAD 참조가 지정된 커밋으로 이동합니다. 이 명령을 사용하여 분기에서 커밋을 삭제할 수 있습니다.

다음은 예입니다.

$ git reset HEAD~3

위의 명령은 분기의 끝을 세 커밋만큼 뒤로 이동합니다. 우리는 그것들을 dangling 또는 orphaned 커밋이라고 부를 수 있습니다.

우리는 세 커밋을 버렸습니다. 원격 공유 리포지토리에 게시하지 않은 커밋을 제거하려면 명령을 사용하는 것이 가장 좋습니다.

git reset 명령을 사용하여 다음 플래그 중 하나를 전달하여 준비된 스냅샷 및 작업 디렉토리를 변경할 수도 있습니다.

  1. --soft - 단계적 변경 또는 작업 디렉토리를 변경하지 않습니다.
  2. --mixed - 작업 디렉토리에 영향을 주지 않지만 지정된 커밋과 일치하도록 스테이징된 스냅샷을 변경합니다.
  3. --hard - 지정된 커밋과 일치하도록 작업 디렉터리와 준비된 스냅샷을 모두 변경합니다.

오래된 커밋 체크아웃

git checkout 명령을 사용하여 지정된 커밋에서 저장소의 상태를 검사할 수 있습니다. 브랜치 사이를 전환하기 위해 브랜치 이름을 전달할 수도 있습니다.

다음은 예입니다.

$ git checkout feature

위의 명령은 기능 분기로 전환됩니다. 가지를 움직이지 않습니다.

분기 이름 대신 커밋 해시 또는 참조를 전달하여 임의의 커밋을 검사할 수도 있습니다. 다음은 예입니다.

$ git checkout HEAD~1

위의 명령은 현재 커밋의 부모를 확인합니다. HEAD~2를 전달하면 조부모를 확인합니다.

위의 명령은 현재 HEAD에 분기 참조가 없기 때문에 분리된 HEAD 모드로 전환합니다.

다른 브랜치로 전환하면 분리된 HEAD 모드에서 수행된 모든 변경 및 커밋에 도달할 수 없습니다. 분리된 HEAD 상태에 있는 동안 변경 사항을 커밋하려는 경우 항상 새 분기를 만듭니다.

공유 커밋 되돌리기

커밋을 되돌리면 지정된 커밋의 효과를 되돌리는 새 커밋을 만듭니다. 이렇게 하면 공유 리포지토리의 커밋 기록을 다시 작성하는 것을 방지할 수 있습니다.

예를 들어 가장 최근 커밋을 되돌리려면 다음을 실행합니다.

$ git revert HEAD

파일 수준 작업

git checkoutgit reset 명령은 파일 경로를 선택적 매개변수로 허용합니다. 명령의 효과는 단일 파일로 제한됩니다.

파일 재설정

아래와 같이 지정된 커밋의 버전과 일치하도록 파일의 단계적 스냅샷을 업데이트할 수 있습니다.

$ git reset HEAD~1 README.md

위의 명령은 현재 커밋의 상위 커밋에서 README.md 파일의 버전을 가져와서 다음 커밋의 인덱스에 추가합니다. git reset HEAD README.md를 실행하여 README.md 파일을 언스테이징할 수 있습니다.

Git 체크아웃 파일

git checkout 명령에 파일 경로를 전달하면 준비된 스냅샷이 아닌 작업 디렉토리가 업데이트됩니다. 이렇게 하면 분기 간에 HEAD 포인터가 이동하지 않습니다.

다음은 예입니다.

$ git checkout HEAD~1 README.md

그러면 현재 커밋의 상위 커밋에서 README.md 파일의 버전을 가져오고 작업 디렉토리에서만 README.md 파일을 업데이트합니다. 단순히 이전 커밋의 파일 버전으로 되돌아갔다는 의미입니다.

지정된 커밋에 의해 도입된 변경 사항을 되돌리는 git revert 명령과 달리 이것은 모든 후속 변경 사항을 버립니다. 아래와 같이 단일 파일에 대한 준비되지 않은 변경 사항을 폐기하는 데 사용할 수 있습니다.

$ git checkout HEAD README.md

결론적으로, 각 명령이 커밋 기록, 단계적 스냅샷 및 작업 디렉터리에 미치는 영향을 이해함으로써 git reset, git revertgit checkout 명령을 쉽게 구분할 수 있습니다.

작가: John Wachira
John Wachira avatar John Wachira avatar

John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.

LinkedIn

관련 문장 - Git Revert

관련 문장 - Git Reset