`git`에 대해서 한창 공부할 때도 있었는데,
요즘엔 쓰던 명령어만 쓰면서 그렇게 지내고 있던 와중에...
새로운 명령어(기능?)가 `high-level commands`로 추가되었다는 소식을 듣게 되었다.
`v2.23.0` 버전의 릴리스 노트에 `switch / restore` 2개의 새로운 명령어를 소개하고 있다.
- https://github.com/git/git/blob/master/Documentation/RelNotes/2.23.0.txt
이하 과정은 `Ubuntu 18.04` 환경에서 진행했다.
1. 설치된 버전 확인
- 새로운 명령어를 사용해보기 위해서는 `v2.23.0` 이상의 버전이 필요하다.
- Ubuntu 환경에서 apt 패키지를 통해 설치되어있는 git 버전을 확인해보자.
$ git --version git version 2.17.1 |
- 오래된 버전을 삭제하려면 다음과 같이...
$ sudo apt remove git
$ sudo apt autoremove |
2. 신규 버전 설치 (PPA)
- 가장 편리한 방법인 PPA 추가해서 apt를 통해서 관리하는 방법이다.
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt update
$ sudo apt install git |
3. 신규 버전 설치 (Source)
- 개인적인 취향으로 좋아하는 방식인 Source Code 빌드해서 사용하기 ^^
. https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
$ sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev gettext libssl-dev asciidoc xmlto libz-dev docbook2x install-info
$ cd /srv/install/git
$ wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.33.1.tar.gz
$ tar zxvf git-2.33.1.tar.gz
$ cd git-2.33.1
$ make configure
$ ./configure --prefix=/usr/local
$ make all doc info
$ sudo make install install-doc install-html |
- 자동 완성 기능도 설정하자
. bash
$ sudo cp ./contrib/completion/git-completion.bash /etc/bash_completion.d/ |
. zsh
$ mkdir -p ~/.zsh
$ cp ./contrib/completion/git-completion.bash ~/.zsh/ $ cp ./contrib/completion/git-completion.zsh ~/.zsh/_git
$ nano ~/.zshrc |
... zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash fpath=(~/.zsh $fpath)
autoload -Uz compinit && compinit |
- git에서 결과 화면이 전환되는 방식으로 나오는 것이 싫은 경우
$ git config --global pager.branch false |
4. New Command
- 새로운 명령어 `switch / restore`는 기존 `checkout` 명령어의 일부 기능이 분리된 것이다.
. `checkout` : Switch branches or restore working tree files
. `switch` : Switch branches
. `restore` : Restore working tree files
5. Before (As-was)
- 기존에 해왔던 방식을 살펴보자
- git source code를 가지고 알아보겠다. (사이즈가 좀 크지만 그래도 ^^)
- branch 정보를 살펴보자
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/seen remotes/origin/todo |
- local에 `develop` branch를 생성해보자 = local branch 생성 + 현재 작업 branch 변경
$ git checkout -b develop 새로 만든 'develop' 브랜치로 전환합니다
$ git branch -a * develop master remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/seen remotes/origin/todo |
- 다시 `master` branch로 변경해보자
$ git checkout master 'master' 브랜치로 전환합니다 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
$ git branch -a develop * master remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/seen remotes/origin/todo |
- 파일 하나를 변경하고 staging까지 해보자
$ nano README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: README.md
커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
$ git add README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋할 변경 사항: (use "git restore --staged ..." to unstage) 수정함: README.md |
- staged 상태에 있는 파일을 빼내자
$ git reset HEAD README.md 리셋 뒤에 스테이징하지 않은 변경 사항: M README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: README.md
커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오) |
- 변경된 파일을 원복 해보자
$ git checkout -- README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋할 사항 없음, 작업 폴더 깨끗함 |
6. Now (To-be/is)
- 이제 새로운 명령어로 위의 과정을 다시 해보자
- `develop-2` branch를 생성하고 이동해보자
$ git switch -c develop-2 새로 만든 'develop-2' 브랜치로 전환합니다
$ git branch -a develop * develop-2 master remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/seen remotes/origin/todo |
- `master` branch로 이동!
$ git switch master 'master' 브랜치로 전환합니다 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
$ git branch -a develop develop-2 * master remotes/origin/HEAD -> origin/master remotes/origin/maint remotes/origin/master remotes/origin/next remotes/origin/seen remotes/origin/todo |
- 파일 하나 수정
$ nano README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: README.md
커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
$ git add README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋할 변경 사항: (use "git restore --staged ..." to unstage) 수정함: README.md |
- 파일을 일단 unstaged 상태로~
$ git restore --staged README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: README.md
커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오) |
- 파일 원복!
$ git restore README.md
$ git status 현재 브랜치 master 브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋할 사항 없음, 작업 폴더 깨끗함 |
지금까지 git에 새롭게 추가된 2개의 명령어 `switch / restore` 에 대해서 살펴보았다.
보면 알겠지만 기존에 안되던 새로운 기능이 추가된 것은 아니고
`checkout`에서 했던 기능 中 일부분을 분리해서 구성한 것일뿐이다.
기존에 `checkout`을 잘 사용해왔던 분들이라면, "굳이 왜~?"라는 말을 할 수도 있겠으나
처음 git을 접하는 분들이라면 조금 더 직관적인 명령어로 느끼지 않을까라는 생각이 든다.
그 동안 너무 git을 멀리해왔던 것 같아서 간만에 포스팅해봤다!