Git

[Git] checkout / switch, restore의 차이

syj0522 2024. 9. 5. 18:01

checkout 명령어가 지원하는 기능은 두 가지이다.

 

1. branch 변경

2. 파일 변경 사항(커밋) 복원

 

한 명령어가 두 가지 이상의 기능을 하게 되면 명령어를 쓸 때 목적이 분명히 드러나지 않는다. 그래서 Git 2.23 이후로 branch 변경은 switch로 하고, 파일 변경 사항 복원은 restore을 사용하게끔 명령어가 추가되었다.

 

switch, restore 명령어 발표와 함께 게시된 글 Highlights from Git 2.23 을 보면 해당 내용이 기재되어있다. 명령어 사용 방법과 예시도 나와있으니 한 번 읽어보길 바란다.

 

git checkout

기존 checkout의 기능이다. 브랜치 생성/이동, 파일 복구 모두 지원한다.

  • 현재 branch를 변경
$ git checkout [branch]
  • -b 옵션과 함께 사용하면, branch를 새로 생성한 후 현재 branch를 새로 생성한 branch로 변경할 수 있다.
$ git checkout -b [branch]
  • branch 이름을 두 개 주면 특정 branch에서 새 branch를 생성한 후, 현재 branch를 새로 생성한 branch로 변경할 수 있다.
$ git checkout -b [new-branch] [root-branch]
  • file 이름을 주면 특정 file을 HEAD 커밋 기준으로 복원할 수 있다.
$ git checkout [file]

 

 

git switch

브랜치를 변경하는 명령어

  • 현재 branch를 변경
$ git switch [branch]
  • -c 옵션을 사용하면, branch 생성 후 현재 branch를 생성한 branch로 변경할 수 있다. (checkout에서는 -b로 branch라는 것을 명시했는데 switch를 쓰면서 create의 -c로 바뀌었다. 새로 생성한다는 의미가 잘 전달되는 것 같다.)
$ git switch -c [branch]
  • branch 이름을 두 개 주면, 특정 branch에서 branch 생성 후 현재 branch를 새로 생성한 branch로 변경한다.
$ git switch -c [new-branch] [root-branch]

 

git restore

파일을 복원하는 명령어

  • 특정 파일을 HEAD 커밋으로 복원
$ git restore [file-name]
  • 특정 파일을 특정 커밋으로 복원
  • --source 옵션으로 복구 대상 source(commit)을 지정해준다.예를 들어 git restore --source HEAD a.txt 또는 git restore --source 7abc3de a.txt와 같이 쓰인다.
  • [commit-hash]에는 커밋해시를 나타내는 HEAD값이 들어갈 수도 있다.
$ git restore --source [commit-hash] [file-name]
  • stage의 내용을 HEAD 커밋으로 복원
  • --staged 옵션을 주면 git add에 의해 Staging Area에 올라갔던 파일을 다시 Unstaging Area로 옮길 수 있다.
$ git restore --staged [file-name]