본문 바로가기
Git&GitHub

[Git & GitHub] Branch와 Merge 과정

by dong_seok 2024. 2. 26.
1. Branch 개념
2. Clone 및 Merge 과정
3. reset, revert 사용
4. git name, email 변경

 

오늘은 원격 저장소의 모든 내용을 Clone을 통해 가져와 특정 Branch의 내용을 수정하고 Merge하는 과정에 대해 말씀드리겠습니다.

 

1. Branch 개념

일련의 과정들을 말하기에 앞서 Branch란 무엇인지, 왜 사용해야 하는지 간단하게 말씀드리고 넘어가도록 하겠습니다.

Branch란 "동일한 소스 코드에서 파생된 독립적인 개발 라인" 이라고 말할 수 있습니다. 여기서 중요한 포인트는 "독립적인" 이라는 키워드입니다. 보통 프로젝트를 진행하게 되면 여러 명이 함께 작업을 진행하게 되는데, 이때 각 개발자는 자신이 생성한 브랜치에서 작업을 수행하고, 이후 변경 사항을 메인 브랜치에 병합합니다. 이렇게 함으로써 충돌을 최소화하고 작업의 효율성을 높일 수 있습니다. 만약 모두가 하나의 메인 브랜치에서 작업을 진행한다면, 서로의 작업이 충돌할 가능성이 높아지며, 작업의 관리와 협업이 복잡해집니다. 따라서 브랜치를 통해 작업을 분리하고 관리함으로써 프로젝트의 효율성을 높일 수 있습니다.

 

현재 Branch 확인 명령어

 

git branch (-a) // -a 는 로컬뿐만 아니라 원격 저장소의 Branch까지 모두 보여줌

 

2. Clone 및 Merge 과정

처음에는 "내가 작업할 브랜치만 가져와서 수정한 뒤 다시 커밋하자"는 생각이 들었습니다. 그러나 이 방법은 상당히 비효율적이었습니다. 왜냐하면 각각의 브랜치에서 작업한 내용은 결국 메인 브랜치에 병합되어야 했기 때문입니다. 그래서 결국 전체 저장소를 한 번에 클론하여 가져오기로 했습니다.

 

clone 명령어

 

git clone "리포지토리 주소"

 

처음 git clone을 하고 브랜치를 확인해보면 메인 브랜치만 보일 것입니다. 하지만 브랜치를 이동하면 그 이후부터는 다른 브랜치들도 같이 보이는 것을 확인할 수 있습니다.

 

브랜치 이동 명령어

 

git checkout <branch 이름>

 

이렇게 브랜치를 이동하면 작업 공간이 그에 맞게 변경됨을 확인할 수 있습니다. 이후 브랜치를 이동하여 내용을 수정한 후 Merge를 진행하였습니다. Merges는 마지막 commit된 내용을 기준으로 진행되기때문에 작업하던 브랜치에서 미리 commit을 진행하였습니다. Merge를 하기 위해서는 병합 될 기준이 되는 브랜치로 이동한 후 진행 되어야합니다. 내가 다른 브랜치에서 작업을 했고 그 내용을 메인 브랜치로 병합 할 것이라면 메인 브랜치로 이동한 후 Merge를 진행해야한다는 것입니다. 

 

Merge 명령어

 

git merge "feat_login" // 메인 브랜치를 기준으로 "feat_login" 브랜치의 내용을 병합

 

Merge를 실행하고 나면 별 문제 없이 완료 되었다고 문구가 나올 수도 있고 아니면 conflict(충돌) 관련 문구가 나올수도 있습니다. conflict는 일반적으로 두 브랜치에서 동일한 파일의 동일한 부분을 수정한 경우에 발생합니다. 이때 Git이 어떤 변경사항을 적용해야 하는지 결정할 수 없어서 충돌이 발생하는 것입니다. Git은 충돌 내용을 친절하게 보여주기 때문에 원하는 내용으로 파일을 수정한 후 다시 커밋을 진행하면 Merge가 완료됩니다. 그리고 push를 하면 원격 저장소에 Merge 된 커밋을 볼 수 있습니다.

 

3. revert  reset 사용

기분좋게 merge와 push를 마쳤지만 원격 리포지토리를 확인해보니 커밋 된 name과 email이 제가 아니었습니다...

제가 학교와 집에서 PC 2개를 사용하는데 학교 PC가 공용이라 다른사람이 git name,email을 다른 걸로 설정해 놓아서 생긴 문제였습니다. 사실 문제될건 없지만 개인 리퍼지토리가 아니기도하고 통일된 모습이 깔끔할거 같아서 커밋을 삭제하고 이름과 이메일을 수정한 후 다시 진행하기로 하였습니다. 커밋을 삭제하는 방법은 크게 두가지로 나뉘었습니다.

 

revert vs reset

  • reset
    • 과거 커밋 내역을 삭제한다.
    • 과거 커밋으로 되돌아간다는 커밋 메세지를 남기지 않는다.
    • 주로 로컬 저장소에서 작업할 때 사용한다.
  • revert
    • 과거 커밋 내역을 유지한다.
    • 과거 커밋으로 되돌아간다는 커밋 메세지를 남길 수 있다.
    • 주로 원격 저장소에 이미 push를 했을 때 사용한다.

저는 이미 원격 저장소에 push를 한 상태였기때문에 revert 방법으로 진행하였습니다.

 

revert 명령어

 

git revert --no-commit HEAD~1 //최근 한개의 커밋을 취소

 

위 명령어를 사용하여 커밋을 되돌아 갔지만 원격 저장소에는 반영이 되지 않았습니다. 이유는 잘 모르겠지만 이왕 이렇게된거 조금 위험하지만 커밋 기록을 아에 깔끔하게 없애자고 마음 먹었습니다. 그래서 다른 협업자들에게 지장이 없다는 전제하에 reset을 사용하였습니다.

 

reset 명령어

 

git reset "되돌리고 싶은 commit 코드" --hard

 

옵션은 여러가지가 있지만 돌아가려는 이력 이후의 모든 내용을 지우고 모든 상태를 초기화 시키고싶었기 때문에 "--hard" 옵션을 사용하였습니다. reset 후 "git log"를 사용하여 살펴보니 로컬 저장소는 입력한 커밋 코드를 헤드로 가리키고 있는걸 볼 수 있었습니다. 하지만 원격저장소에는 아직 반영이 되지 않았기 때문에 추가적으로 "git push origin "브랜치명" --force" 명령어를 사용해 원격 저장소의 커밋들도 삭제하였습니다.

 

4. git name, email 변경 명령어

이제 머지전으로 되돌아갔으니 git name,email을 변경하고 다시 머지를 진행하기로 했습니다. 관련 명령어들은 다음과 같습니다.

 

현재 user 정보 확인 명령어

 

git config --list

 

 

user 정보 수정 명령어

 

git config --global user.name "name"
git config --global user.email email

 

특정 리포지토리 에서만 user 정보를 설정하고 싶다면 --global 을 빼고 수행하면 됩니다.

 

참고자료

https://velog.io/@marksen/Git-Branch%EC%99%80-Merge

https://han-joon-hyeok.github.io/posts/git-reset-revert/

https://korband.tistory.com/34

'Git&GitHub' 카테고리의 다른 글

[Git & GitHub] Git 명령어  (0) 2023.08.10
[Git & GitHub] Git & GitHub란 무엇인가  (0) 2023.08.09

댓글