Team Project (2020-2021)/SeNaJooNa

6. 팀플에서 깃허브 사용법 및 회의 내용(2021.02.08~2021.02.14)

Leenk 2021. 2. 9. 16:58

시작

팀플을 진행하고 해커톤을 기점으로 본격 개발을 시작하면서 Git-Flow를 사용해보자는 의견이 나왔다.

 

우린 Git-flow를 사용하고 있어요 - 우아한형제들 기술 블로그

안녕하세요. 우아한형제들 배민프론트개발팀에서 안드로이드 앱 개발을 하고 있는 나동호입니다.오늘은 저희 안드로이드 파트에서 사용하고 있는 Git 브랜치 전략을 소개하려고 합니다. ‘배달

woowabros.github.io

결론부터 말하자면 실패했다. 팀원들 모두 깃허브를 사용한 적은 있지만 1) 내가 원하는 행동을 하기 위해선 어떻게 해야하는지 2) 내가 입력한 명령어가 무슨 일을 하는지를 명확하게 알고 있지는 않았다. 한 기능을 여러 명이 구현하다 보니 나중에 합칠 때는 Conflict를 해결하는 것도 많은 시간이 걸렸다. 그래서 지난 월요일 회의 시간에 해커톤 기간 동안의 커밋 기록을 살피며 파일 수정/브랜치 생성/브랜치 병합을 차근히 시도했다. 밑에서 그 내용을 정리하고자 한다.

* 깃허브 전문가가 아닌, 팀플을 하면서 힘들었던 부분과 궁금했던 부분을 정리하고 아주 간단한 사용법을 정리한 것이니 깃허브 잘알들의 수정은 언제나 환영입니다


1. 변경 후 push를 하려는 브랜치에 새로운 commit이 생겼을 때

A상태에서 pull을 받아와서 작업을 완료하여 git push를 하려는데 다른 사람이 이미 commit을 하여 B상태가 되었을 때를 의미한다. 이 때 push를 시도하면 에러가 발생한다. push 전에 git pull 로 현재 원격지의 변경 이력을 가져오면 되지만, 만약 다른사람이 수정한 부분과 본인이 수정한 부분이 동일하면 conflict가 발생한다.

  • git pull origin branch명
<<<<<<< HEAD
This is B //내가 수정한 코드
=======
This is A-1 //다른 사람이 수정한 후 repository에 올린 코드
>>>>>>> ~~~~~~~
  • git pull로 변경이력을 가져왔는데 충돌이 발생한 경우, 코드에 위와 같은 형태가 나타난다. 필요한 부분을 살려 수정한 뒤 <<<<, =====, >>>> 부분을 지워주면 push가 가능해진다. 

 

1-2. git pull을 시도했는데 에러가 발생했을 때

본인이 가장 많이 겪은 에러인데 보통 다음과 같은 메시지가 나온다. 코드를 수정하던 중에 다른 팀원이 코드를 수정해서 올리면 중간에 pull을 받아와야했는데 그 때 이 에러가 많이 발생했다.

error: Your local changes to the following files would be overwritten by merge:
Please, commit your changes or stash them before you can merge

참고로 git pull에러가 없을 때도 사용 가능하다. 1-1)의 상황을 git pull한 뒤->conflict가 발생한 부분 수정->push(위의 경우)로 해결해도 상관 없지만 다음과 같이 명령어를 입력한 후 코드를 수정한 뒤 push하여 해결 할 수 있다. 또는 이 곳에서도 stash없이 commit후 conflict를 수정하여 해결할 수도 있다. 밑은 stash를 이용하는 방법이다.

  • git stash : 내 변경 사항을 스택에 저장
  • git pull origin 브랜치명 : 원격지의 변경이력을 로컬에 반영(원격 리포지토리의 변경된 코드가 내 코드에 반영됨)
  • git stash pop : 스택에 저장된 내 변경 사항 불러오기
<<<<<<< Updated upstream
This is B //repository에서 불러온 코드
=======
This is A-1 //git stash로 stack에 저장했던 내가 수정한 코드
>>>>>>> Stashed changes

코드가 위와 같이 수정되는데 이 때도 필요한 코드를 살리고 작업을 마저 하면 된다. 작업 중에 브랜치를 옮겨야하는데 commit이 불가능한 상황(기능이 완성 안 됨)이 생겼을 때도 요긴하게 쓰인다.

 

2. 특정 브랜치에서 또 다른 브랜치 생성할 때

해커톤 기간의 커밋 이력을 보면 작업 중이던 브랜치에서 다른 브랜치가 생성된 것도 있지만, 아예 새로 생긴 브랜치도 있어 흐름을 파악하는 데 어려움이 있었다. 이는 git pull 없이 각자의 로컬에서 브랜치를 생성한 후 리포지토리에 push하여 발생한 문제였다. develop브랜치(main이 아닌)에서 브랜치를 생성하고 싶을 때에는 다음과 같은 방식으로 하면 된다.

 2-1)깃허브 웹 : devalop에서 나가는 브랜치를 만들고 싶다면 develop에 있는 상태에서 원하는 브랜치명을 입력함.

 

 2-2)Git Bash : 원하는 브랜치에 있는 상태에서(develop에서) 'git branch 브랜치명'을 입력하면 마찬 가지로 develop에서 뻗어나가는 브랜치가 생성됨.

//develop에 있는 상태에서
git branch 브랜치명
git checkout 브랜치명

 

3. 작업 완료 후 브랜치를 병합할 때

A브랜치의 내용을 develop으로 병합하고 싶다면 다음과 같이 명령어를 입력하면 된다.

git checkout develop
//develop브랜치에 있는 상태
--------------------------------------------------
3-1)
git merge A
3-2)
git merge --no--ff A //A의 커밋 이력을 남기고 싶을 때

단, 3-1의 경우 만약 develop브랜치에 A브랜치가 생긴 시점 이후로 develop브랜치에서 커밋이 이루어지지 않았다면, A브랜치의 변경 이력이 develop브랜치로 합쳐지게 된다. 아래 그림의 오른쪽 부분과 같다. 왼쪽 그림과 같이 변경이력을 따로 유지하고 싶다면 3-2)처럼 git merge --no--ff 브랜치명을 입력하면 된다.

* merge를 할 때도 같은 부분이 변경되어 있으면 conflict가 발생한다. 1번에서 했던 것처럼 에디터를 열어 코드를 정리한 뒤 git add 후 commit 하면 된다.


2021.02.12 회의 내용

1. 주제는 그대로, 기술 스택 바꾸기(웹으로)

2. node.js + react.js로 개발, GCP와 mysql사용

3. 카카오 로그인 연동(그 외의 api는 진행하면서 결정)

4. 사용 프레임워크, 라이브러리와 관련하여 인프런 강의 및 유튜브 강의 듣기