Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub에서 기본 브랜치 변경하는 명령어 살펴보기

2년 정도 전에 master 브랜치의 의미에 대한 문제가 제기된 후에 GitHub이 main으로 결정했기에 이젠 main이 기본으로 자리 잡았다. 지금은 GitHub에서 새 저장소를 만들면 main 브랜치가 기본 브랜치로 생성이 된다. 그런데도 그 이전에 만든 저장소는 master 브랜치를 그대로 사용하고 있었다. 바꾼 저장소도 있고 관리 안 하다 보니 아직도 master를 쓰고 있는 저장소도 있었는데 언제부터 제공했는지 GitHub에서 main으로 쉽게 변경할 수 있게 기능을 제공하고 있다.

GitHub의 브랜치 설정

저장소의 Setting 아래 Branches 메뉴에 가면 현재 기본 브랜치를 변경할 수 있다.

GitHub의 브랜치 변경 화면

main 혹은 원하는 브랜치 명을 입력하고 Rename branch를 누르면 브랜치명이 변경된다.

GitHub의 브랜치 목록 화면

변경된 후에는 브랜치의 상태를 확인할 수 있도록 https://github.com/<계정명>/<저장소명>/branches 주소로 이동한다. 여기서 전체 브랜치의 상황을 확인하면 되는데 보통은 큰 문제는 없을 것이다.

변경된 기본 브랜치 클론 받은 로컬 저장소에서도 변경하기

위 변경 방법을 설명하려던 것은 아니었고 이렇게 기본 브랜치가 변경되면 해당 브랜치를 로컬에 클론 받아놓은 사람들도 기본 브랜치를 변경해 주어야 하므로 GitHub에서 아래처럼 친절한 안내가 나온다.

GitHub의 브랜치 변경 명령어 언내

로컬에서 이 명령어를 따라 입력하면 변경된 기본 브랜치에 맞게 로컬 설정도 업데이트할 수 있는데 main으로 변경했다면 명령어는 다음과 같이 된다.

git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a

그냥 따라 해도 되지만 항상 쓰던 명령어만 써서 각 명령어의 의미를 한번 살펴봤다.

git branch -m master main

$ git branch -a
* master
  remotes/origin/master

$ git branch -m master main

git-branch 문서를 보면 -m/--move는 브랜치를 이동하거나 이름을 바꾸는 명령어로 관련된 설정과 reflog도 함께 변경해준다.-M--move --force의 숏컷이다. 그래서 git branch -m master main는 로컬에 존재하던 master 브랜치를 main으로 바꿔서 이전에 master로 사용하던 걸 그대로 쓸 수 있게 해준다.

$ git branch -a
* main
  remotes/origin/master

그래서 브랜치를 확인해 보면 원격 브랜치는(여기서는 remote의 이름이 origin) remotes/origin/master로 남아있고 master 브랜치는 main으로 바뀐걸 볼 수 있다.

git fetch origin

$ git fetch origin
github.com:outsideris/github-page-switcher URL에서
 * [새로운 브랜치]   main       -> origin/main

git fetch origin원격 저장소의 내용을 로컬로 가져오는 명령어다. git pull을 주로 쓰면 git fetch에 익숙하지 않을 수도 있지만 git pullgit fetchgit merge가 합쳐진 명령어이다. 여기서는 GitHub에서 master 브랜치를 main을 바꾸었지만, 로컬에서는 바뀌었다는 것을 모르고 있으므로 git fetch로 리모트 브랜치를 업데이트한 것이다.

다음과 같이 브랜치를 다시 확인해 보면 remotes/origin/main이 생긴 것을 볼 수 있다.

$ git branch -a
* main
  remotes/origin/main
  remotes/origin/master


git branch -u origin/main main

$ git branch -u origin/main main
branch 'main' set up to track 'origin/main'.

이 명령어를 실행하면 main 브랜치가 origin/main을 추적하도록 설정되었다고 안내가 나온다. -u <upstream>/--set-upstream-to=<upstream> 명령어는 브랜치의 트래킹 정보를 설정해서 <upstream>이 해당 브랜치의 업스트림이 되도록 한다. 이렇게 설정하면 git fetch로 원격 브랜치를 업데이트했을 때 위처럼 로컬 브랜치가 원격 브랜치와 어느 정도 커밋 차이가 있는지 쉽게 볼 수 있고 push/pull을 할 때도 타켓 브랜치를 지정하지 않아도 원격 추적 브랜치를 알아서 사용한다.

그 예시로 업스트림을 추적하기 전에는 브랜치를 좀 더 상세하게 보면 아래처럼 나온다.

$ git branch -vv
* main 7d61fec commit message 1

하지만 origin/main을 추적하면 브랜치를 살펴볼 때 리모트 브랜치와 커밋이 어느 정도의 차이가 있는지까지 표시된다.

$ git branch -vv
* main 7d61fec [origin/main: 1개 앞] commit message 1


git remote set-head origin -a

$ git remote set-head origin -a
origin/HEAD set to main

git remote set-head 명령어는 remote의 기본 브랜치를 설정하거나 삭제하는 명령어이다. 그래서 git remote set-head origin 명령어는 origin remote의 브랜치를 현재 브랜치(위 명령어에서는 생략했다)로 설정한 것이다. 즉, 새 기본 브랜치인 mainorigin이라는 리모트도 인식하도록 한 것이다. 이렇게 설정해 두면 origin/main이라고 지정해야 하는 곳에서 origin만 지정해도 된다. -a/--auto 옵션은 remote가 HEAD를 결정하기 위해 자동으로 쿼리하고(여기서는 main을 찾아낸다) 설정하는 브랜치에 refs/remotes/origin/HEAD를 설정한다.

그래서 HEAD를 설정하기 전에는 아래처럼 히스토리를 조회했을 때 origin에는 HEAD가 표시되지 않는다.

$ git log --all --graph --oneline -3
* 7d61fec  (HEAD -> main) commit message 1
* cae2da1  (origin/master, origin/main) commit message 2
* f6dc244  commit message 3

HEAD를 설정하고 나면 origin/HEAD가 설정되어 표시되는 것을 확인할 수 있다.

$ git log --all --graph --oneline -3
* 7d61fec  (HEAD -> main) commit message 1
* cae2da1  (origin/master, origin/main, origin/HEAD) commit message 2
* f6dc244  commit message 3

또한 HEAD를 설정하면refs/remotes/origin/HEAD라는 심볼릭 레퍼런스를 생성하기 때문에 아래처럼 확인할 수 없다. 생성하기 전에는fatal: ref refs/remotes/origin/HEAD is not a symbolic ref`같은 오류가 나오게 된다.

$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/main

귀찮음에 기존 브랜치는 master로 놔두고 있었는데 이제 눈에 띄는 대로 main으로 바꾸어야겠다. 협업이 많은 프로젝트는 안내해야 해서 바로 바꾸기 어렵지만 혼자 하는 사이드 프로젝트는 바로 바꾸면 될 것 같다.

2022/05/26 04:42 2022/05/26 04:42