다들 git을 어떤 환경에서 사용하고 계신가요? TortoiseGit, GitKraken 등의 GUI 툴로 사용하는 분들도 계실 테고, Git Extension을 사용하는 분들도 계실 것 같습니다. 그런가 하면 command를 직접 입력해서 사용하고 계시는 분들도 계시겠죠 🤚🏼
CLI를 사용하신다면 분명 checkout
명령어를 아주 빈번하게 사용하고 계실텐데요, git 2.23.0이 출시되면서 checkout
이 두 개의 명령어로 쪼개졌다고 합니다.
git-checkout
Medium에서 우연히 다음과 같은 글을 보게 되었습니다.
이번 업데이트를 통해서 기존의 checkout
명령어가 switch
와 restore
로 분리되었으니, 가급적이면 저 둘을 사용하는 것이 좋겠다는 제안이었습니다. 그 이유 중 하나는 checkout 명령어가 지나치게 많은 기능을 하나로 처리하고 있어서 직관적이지 않다는 것이었는데요, 기존에 checkout 명령어가 다루던 작업들은 대략(...)적으로 다음과 같습니다.
- 새로운 브랜치 만들기
- 리모트 브랜치 따오기
- 작업 중인 브랜치 변경하기
- stage되지 않은 파일들의 변경사항 제거하기
- 다른 commit에서 변경 사항 가져오기
이렇게 모아놓고 보니 확실히 만능 명령어처럼 사용되던 측면이 있었던 것 같습니다. 그래서 새로 생긴 switch와 restore는 정확히 어떤 역할을 하게 되는 걸까요?
git-switch
switch
명령어의 경우 기능은 매우 단순합니다. 말 그대로 브랜치를 바꿔줍니다.
아 그래요?
git switch [<option>] [--no-guess] <branch>
git switch [<option>] --detach [<start-point>]
git switch [<option>] (-c|-C) <new-brach> [<start-point>]
git switch [<option>] --orphan <new-branch>
용례는 위와 같지만, 이 중에서 중요해 보이는 것은 -C 옵션입니다. 이것은 기존에 checkout -b
와 같은 역할을 합니다. 존재하지 않는 브랜치로 switch 하는 경우 -c 옵션을 붙여서 새로 만들어(create) 줍니다. 다른 옵션에 대해서도 궁금하시다면 git-scm을 참고하시면 좋을 것 같습니다.
git-restore
restore
또한 보이는 그대로, working-tree의 파일을 되돌리는 역할을 합니다.
git restore [<option>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>
git restore [<option>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
git restore (-p|--patch) [<option>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>...]
용례는 위와 같으며, 모든 변경사항을 폐기하는 git checkout .
과 마찬가지로 git restore .
을 통해 모든 변경사항을 폐기할 수 있습니다. git restore --staged <file>
을 통해서 staged 된 파일을 unstaged상태로 돌릴 수도 있습니다. 더 많은 옵션에 관해서 궁금하시다면 git-scm을 참고하시면 좋겠습니다.
conclusion
어차피 당장 checkout
이 deprecate되는 것도 아니므로 굳이 익숙한 checkout
명령어를 버릴 필요는 없을 것 같지만, 만능 명령어를 사용하는 것과 각각 하나의 명시적인 명령어를 사용하는 것에 관해서 고민해 볼 수 있는 기회가 되었습니다.