Quick Reference
Fork는 Git 호스팅의 저장소 fork가 아니라 클라이언트이며, 파일·hunk를 나눠 커밋하고 공유 여부를 확인한 개인 브랜치에서만 rebase합니다.
| 하려는 일 | Fork에서 확인할 곳 | 실제 Git 결과 |
|---|---|---|
| 이번 커밋에 넣을 변경만 고르기 | Changes diff에서 파일 또는 hunk 선택 | 선택한 변경만 index에 들어갑니다. |
| 커밋 직전 내용을 다시 보기 | stage된 변경의 diff | 다음 커밋의 스냅샷을 확인합니다. |
| 다른 작업으로 전환하기 | 브랜치 목록에서 전환 | 작업 트리와 index가 대상 브랜치 상태로 바뀝니다. |
| 원격에 내 커밋 보내기 | Push | 로컬 브랜치의 커밋을 원격 브랜치에 전송합니다. |
| 아직 공유하지 않은 커밋 정리 | rebase 도구 | 새 커밋을 만들어 로컬 히스토리를 다시 씁니다. |
변경을 커밋 단위로 나누기
Fork의 diff 화면은 한 파일에 섞인 변경을 파일 또는 hunk 단위로 나누어 stage하기 좋습니다. 버그 수정과 이름 정리가 같은 파일에 섞였다면, 먼저 버그 수정 hunk만 stage해 커밋하고 남은 정리를 다음 커밋으로 분리합니다. 화면에서 선택한 범위가 다음 커밋의 내용이라는 점이 핵심입니다.
GUI에서 선택한 뒤에도 터미널로 결과를 확인할 수 있습니다. 두 화면은 별도 상태가 아니라 같은 저장소의 작업 트리와 index를 보고 있습니다.
git diff # 아직 stage하지 않은 변경
git diff --staged # Fork에서 선택한 다음 커밋 내용
git status --short # 파일별 현재 상태파일을 반으로 나눌 수 없는 구조라면 hunk를 억지로 쪼개기보다, 먼저 코드를 논리적인 변경으로 분리한 뒤 stage하는 편이 읽기 쉽고 되돌리기도 쉽습니다.
그래프와 히스토리 정리
그래프는 "어느 브랜치가 어디서 갈라졌고 어떤 커밋이 병합됐는가"를 읽는 도구입니다. 그래프가 복잡하다고 바로 rebase하지 말고, 먼저 현재 브랜치와 원격 추적 브랜치의 차이를 확인합니다. 작업 중인 브랜치가 이미 원격에 공유됐다면 팀의 히스토리 정책을 확인하기 전에는 rebase하지 않는 편이 안전합니다.
git log --oneline --decorate --graph -20
git status
git branch -vvFork에서 interactive rebase로 순서 변경, squash, fixup을 수행하면 기존 커밋 ID가 새 ID로 바뀝니다. 아직 push하지 않은 개인 브랜치에서 PR 전 WIP 커밋을 정리하는 용도에는 알맞지만, 다른 사람이 기반으로 삼은 브랜치에는 적용하지 않습니다.
주의할 점
Fork는 Git 호스팅 서비스에서 저장소를 복제하는 fork 기능이 아니라, macOS와 Windows에서 쓰는 Git 클라이언트 이름입니다. 원격 저장소의 fork, upstream 설정, Pull Request는 사용하는 호스팅 서비스의 정책과 화면에서 별도로 처리합니다. GUI의 rebase, force push, reset도 명령줄과 같은 Git 동작이므로 실행 전 대상 브랜치와 원격 반영 여부를 확인하세요.
참고 링크
3 sources