티스토리 뷰

conflict(충돌)은 같은 파일을 다른 팀원들이 같이 수정했을 때, Git이 어떤 것을 원격 repo에 반영할거야? 하고 물어보는 것이다. 이런 '충돌'을 해결하기 위해서는 아래와 같은 작업방식이 필요하다. 

 

✅협업 프로젝트 3단계

  1. 누가 이 작업을 할 것인지 정한다. (이슈할당) - Issue
  2. 각자 맡은 것을 작업한다. - Branch
  3. 각자 작업을 프로젝트에 합칠 수 있게 공유한다. -merge 
    • (경우에 따라) 작업한 내용을 리뷰하고 최종적으로 프로젝트에 반영한다. - PR 후 merge 

프로젝트에서 issue는 프로젝트에서 해결해야하는 문제로 아래와 같은 것이 있다.

  • 버그(프로그램이 원하는 대로 작동하지 않는 것)를 신고(bug report)
  • 기능 추가 등의 프로젝트 개선 제안(enhancement) -> e.g.) Pull Request(제안사항)
  • 이슈(issue)란 위 문제들을 해결하기 위한 작업단위
프로젝트에서 이슈(issue)란 작업단위이자 해결해야하는 문제이다. 
issue는 내가 할 작업, 기능 추가, 버그 리포트 등 여러방식으로 사용할 수 있음

github에 첫 issue 생성해보기 

  • github홈페이지에 가서 내 원격 repo에 issue로 들어갑니다. 
  • create 버튼을 통해 issue를 작성해줍니다.

아래의 내용에 체크된 #1 은 issue들을 식별해주는 번호입니다. (커밋 메세지에 이슈 번호를 포함해서 알려줄 수 있다.)

Assignees 는 작성자를 뜻하고 Labels는 해당 issue에 대한 정보를 담은 태그입니다. 

🐱‍👤 Label의 태그 명들은 선택창에서 상세 내용을 확인할 수 있습니다. 내가 하는 작업과 관련된 태그를 골라주시면 됩니다. 예시로 enhancement 태그는 new feature or request 라는 상세 내용을 포함합니다. 

 

-> 만들어진 이슈의 오른쪽 하단에 있는 close issue 버튼을 누르면 이슈가 닫힙니다. 

즉, 더 이상 필요하지 않거나 해결된 이슈일 경우 close issue버튼을 눌러주면 됩니다. (필요하게 되면 다시 open해줄 수 있음 - reopen issue버튼 클릭)

 

✔ issue와 관련된 commit 만들기 

1. issue내용에 관련된 파일을 수정하고 sourcetree를 통해 commit할 때, commit message칸에 커밋 내용과 함께 이슈 번호를 같이 적어준다. 

이슈 커밋 메세지 예시임 아래 내용과 다르다고 쫄지 말기

2. 이 다음 github홈페이지 내 원격 repo의 해당 issue(#1)를 클릭해보면 아래와 같이 자동으로 반영된 것을 확인할 수 있다. 


✔ 각자 공간에서 작업하기 - Branch

  1. issue와 브랜치 만들기(내가 어떤 작업 하는지 이슈 먼저 등록해야 함)
  2. 이슈를 등록했다면 sourcetree로 새 브랜치를 만들어줍니다

새 브랜치는 가장 상단의 브랜치에서 우클릭 후, 브랜치 클릭 (위치는 꼭 가장 상단의 브랜치가 아니여도 됩니다만 대충 내가 이 브랜치로부터 갈라져 나올거야! 라는 의미입니다. 새로 생긴 브랜치의 시작점은 기본적으로 갈라져나온 브랜치(예시에서 main)의 최신 commit 부터 입니다.)

  • 새 브랜치 명은 팀내규칙을 따르지만 통상적으로 새 기능을 만들 때는 feature/이슈번호_기능명 으로 아래와 같이 작명해준다. 

  • 왼쪽의 브랜치 구조를 보면 2_jjigae라는 새 브랜치가 생성된 것을 확인할 수 있다. 그리고 현재는 2_jjigae에 체크아웃되어있다. main브랜치로 넘어가고 싶다면 왼쪽 브랜치에서 선택하여 눌러주면 된다.
 *현재 작업할 브랜치를 선택하는 것체크아웃이라고 한다. 
현재 내가 체크아웃되어 있는 브랜치는 왼쪽에 빈 동그라미 표시로 확인할 수 있다.

브랜치를 삭제하는 방법 

테스트해보기 위해서 main브랜치로 체크아웃 해준 뒤 새 브랜치(delete_test)를 만들어줍니다. 

*원래 작업하던 feature/2_jjigae 에서 main브랜치로 체크아웃해주세요

-> 새 브랜치를 만들면 자동으로 해당 브랜치로 체크아웃됩니다. 그러면 저는 이제 delete_test에 체크아웃된 상태겠네요. 

🐱‍👤브랜치 삭제 -> 해당 브랜치의 커밋내역이 모두 날아가게 됩니다.
*커밋 내역이 날아간다는 것은 파일이 수정된 내역이 전부 없어진다는 것이다. 
❗주의) 어떤 브랜치를 삭제하기 위해서는 다른 브랜치로 일단 체크아웃한 상태에서 삭제가 가능하다.

어차피 삭제될 브랜치이므로 jeon파일의 내용을 변경한 뒤 커밋해줍니다. 

위와 같이 main 브랜치로 체크아웃한 뒤에 delete_test 브랜치를 우클릭 -> delete_test 삭제 를 눌러줍니다. 

 

강제 삭제에 체크해준 뒤 삭제하면 히스토리에서도 완전히 사라지게 된다. 


✔ 작업 내용 합치기 - Merge(병합)

🐱‍👤merge에 들어가기 이전에...
커밋하고 작업하는 방법들을 플로우라고 부르는데 대표적으로 github-flow, gitlab-flow, git-flow가 있다.
웹의 경우는 github-flow를 많이 쓴다. 자세한 내용은 아래 링크를 통해 확인 가능
관련 링크: https://ujuc.github.io/2015/12/16/git-flow-github-flow-gitlab-flow/ (3가지 flow) 
https://pepega.tistory.com/35 (깃헙 플로우)

 

Merge가 무엇인가요?

- Merge(병합)는 브랜치를 다른 브랜치에 합치는 것이다. 즉, 특정 브랜치의 commit들을 다른 브랜치의 commit 내역에 모두 반영하는 것이다. 기본적인 설정은 해당 브랜치의 모든 commit을 모두 다 반영한다고 생각하면 된다.

 

sourcetree로 병합하기

  1. 병합하려는 브랜치로 이동합니다. (feature/2_jjigae에 체크아웃되어있고 main에 병합하고 싶다면 main으로 체크아웃해야겠죠?)
  2. 상단에 병합(merge)를 눌러줍니다. 
    • 아래와 같은 화면에서 합칠 브랜치를 체크해줍니다. feature/2_jjjigae 가 표시된 부분을 선택하면 해당 브랜치의 이전 commit들이 전부 포함됩니다. 
    • 하단의 옵션에서 3개를 체크해줍니다. 

머지가 완성된 모습입니다.

🐱‍👤사진을 보면 main이 두 개 존재하는데 main 브랜치가 두 개인 것이 아니라 
origin/main의 경우 원격 repo의 main을 나타냅니다
+ main 옆에 3 표시는 원격 repo와 내 로컬 repo commit이 얼마나 차이나는 지 알려주는 것이다.

여담) 머지 성공 시 해당 내역을 확인할 수 있는데 Merge branch 'feature/2_jjjigae' (into main) 라는 브랜치명을 확인할 수 있다. 

실습 예제에서는 into main이 보이는데 내 sourcetree에서는 생략된 채로 됐길래 오류인 줄 알았다.

->아무래도 이미 merge를 할 때는 머지할 곳으로 체크아웃을 하기 때문에 into 브랜치가 생략되나 보다.

 

마지막으로 브랜치 병합을 성공했으면 만들어놨던 feature/브랜치명 에 해당하는 브랜치들을 main 브랜치로 체크아웃한 뒤 삭제해준다. 

Merge(병합)시 주의사항

🐱‍👤작업이 완료된 브랜치는 삭제해준다. 
why? 만약에 이미 작업이 완료된 브랜치에 실수로 체크아웃한 경우 작업 내역이 복잡해지기 때문이다. 
브랜치를 임시적인 작업 공간으로 생각하면 된다.

🐱‍👤각각의 브랜치마다 꼭 다른 파일을 수정해야 한다. 같은 파일을 수정할 경우, merge conflict가 발생한다.

 

 

 

댓글