[Git] Merge and Conflict

허재훈·2023년 5월 1일
0

Git

목록 보기
6/8
post-thumbnail
  • Merge : branch와 반대되는 개념으로 branch를 다시 병합해주는 기능

  • Conflict(충돌) : Merge를 하는 과정에서 양쪽이 같은 코드부분을 고쳤을 때 시스템이 이를 사용자한테 알려서 해결하도록 도와주는 기능

1. Merge 실습 환경 만들기

  • Local Repository 에 Clone
    git_ws 폴더에 복제

git_ws % git clone https://zerobasegit:\
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@\
github.com/zerobasegit/merge_project.git

Cloning into 'merge_project'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

(base) nomaefg@nomaefgui-MacBookPro git_


(파란색이 main branch, 주황색이 dev branch)
(main branchd에서 branch를 하나 더 내서 수정된 commit을 만드는 것까지가 실습환경 준비)

  • 파일 추가 후 저장

git_ws % cd merge_project      # 이동
merge_project % cat > test.txt     # txt 만들고 내용 입력
my name is noma.                    # Ctrl+d 두번해서 저장
merge_project % git add test.txt    # add
merge_project % git commit -m "create" test.txt  # commit
[main 7adac9f] create
  1 file changed, 1 insertion(+)
  create mode 100644 test.txt

  • Branch 생성 후 파일 수정

merge_project % git checkout -b dev  # dev 만들고 이동까지
Switched to a new branch 'dev'
(base) nomaefg@nomaefgui-MacBookPro merge_project % 
cat >> test.txt   # >> 로 한줄 더 추가
are you?  # 추가하려는 내용, Ctrl + d 두번해서 저장
(base) nomaefg@nomaefgui-MacBookPro merge_project % 
cat test.txt    # 내용보기
my name is noma.  # 내용
are you? # 추가된 내용
(base) nomaefg@nomaefgui-MacBookPro merge_project % 
git commit -m “modify 1" test.txt  # commit
[dev 134aaf5] modify 1
  1 file changed, 1 insertion(+)

  • Git Log 확인

merge_project % git log
commit 134aaf56a25bb5489cc27836b9059320ae8de9f4 (HEAD -> dev)
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:25:09 2021 +0900

  modify 1

commit 7adac9f91b4967c1bb465cc27b84e6382b6d0749 (main)
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:24:14 2021 +0900

  create

commit ad973bd1399ff8264b0e8ebb9a1065bfc6d26906 (origin/main, origin/HEAD)
Author: zerobasegit <93780130+zerobasegit@users.noreply.github.com>
Date: Sun Nov 7 21:23:22 2021 +0900
 
  Initial commit

2. Merge Tool 설정

  • Git Configuration 파일 열기
git config --global -e


(아래 vscode를 닫아야 다음 명령문을 넣을 수 있다)

  • Git Merge 설정 추가
[merge]
  tool = vscode
[mergetool "vscode"]
  cmd = "code --wait $MERGED"

(마지막에 위 코드 추가, 저장, 닫기)

3. Merge

  • Git Merge
    현재 위치한 Branch 에 다른 Branch 를 병합
    (위에서 작성한 dev Branch 를 main Branch 에 Merge(병합))

git merge <branchname>
  • Main Branch 로 이동(현재 *이 main에 있음, 이동완료)

merge_project % git checkout main # main으로 
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)
merge_project % git branch
  dev
* main
  • Dev Branch Merge

merge_project % git merge dev
Updating 7adac9f..134aaf5
Fast-forward
  test.txt | 1 +
  1 file changed, 1 insertion(+)

  • Log
    (HEAD -> main, dev)
    Merge 결과 확인(main에 modify 1 이 있다. 병합완료)

merge_project % git log
commit 134aaf56a25bb5489cc27836b9059320ae8de9f4 (HEAD -> main, dev)
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:25:09 2021 +0900

  modify 1

commit 7adac9f91b4967c1bb465cc27b84e6382b6d0749
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:24:14 2021 +0900

  create

commit ad973bd1399ff8264b0e8ebb9a1065bfc6d26906 (origin/main, origin/HEAD)
Author: zerobasegit <93780130+zerobasegit@users.noreply.github.com>
Date: Sun Nov 7 21:23:22 2021 +0900

  Initial commit

4. Conflict(충돌)

(요약) Conflict 해결은
1. Conflict 코드들을 다 없애고,
2. 남길 코드만 남겨서 저장해준 다음에
3. add, commit 을 해주면 됨

  • Merge Conflict
    Branch 를 Merge 하는 과정에서 충돌이 날 수 있음
    혹은 Push, Pull 하는 과정에서도 충돌이 일어날 수 있음

충돌 상황 만들기
1. Main Branch 에서 파일 수정 - Hello, noma 만들기
2. Main Branch 이름 수정 noma > zero
3. Branch 만들어서(dev2) 이름 수정 noma > base
4. merge

  • (충돌 상황 만들기) Main Branch 에서 파일 수정
    Hello, noma 를 만들자.

merge_project % git branch
  dev
* main
merge_project % cat > test.txt
hello, noma.
merge_project % git commit -m "reset" test.txt
[main 839d38c] reset
  1 file changed, 1 insertion(+), 2 deletions(-)

  • (충돌 상황 만들기) Conflict Test 를 위한 Branch 생성
    Hello, noma 를 카피한다. (이동은 하지 않습니다.)
merge_project % git branch dev2

  • (충돌 상황 만들기) Main Branch 에서 파일 수정
    Hello, zero 를 만들자.

merge_project % git branch
  dev
  dev2
* main
merge_project % cat > test.txt
hello, zero.
merge_project % git commit -m "modify -zero" test.txt
[main 8830653] modify -zero
  1 file changed, 1 insertion(+), 1 deletion(-)

  • (충돌 상황 만들기) Dev2 Branch 에서 파일 수정
    Hello, base.

merge_project % git checkout dev2
Switched to branch 'dev2'
(base) nomaefg@nomaefgui-MacBookPro merge_project % cat > test.txt
hello, base.
(base) nomaefg@nomaefgui-MacBookPro merge_project % git commit -m
"modify -base" test.txt
[dev2 c4d0984] modify -base
  1 file changed, 1 insertion(+), 1 deletion(-)

  • Main Branch 에서 Dev2 Merge
    이때 양쪽이 같은 파일의 같은 부분을 수정했기 때문에 Conflict 발생

merge_project % git checkout main # main 으로 이동
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 4 commits.
  (use "git push" to publish your local commits)
merge_project % git merge dev2  # merge 시도
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; (failed, 충돌함)
fix conflicts and then commit the result.

(하나는 base, 하나는 zero 라서 충돌함)

  • MergeTool 실행
    Conflict 발생 이후 아래와 같이 MergeTool 을 실행하면 Conflict 난 파일들이 차례로 열림

merge_project % git mergetool
Merging:
test.txt

Normal merge conflict for 'test.txt':
  {local}: modified file
  {remote}: modified file

(vscode 실행됨)

  • VSCode 에서 Conflict 파일 수정
    Main Branch 와 Dev2 Branch 의 Diff 를 <<<<, ====, >>>> 로 표시

  • 둘 중 맞는 코드를 선택하여 수정하고 저장.(Diff 표시 부분도 삭제, 우리는 base를 선택함,)
    • hello, base. 라인만 남기고 나머지는 모두 지운다

(맞는 부분만 남기고, 저장, 닫기)

  • Conflict 해제
    git add + git commit

merge_project % git add test.txt
(base) nomaefg@nomaefgui-MacBookPro merge_project % git commit
[main 5ea1c87] Merge branch 'dev2' into main

(vscode 실행됨)

  • Commit Message 저장 후 완료

(vscode 실행되면 저장, 닫기)

(hello, base. 로 바뀜)

  • Git Log 로 확인

merge_project % git log
commit 5ea1c879140a6752c89d461c05ee28d170d0af7c (HEAD -> main)
Merge: 8830653 c4d0984
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:48:45 2021 +0900

  Merge branch 'dev2' into main

commit c4d0984984548d4fbc785976ec7db59b2fdc7d35 (dev2)
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:35:37 2021 +0900

  modify -base

commit 8830653709464de5ed1367ecbcf64d8c075108d2
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:33:50 2021 +0900

  modify -zero

commit 839d38cec6e69e04040c028477dcb92a79d4f405
Author: zerobasegit <zerobase.git@gmail.com>
Date: Sun Nov 7 22:31:14 2021 +0900

  reset

...

혼자서 해봅시다

1. Local Repository 생성

• 위치 : git_ws 폴더 하위
• 이름 : conflict_project

2. Merge 실습

• Default Branch 이름 확인 : main or master
• [master] 에서 conflict.txt 생성 후 commit : This is
• [main] 에서 Branch 생성 후 이동 : dev
• [dev] 에서 conflict.txt 수정 후 commit : This is merge test.
• [main] 에서 [dev] Merge

• Default Branch 이름 확인 : main or master
• [master] 에서 conflict.txt 생성 후 commit : This is

• [main] 에서 Branch 생성 후 이동 : dev

• [dev] 에서 conflict.txt 수정 후 commit : This is merge test.

• [main] 에서 [dev] Merge

3. Conflict 상황 만들기

• [main] 에서 Branch 생성 (이동 X) : dev2
• [main] 에서 conflict.txt 수정 후 commit : This is conflict test.
• [dev2] 에서 conflict.txt 수정 후 commit : This is log test.
• [main] 에서 [dev2] Merge : Conflict 발생 확인

• [main] 에서 Branch 생성 (이동 X) : dev2

• [main] 에서 conflict.txt 수정 후 commit : This is conflict test.

• [dev2] 에서 conflict.txt 수정 후 commit : This is log test.

• [main] 에서 [dev2] Merge : Conflict 발생 확인

4. Conflict 해결

• Conflict 해결 : This is conflict test.
• Log 로 확인

(This is conflict test. 만 남기고 모두 지움 > 저장 > 닫기)

  • git add, commit

(vscode 자동으로 실행됨, 저장 > 닫기)

• Log 로 확인

• 그래프로도 확인

위 글은 제로베이스 데이터 취업 스쿨의 강의자료를 참고하여 작성되었습니다.

profile
허재

0개의 댓글