etc Ⅰ/git

git :) [로컬저장소 중심 - 2편] Branch(개념,생성/이동,삭제,이름변경), log확인, 병합(merge/rebase), 충돌해결, 병합취소

euncheol kim 2022. 4. 28. 01:03

KeyWord

 Branch(개념,생성/이동,삭제,이름변경), log확인, 병합(merge/rebase), 충돌해결, 병합취소

 

참고자료

[깃 끝판왕 강좌] 제대로 파는 Git & GitHub, https://www.youtube.com/watch?v=1I3hMwQU6GU&t=5743s, 얄팍한 코딩사전

 

드리는 말씀

 깃 사용법을 자주 잊어 개인이 보기위해 작성한 글입니다.
자료를 참고하셔도 무방하나, 해당 글은유튜브 [얄팍한 코딩사전], git강의를 토대로 작성되었습니다.
git을 공부하고자 하시는 분은 꼭 봐보시길 강력 추천드립니다.

 

1. Branch: 분기된 가지 (다른 차원)


branches

  • 프로젝트를 하나 이상의 모습으로 관리해야 할 때
    • 예) 실배포용, 테스트서버용, 새로운 시도용
  • 여러 작업들이 각각 독립되어 진행될 때
    • 예) 신기능1, 신기능2, 코드개선, 긴급수정
    • 각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에서 통합

이 모든 것을 하나의 프로젝트 폴더에서 진행할 수 있도록 한다.

 

 

 

1. Branch 생성 및 이동

  1. git branch "브랜치명"
    • git branch가 잘 생성 되었는지 확인하기 위해서git branch 명령어를 쓴다.
    • git branch 명령은 현재 위치한 branch와 branch들을 보여준다.
  2. git switch "브랜치명"
    • git switch "브랜치명"으로 생성된 사용자가 원하는 브랜치로 이동할 수 있다.

 

 

2. Branch 삭제 및 이름변경

  1. Branch 삭제 : git branch -d "삭제할 브랜치명"
  2. Branch 이름변경 :git branch -m "기존 브랜치명" "새 브랜치명"

 

 

3. Branch command창에서 시각화 된 log 확인법

image

Branch를 command 창에서 시각화 된 log로 확인하기 위한 명령어

  • git log --all --decorate --oneline --graph
    • 사실, Sorce Tree로 보는게 가장 편하다.
      • image

 

 

2 ] Branch를 합치는 방법


​1. 두 가지 방법이 존재

  1. merge : 특정 작업을 진행한 branch를 main branch에 하나의 commit으로 붙이는 것
  2. rebase : 특정 작업을 진행한 branch의 commit들을 main에다가 연달아 붙이는 것

 

 

2. merge와 rebase의 차이

merge는 기존 branch의 흔적을 남기면서(잔가지들의 흔적이 남음) 하나의 commit으로 병합되는 반면,

rebase는 작업한 branch의 commit 내용을 main에다가 붙이게 된다. (잔가지들의 흔적을 모두 병합하고자 하는 브랜치에 붙여버린다.)

  • 히스토리에 차이가 있다.
    • 히스토리를 깔끔하게 진행하겠다 :: rebase
    • branch 작업 내용을 남겨둘 필요가 있겠다 :: merge
  • 협업 진행시 rebase를 사용하지 않고 merge를 사용하는 것이 바람직하다. (무조건 정답은 아니다.)

 

 

3. branch, merge 실습하기

image

  1. 병합을 하고자 하는 branch로 이동한다.
  2. git merge "병합할 Branch명"으로 병합을 실시한다.
    • 병합할 Branch명의 history가 그대로 남음을 상기한다.
    • 만약, 병합된 대상의 branch를 삭제하고 싶다면 git branch -d "병합된 대상의 branch" 명령어를 준다.
    • 주의 할 것이, git branch -d 를 하면 branch가 삭제 되는 것이지, history가 삭제되는 것은 아니다.
      • image
  • merge전의 상태로 Reset을 하고 싶다면 ??
    • 위에서 실습한 Reset을 활용한다.
    • 또는 sorce tree에서 commit 위치에 해당하는 부분을 찾아 Reset을 진행한다.

 

 

 

4. branch, rebase실습하기

rebasemerge와 반대로 해야한다.

  • new-teams branch를 main으로 rebase를 하는 경우를 예시로 한 설명
  • image
    • new-teams branch로 이동한다.
    • git rebase main으로 rebase를 진행한다. 아래와 같은 결과가 sorce tree에서 보이게 된다.
      • image
    • main branch의 위치를 주의깊게 볼 필요가 있으며, rebase로 진행된 new-teams branch의 작업 내용이 main에 적용이 되지 않는다.
    • 따라서 main branch의 위치를 new-teams의 위치로 옮겨줘야한다.
      • 다시, 실습 환경으로 돌아와서 main으로 이동 후, git merge new-teams 명령어로 new-teams의 시점으로 fast-foword시킨다. 결과는 아래와 같다.
        • image
      • 이렇게 작업을 진행하면 new-teams의 작업 내용(수정, 삭제, 삽입)이 main에 적용되게 된다.
    • 필요한 경우, new-teams branch를 git branch -d new-teams로 삭제해준다. 결과는 아래와 같다.
      • image

 

 

3 ] 병합시 생기는 충돌 해결하기


병합시 충돌이 생기는 경우는, 두 사용자 이상이 같은 브랜치에서 같은 줄에 다른 수정이 이루어졌을 때 생긴다.

협업에서 자주 접할 수 있는 문제이므로 주의깊게 공부하자.

 

 

1. 실습으로 이해하는 충돌 해결

  • 상황 설정 : conflict-1, conflict-2 branch에서 의도적 충돌 발생시키기
    • 상황 설명 : main에서 병합을 진행할 것이며, 각각의 브랜치는 병합시 충돌이 발생하게 된다.
    - main : Tigers의 manager를 Kenneth로 변경, Leopards의 coach를 Nicholas로 변경,
             Panthers의 coach를 Shirley로 변경
    - confilct-1 : Tigers의 manager를 Deborah로 변경 (commit message : Edit Tigers)
    - conflict-2 (1차) : Leopards의 coach를 Melissa로 변경 (commit message : Edit Leopards)
    - conflict-2 (2차) : Panthers의 coach를 Raymond로 변경 (commit message : Edit Panthers)

 

 

[1] main에서 merge를 이용해 confilt-1을 병합하기

  • main에서 merge를 이용해 confilct-1을 병합할 때 생기는 메시지
    • image
  • main에서 merge를 이용해 confilct-1을 병합할 때 생기는 충돌 (vscode에서 나오는 메시지)
    • image
  • 충돌 발생시, 충돌난 부분을 수정해주고 저장해줘야한다.
    • vscode에서는 3번째 줄 위를(회색 글씨) 개발자가 원하는 옵션을 클릭해 적용시킬 수 있다.
  • 이후, git add . 명령어와 git commit 명령어를 통해 수정사항을 git에게 알린다.
    • image

 

 

[2] main에서 rebase를 이용해 confilt-2를 병합하기

- rebase는 모든 commit의 내용을 연달아 붙이는 것이기 때문에 병합시에 각각의 commit마다 충돌을 해결해줘야한다.

  • 실습진행 초기 상태
    • image
  • conflict-2 branch에 진입하여 git rebase를 하고 나오는 설명
    • image
    • both modified : lepoards.yaml : 두 브랜치에서 leopards.yaml을 건드릴려고 한다. 따라서, 이 파일을 개발자가 수정해달라고 하는 의미이다.
  • 충돌 부분의 파일을 수정 하고 git add .
  • 이후, git rebase --continue 명령어 진행한다. 왜냐하면, 한 번의 수정으로 브랜치 수정이 되지 않을 수 있기 때문이다. 강조하지만 rebase인 경우 각각이 브랜치를 수정해줘야한다. 아래는 현재까지 진행한 사진이다.
    • image
    • image
    • image
  • 앞선 부분까지 진행했다면 commit이 한 번 완료된 것이다.
    • image
  • 이 후, 아직 남은 branch가 있으므로 충돌된 부분을 확인하여 작업을 진행한다.
    • image
    • 결과를 보면 알겠지만, rebase과정의 모든 충돌이 해결되면, git rebase --continue시 위와 같은 메시지가 출력된다.
    • image
    • 분명 두 마디를 수정하여 rebase를 진행했는데 한 마디가 나온 이유충돌 해결 중 두 번째 것에서는 current, 즉 main 브랜치 것(Shirley)을 채택했기 때문에 (즉 rebase가 의미가 없어졌으므로) 커밋으로 추가할 필요가 없어졌기 때문이다.
  • git main이 뒤쳐져 있기 때문에 아래와 같은 진행방법으로 마무리한다. (최신 커밋으로 바꿔준다.)
    • git switch main
    • git merge conflict-2
      • image
    • 다 사용된 브랜치가 필요없을 경우, git branch -d "지울 브랜치명"으로 지워준다.
      • image
      • 지워줘야하는 브랜치를 그때 그때 지워줘야 프로젝트 진행시 혼란을 겪지 않는다.

 

 

 

2. git 병합시 당장 해결하기 힘든 경우 취소하기

  • merge인 경우 : 명령어 git merge --abort를 통해 merge를 중단한다.
  • rebase인 경우 : 명령어 git rebase --abort를 통해 rebase를 중단한다.