2년 정도 전에 master
브랜치의 의미에 대한 문제가 제기된 후에 GitHub이 main
으로 결정했기에 이젠 main
이 기본으로 자리 잡았다. 지금은 GitHub에서 새 저장소를 만들면 main
브랜치가 기본 브랜치로 생성이 된다. 그런데도 그 이전에 만든 저장소는 master
브랜치를 그대로 사용하고 있었다. 바꾼 저장소도 있고 관리 안 하다 보니 아직도 master
를 쓰고 있는 저장소도 있었는데 언제부터 제공했는지 GitHub에서 main
으로 쉽게 변경할 수 있게 기능을 제공하고 있다.
저장소의 Setting 아래 Branches 메뉴에 가면 현재 기본 브랜치를 변경할 수 있다.
main
혹은 원하는 브랜치 명을 입력하고 Rename branch
를 누르면 브랜치명이 변경된다.
변경된 후에는 브랜치의 상태를 확인할 수 있도록 https://github.com/<계정명>/<저장소명>/branches
주소로 이동한다. 여기서 전체 브랜치의 상황을 확인하면 되는데 보통은 큰 문제는 없을 것이다.
변경된 기본 브랜치 클론 받은 로컬 저장소에서도 변경하기
위 변경 방법을 설명하려던 것은 아니었고 이렇게 기본 브랜치가 변경되면 해당 브랜치를 로컬에 클론 받아놓은 사람들도 기본 브랜치를 변경해 주어야 하므로 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 pull
은 git fetch
와 git 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의 브랜치를 현재 브랜치(위 명령어에서는 생략했다)로 설정한 것이다. 즉, 새 기본 브랜치인 main
을 origin
이라는 리모트도 인식하도록 한 것이다. 이렇게 설정해 두면 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
으로 바꾸어야겠다. 협업이 많은 프로젝트는 안내해야 해서 바로 바꾸기 어렵지만 혼자 하는 사이드 프로젝트는 바로 바꾸면 될 것 같다.
Comments