Git 협업하기

1. 팀원들이 작성한 파일을 우선 확인할까요: git pull

협업하고 있는 팀원들의 파일을 나의 Local에서 업데이트 하지 않고 제꺼만 작성해서 push하면 당연하게도 충돌이 발생합니다. 참고로 처음 push하는 경우에는 무조건 pull을 하라고 git에서 알려줍니다. 그 후에는 상황에 따라 충돌(conflict)이 발생합니다. 제 생각에는 confilct를 항상 피할 방법은 없다고 생각합니다. 하지만 confilct를 해결하는 방법은 간단하기 때문에 confilct가 발생하는 것을 걱정할 필요는 없다고 생각합니다. 여기서 말씀드리고 싶은 것은 팀원들과 협업을 하고 있다면 항상 pull을 먼저하시고 push하는 것을 권장드립니다.
confilct가 발생했을 때 어떻게 해결하는 지는 ‘3. 충돌은 피할 수 없습니다’에서 살펴보겠습니다.

2. 저만의 공간이 필요해요: git branch, git checkout

팀원들과 하나의 프로젝트를 수행할 때, 팀원들이 모두 main 브랜치에서 작업을 한다면 어떨까요? 제 생각엔 아무리 pull 하고 push를 해도 confilct를 피하기 어려울 것 같습니다. 또한 개별적으로 작업 중인 부분만 버전 관리를 할 수 없을 것입니다. (main브랜치 하나에서 모든 모듈의 코드가 수정된다면 pull할 때마다 모든 모듈의 코드가 바뀌기 때문) 이러한 상황에서 만약 잘못 작성된 코드를 push했다면 어떨까요. 팀원들이 아직 pull을 하지 않았기를 기도해야 합니다. 만약 팀원들이 이미 pull했다면 모두 연락해서 어떤 부분이 잘못 되었으니 pull할 때 어떤 부분을 지워달라고 해야합니다. 또한 특정 커밋으로 되돌아가고 싶어도 함부로 돌아갈 수가 없습니다. 이것만으로도 뭔가 branch를 이용해 개별 공간에서 서로 작업을 하고 어느 정도 완료가 되면 main에 merge하는 것이 훨씬 좋을 것 같습니다.

계산기 모듈을 만든다고 했을 때, 두 명이 각각 add, multiply 브랜치를 만들어 main에서 merge해보도록 하겠습니다.

1) main branch에서 뼈대 생성

# main branch에서
# calculator.py
class Calculator:
  def __init__(self, x, y):
    self.x = x
    self.y = y

2) add branch 생성 후 add function 작성

# add branch 생성
git branch add

# add branch쪽으로 HEAD이동 시키기
git checkout add
# add branch에서
# calculator.py
class Calculator:
  def __init__(self, x, y):
    self.x = x
    self.y = y
  
  def add(self):
    return self.x + self.y
git add .
git commit -m "add function 추가"

3) multiply branch 생성 후 multiply function 작성

현재 HEAD는 add branch에 있습니다. 여기서 새로운 branch를 생성하면 add function도 함께 보이게 되는데, 저희는 add function과 multiply function을 서로 독립적인 branch에서 진행할 예정이므로 우선 HEAD를 다시 main으로 되돌립니다.

git checkout main

git branch multiply

git checkout multiply
# multiply branch에서
# calculator.py
class Calculator:
  def __init__(self, x, y):
    self.x = x
    self.y = y
  
  def multiply(self):
    return self.x * self.y
git add .
git commit -m "multiply function 추가"

add branch와 multiply branch에서 각각 함수를 추가했습니다. 이제 두 팀 모두 각자의 branch에서 만든 함수를 main branch로 merge하길 원합니다.

git checkout main
git merge add

이렇게 하면 add branch는 main branch에서 add 함수만 추가한 것이므로 merge했을 때, 그냥 add branch의 마지막 commit으로 이동하게 됩니다. 이제 multiply branch도 main branch에 merge해 보겠습니다.

git merge multiply

여기서 merge confilct가 발생하게 됩니다.

3. 충돌은 피할 수 없습니다: git merge

협업을 하면서 충돌이 생기지 않도록 노력하는 것보다 충돌이 났을 때 고쳐주는 것이 훨씬 낫습니다. 왜냐하면 충돌을 해결하는 것은 생각보다 정말 간단하기 때문입니다. 그냥 충돌이 난 부분을 원하는 방향으로 고쳐주면 됩니다.

그리고 Merge confilct를 commit해주면 두 branch가 하나의 main branch에 모두 merge되게 됩니다.

4. 통째로 가져가서 좀 하도록 하겠습니다: git fork

대규모 프로젝트를 진행한다고 해보겠습니다. 다수의 팀원들이 다수의 브랜치를 만들면 관리하기가 쉽지 않습니다. 또한 오픈 소스 패키지에서 사용자들이 패키지에 기여하기 위해 모두 collaborater권한을 부여 받을 수는 없습니다. 그래서 fork하여 Github에 있는 저장소를 나의 Github 저장소에 fork하고 편하게 수정을 한 뒤, 내가 수정한 코드를 Pull request를 이용해 merge를 요청할 수 있습니다.

5. 혹시 맘에 드시면 합쳐주실 수 있을까요: Pull request

🔔 내가 생각하는 HEAD의 역할
아직 git을 적극적으로 이용하고 있지는 않지만, 제가 생각 했을 때 HEAD의 역할은 내가 원하는 커밋 또는 브랜치를 나타내는 역할을 한다고 생각합니다. 내가 돌아가고 싶은 커밋, 내가 이동하고 싶은 브랜치, 분기하기 전 내가 기준으로 삼고 싶은 커밋, 내가 merge할 때 기준으로 하고 싶은 브랜치와 같은 상황에서 해당 커밋 또는 브랜치로 이동하는 것이 중요합니다. 그리고 이 때 사용하는 명령어가 git checkout입니다

git checkout [브랜치 이름]
git checkout [커밋id]

Tags:

Categories:

Updated: