협업을 시작하고 나서야 깨달았다.
git은 단순한 '코드 백업 도구'가 아니구나!
여러 명이 동시에 같은 프로젝트를 수정하다 보면, 내가 알던 단순한 명령어로는 해결할 수 없는 복잡한 상황들이 계속 발생한다.
특히 다른 팀원이 먼저 push한 파일을 나 또한 push하려고 하면
라는 무서운 메시지가 뜨고, 원격 저장소의 변경사항을 어떻게 처리해야 할지 막막해진다.
이때 필요한 것이 바로 merge, rebase, fetch, pull 같은 명령어들이다.
팀 프로젝트에서 각자의 브랜치에서 작업을 마치고 main 브랜치에 합치려고 할 때, 두 가지 선택지가 있다.
merge는 두 브랜치의 작업 내용을 하나로 합치면서, 각 브랜치의 커밋 히스토리를 모두 그대로 유지한다.
마치 두 개의 강물이 합쳐져서 하나의 큰 강이 되는 것과 같다.
git checkout main
git merge feature-branch
이렇게 하면 새로운 merge commit이 생성되면서 두 브랜치의 작업이 하나로 합쳐진다. 커밋 히스토리를 보면 브랜치가 언제 갈라졌고 언제 합쳐졌는지 명확하게 볼 수 있다.
언제 사용할까?
히스토리가 모두 남아있고, 안전하다. 대신 커밋 히스토리가 복잡하다!
rebase는 한 브랜치의 커밋들을 다른 브랜치의 끝에 차례대로 재배치한다. 마치 퍼즐 조각을 다시 정렬하는 것처럼, 커밋들이 시간순으로 일직선상에 배치된다.
git checkout feature-branch
git rebase main
이렇게 하면 feature-branch의 커밋들이 main의 최신 커밋 뒤에 순서대로 붙게 된다. 결과적으로 히스토리가 매우 깔끔하고 직관적으로 보인다.
언제 사용할까?
주의사항!!!
이미 push한 브랜치에서 rebase를 사용하면 다른 팀원들에게 문제가 될 수 있다....
-> 팀원분이 프로젝트에선 사용하지 않는게 좋다는 의견을 주셨다.
로컬 작업 브랜치에서만 사용 추천!
push가 rejected되는 가장 대표적인 원인은, 내가 push하려 한 파일을 다른 사람이 이미 수정해 올렸을 때이다. 이를 피하려면 원격 저장소의 파일을 적절하게 가져와 반영하는데 필요한데, 이때 그 변경사항을 어떻게 가져올지 결정해야 한다.
fetch는 원격 저장소의 최신 정보를 가져오되, 내 로컬 브랜치에는 바로 적용하지 않는 명령어다.
git fetch origin
git log origin/main # 원격의 변경사항 확인
git diff main origin/main # 차이점 비교
이렇게 하면 원격에서 무엇이 바뀌었는지 미리 확인한 후, 필요하다면 merge나 rebase로 직접 통합할 수 있다.
언제 사용할까?
pull은 fetch와 merge(또는 rebase)를 한 번에 수행한다. 원격의 변경사항을 가져와서 현재 브랜치에 !!바로!! 적용한다.
git pull origin main # fetch + merge
git pull --rebase origin main # fetch + rebase
빠르고 간편하지만, 예상치 못한 충돌이나 문제가 발생할 수 있다.
언제 사용할까?
처음 협업을 시작할 때는 이런 흐름으로 작업하는 것을 추천한다.
git fetch로 원격 상태 확인git rebase main으로 최신 상태 유지git merge로 안전하게 main에 통합혹은, 팀 내에서 합의 후 한가지 방법을 정해서 사용하는게 좋다.
git을 잘 활용하면 혼자 작업할 때보다 오히려 더 체계적이고 안전하게 코드를 관리할 수 있다. 처음에는 복잡해 보이지만, 각 명령어의 목적을 이해하고 상황에 맞게 사용하다 보면 자연스럽게 익숙해진다. 힘내자!