git 이전 브랜치 이름을 가져오는 방법들
Git을 사용하면서 여러 브랜치를 왔다갔다하는 경우에 터미널의 자동완성 혹은 GUI를 쓰는 방법도 있지만, 더 간단하게 할 수 없을까요?
브랜치 뒤로가기
어떻게 하면 이전 브랜치로 이동할 수 있을까요? 가장 기본적인 방법은 checkout
일겁니다.
git checkout {branch_name}
최근에는 switch
라는 브랜치를 이동하기 위한 커맨드도 있으니 git switch {branch_name}
을 사용할 수도 있겠네요.
하나의 브랜치로 작업하는 경우 main/dev
등의 외우기 쉬운 부모 브랜치명만 기억하면 되므로 문제가 없습니다.
그런데 여러개의 브랜치를 사용하는 경우 작업중인 브랜치들의 이름을 기억하는건 쉽지 않더라구요.
특히 여러 브랜치를 사용하는 경우 git switch -c {branch_name}
형식으로 새로운 브랜치는 만들면 그만이라 문제가 없지만, 이전 브랜치를 찾으려면 "내가 어느 브랜치에서 작업하다 온거지?" 라는 생각을 해야하고, 실수로 브랜치를 엉뚱하게 이동하는 문제도 발생했습니다...
물론 git log
로 이전 브랜치를 볼 수도 있겠지만 간단한 방법을 통해 이전 브랜치로 이동해 봅시다.
git switch -
git은 편의를 위해 특수문자들에 기능을 제공합니다. 이번에 얻고 싶은, 이전 브랜치명은 -
을 사용하면 됩니다.
따라서 git switch -
은 이전 브랜치로 이동하는 커맨드가 됩니다..! -
도 사실 기존 편의를 위한 특수문자를 래핑한 것으로 @{-1}
의 줄임말입니다.
@
그럼 얘는 무엇일까요, @
는 사실 head
입니다. 우리가 사용한 @{-1}
은 헤드의 1번째 이전의 브랜치 의미가 되서 이전 브랜치로 이동할 수 있게 되는 겁니다. (@{1} 은 reflog 기준으로 이동하는 용도입니다.)
만약 쉘이나 .gitconfig
에 alias로 조금 더 줄이면 엄청나게 빠르게 브랜치를 앞뒤로 이동할 수 있게됩니다..!
# .zshrc
alias g='git'
# .gitconfig
[alias]
sw = switch
이런식으로 설정하면 g sw -
으로 브랜치를 왔다갔다 머리속의 컨텍스트에 저장할 필요없이 사용가능해지게 되버립니다..!
g sw -
에서 이동하는 이전 브랜치는 해당 브랜치의 부모 브랜치를 의미하지 않습니다! a -> b -> c
의 브랜치 구성에서 a
에서 c
로 이동했다면 c
브랜치에서의 g sw -
은 b
가 아니라 a
이므로 주의해야합니다!
개인적으로 하나의 작업을 여러 브랜치로 나누는 걸 선호하는 편이라 이걸 알고나서 매우 삶이 윤택해졌습니다.
하지만, 현실에서는 다른 문제가 생겼는데...
gh pr create
로컬에서 git만 사용하다면 g sw -
커맨드로 족했습니다. 하지만, GitHub에 여러개의 작업된 브랜치들을 PR로 만들어야합니다. Graphite 같은 툴로 쉽게 만들 수도 있지만, GitHub의 CLI로 직접하려면 어떻게 해야할까요?
GitHub은 CLI로 PR을 만들 수 있는 기능을 제공합니다. gh pr create --web
을 PR 만들고 싶은 브랜치에서 입력하면 GitHub의 웹 콘솔로 이동합니다..!
편한 기능이라 자주 사용하고 있지만 PR 작성시에 베이스 브랜치에서 문제가 생기게 됩니다.
만약 브랜치 a -> b -> c
순으로 작업을 했다고 치면, a
는 main
같이 원래 사용하는 베이스 브랜치여서 문제가 없지만, b
에서는 베이스 브랜치를 a
로 두어야 PR에서 파일에 변경점이 a
와 b
브랜치 사이에 것들만 보이기 때문에 설정이 필요합니다.
또한 웹 콘솔에서 베이스 브랜치를 설정하면, c
에서 작업한 경우 a
를 베이스 브랜치로 설정한다던지 실수할 가능성도 있기에 자동으로 CLI 상에서 설정하고 싶게 됩니다.
그러면 이전의 -
을 이용해서 이전 브랜치명을 사용할 수 있을까요?
❯ gh pr create -B -
Creating pull request for c into - in tolluset/config
-B
는 베이스 브랜치를 설정하는 옵션입니다. -
를 사용하게되면 이전 브랜치가 아니라 -
자체 베이스 브랜치로 설정됩니다...
그러면 어떻게 해야할까요? 사실 git은 이런 경우들을 위해 여러가지 기능들을 제공하고 있습니다. 그 중에 물론 이전 브랜치명을 가져오는 방법도 있습니다.
git rev-parse --abbrev-ref @{-1}
이라는 커맨드는 이전 브랜치의 이름을 가져옵니다.
rev-parse
: git의 여러가지 정보들을 가져오는 커맨드
--abbrev-ref
: 가져오려는 정보를 심플하게 줄여주는 옵션
@{-1}
: 이전 브랜치
위와 같은 조합으로 이전 브랜치의 이름을 가져올 수 있습니다.
❯ git rev-parse --abbrev-ref @{-1}
b
그러면 우리는 위의 커맨드를 이용해서 GitHub CLI로 PR을 만들기 전에 베이스 브랜치를 설정해주면 됩니다. 아래처럼요.
# .zshrc
alias gb='BASE=$(git rev-parse --abbrev-ref @{-1})'
alias ghpc='gb;gh pr create --web -a @me -B $BASE'
앞으로 ghpc
를 입력하게 되면 이전 브랜치를 기준으로 PR을 만들 수 있게 됩니다! (-a @me는 자기자신을 어사인 시킵니다. 꿀입니다.)
마무리
하지만... 이전 브랜치 이름은 부모 브랜치의 이름과 다를 수 있습니다. 제가 염려했던 베이스 브랜치 실수 문제는 여전히 발생할 수 있습니다.
현재까지는 거의 발생하지 않고 있고 만일에 대비해 한번씩 더 확인을 하고 있기는 합니다.
이전 브랜치명은 쉽게 가져올 수 있지만, 부모 브랜치는 약간의 고생이 첨가되어야하기 때문에 저는 이전 브랜치명으로 타협을 보았습니다. 작업시에 하나의 브랜치 만들고 PR 만들고 이런식이 되다보니 크게 문제가 없더라구요.
GitHub CLI에서 이전 부모 브랜치를 베이스 브랜치로 설정할 수 있는 옵션은 현재 없기 때문에 이렇게 사용하고 있지만, 추가가 되면 좀 더 편하게 사용할 수도 있겠네요. (컨트리뷰트 기회가 이렇게 또..)