브랜치·PR

main은 공유본으로 두고, 작업은 브랜치와 Pull Request로 넣습니다.

왜 브랜치인가

main에 바로 커밋하면, 끝나지 않은 수정이 곧 공유본이 됩니다. 브랜치는 그 수정을 이름 있는 줄기로 분리합니다. 잘못돼도 브랜치만 버리고 main은 남습니다.

이름은 하는 일이 보이게 짓습니다. docs/github-guide, fix/nav-label처럼 종류와 내용을 슬래시로 나눕니다.

브랜치를 만들고 올리기

시작 전에 main을 원격과 맞춥니다. git switch -c는 브랜치를 만들면서 그쪽으로 이동합니다.

git switch main
git pull
git switch -c docs/github-guide

파일을 고친 뒤 커밋하고, 그 브랜치 이름으로 처음 올립니다. -u는 다음부터 git push, git pull만으로 이 원격 브랜치와 연결되게 합니다.

git add README.md
git commit -m "GitHub 학습 링크 추가"
git push -u origin docs/github-guide

지금 브랜치와 목록은 이렇게 봅니다. 별이 붙은 줄이 현재 브랜치입니다.

git branch
git status

Pull Request 열기

  1. GitHub 저장소로 갑니다. 방금 push한 브랜치에 Compare & pull request 배너가 보입니다. 없으면 Pull requests 탭에서 New pull request를 누릅니다.
  2. base는 main, compare는 docs/github-guide인지 확인합니다. 방향이 반대면 main을 작업 브랜치에 넣는 요청이 됩니다.
  3. 제목은 커밋 메시지를 다듬어 씁니다. 본문에는 무엇을, 왜 바꿨는지 적습니다.
  4. Files changed에서 차이만 훑습니다. 의도하지 않은 파일이 있으면 머지하지 않고 브랜치에 커밋을 더합니다.
  5. Create pull request를 누릅니다.

혼자 연습이면 스스로 Review를 생략하고 Merge pull request를 눌러도 됩니다. 팀에서는 다른 사람이 승인하기 전에는 머지하지 않는 규칙을 저장소에 둘 수 있습니다.

머지한 뒤 로컬 정리

GitHub에서 머지가 끝나면, 내 컴퓨터의 main은 아직 옛 커밋을 가리킵니다. 받아서 맞춥니다.

git switch main
git pull
git branch -d docs/github-guide

git branch -d는 이미 합쳐진 로컬 브랜치만 지웁니다. 합쳐지지 않았으면 멈추므로, 실수로 작업을 지우지 않습니다. GitHub의 원격 브랜치는 PR 화면의 Delete branch로 지웁니다.

같은 줄을 서로 고쳤을 때

git pull이나 PR이 충돌을 말하면, 파일 안에 아래 표시가 들어갑니다. Git이 어느 쪽을 남길지 정하지 못한 구간입니다.

<<<<<<< HEAD
현재 브랜치의 문장
=======
받아 온 쪽의 문장
>>>>>>> docs/github-guide
  1. 표시 세 줄(<<<<<<<, =======, >>>>>>>)을 지웁니다.
  2. 남겨야 할 문장만 파일에 남깁니다. 둘 다 필요하면 둘 다 남기되, 표시는 남기지 않습니다.
  3. 저장한 뒤 그 파일을 커밋합니다.
git add README.md
git commit -m "README 충돌 해결"

PR 안의 충돌이면 이 커밋을 같은 브랜치에 push합니다. PR 페이지의 충돌 표시가 사라집니다.

하지 않을 것

  • main에 git push --force를 하지 않습니다. 이미 받아 간 커밋을 지웁니다.
  • 끝나지 않은 실험을 main에 바로 push하지 않습니다. 브랜치를 엽니다.
  • PR의 base와 compare를 확인하지 않고 머지하지 않습니다.