GIT : 11. Merge and Conflict

yeppi1802·2024년 6월 19일

❇️ 요약

  • Git Merge
  • Conflict

📖 Git Merge

🔆 Git Merge

  • 현재 위치한 버전에 다른 버전을 병합하는 작업
  • Branch를 병합할때
  • Push Pull 할때도 내부에서 Merge가 일어난다
git merge <branch_name>

🔆 Main Branch에서 Dev Branch를 Merge

  • Main에서 Dev를 Merge하는 경우
  • Dev에서 작업 완료후 Main에 반영 시킬 때

🔆 Merge Commit

🔆 Dev Branch에서 Main Branch를 Merge

  • Dev에서 Main을 Merge하는 경우
  • Dev에서 작업 중 Main의 갱신사항을 수시로 받아야하는 경우
  • 개발 소스 싱크를 맞춰야하는 경우

🔆 Merge Commit

🔆 Main Branch 변경사항이 없을 때 Dev Branch를 Merge

  • 합쳐도 C4 버전 그대로!
  • 새로운 Merge 버전 생성 X

🔆 Merge Commit

🔆 Dev Branch에서 변경 사항이 없는 Main Branch를 Merge

  • dev에 Main을 Merge해도 별 큰 차이가 없기 떄문에 아무일도 일어나지 않는다

🔆 Merge 할때 주의 사항 : Head의 위치!⭐⭐⭐

  • 현재 위치에 내가 가져오고자 하는 버전을 병합해서 버전 갱신
  • 어느 위치에서 Merge를 시도 하느냐 중요!
  • 많이 하는 실수!

📖 Conflict

🔆 Conflict

  • 두 Branch에서 같은 버전의 같은 부분을 수정하는 경우, Auto Merge가 불가능한 상황에서 발생
  • 판단 기준이 없는 경우, Git은 Auto Merge 하지 않고 Conflict 발생
  • 개발자가 직업 해결해야 한다

🔆 Conflict가 발생한 파일

  • Conflict MessageGit Status로 파악할 수 있다
  • Merge 과정에서 충돌 발생시 가운데 ========를 기준으로 충돌 부분을 보여주는데 이를 기준으로 코드 수정
<<<<<<<< HEAD
print("Hello, cat!")
========
print("Hello, dog!")
>>>>>>>> HEAD

🔆 Conflict 해결

  • Git Commit까지 완료되면 Conflict 상태가 해지되어 Merge 할 수 있다.
  • 참고, Git Commit이 실패하는 경우 git commit -i 로 강제 Commit 할 수 있다.
  • Merge도 완료 된다.
  1. 파일 수정 ⭐⭐⭐

    • 꼼꼼하게 다 수정 되었는지 확인
    • 특수문자(====)가 전부 제거 되었는지 확인
    print("Hello, cat!")
  2. Git Add

    • 수정한 부분 Add
    git add <conflict_file_name>
  3. Git Commit

    git commit -m <merge_message>

🔆 Push Pull중에 Comflict가 발생하면,

  • Push 동작 중 Conflict 상황이 발생하면,
    • Push가 실패함
    • Pull을 해서 Conflict 에러를 확인할 수 있음
  • Pull 동작 중 Conflict 상황이 발생하면,
    • Fetch만 되고 Merge가 실패한 Conflict 상태가 됨
    • Conflict를 해결하면 Merge Commit이 완료됨

📌 그래서, 바로 Push 하지말고 항상 Pull 먼저 하는 습관이 좋다!!!


📖 Branch를 Merge해보자

설명 생략

  • GitHub에 Remote Repository 생성
  • Local Repository 복제(git clone)
  • Dev Branch 생성

☁️ Main Branch에 파일 추가

touch main.py
git add main.py
git commit -m "add main.py"
git log --oneline

☁️ Dev Branch에 파일 추가

git checkout dev
touch dev.py
git add dev.py
git commit -m "add dev.py"

☁️ 각각 Branch에 파일이 존재

ls
git checkout main
ls

☁️ Main Branch에서 Dev Branch를 Merge

git branch # Head가 main branch 가리키는지 확인
git merge dev
git log --online

☁️ 각 Branch 상태를 보면

  • dev Branch는 영향을 받지 않았음을 알 수 있다
ls
git checkout dev
ls
git log --oneline


📖 Remote Branch를 Merge

☁️ Local Repository에 지금까지 작업한 것들 Push

git push origin main

☁️ Dev Branch도 Push

git push origin dev

☁️ GitHub에서 New Branch 생성

  • Branches > New branch 선택
  • main을 source로 dev2 생성

☁️ Dev2 Branch에서 파일 추가

  • Add file > Create new file 선택 > dev2.py 생성

☁️ Local Repository에는 Dev2 Branch가 없다

git checkout main
git branch -a

☁️ Git Fetch해보면 생기는 Dev2 Branch

  • Remote에 Dev2가 존재! But, Local에는 아직 없다
git fetch
git branch -a

☁️ Main Branch에 Dev2 Branch를 Merge

git merge origin/dev2
ls
git log --oneline


📖 Conflict 체험

☁️ main.py 수정

git branch # head가 main을 가리키는지 확인 

cat > main.py
print("hello, world")

git commit -a -m "hello, world"

git log --oneline -1

☁️ Dev3 Branch 만들고 main 파일 수정

git branch dev3
git branch

cat > main.py
print("hello, cat")

git commit -a -m "hello, cat"

git log --oneline -2 

☁️ Dev3 Branch에서 파일 수정

git checkout dev3

cat > main.py
print("hello, dog")

git commit -a -m "hello, dog"

git log --oneline -2

☁️ Main Branch에서 Merge 시도

git checkout main
git branch
git merge dev3 

☁️ 해결 : Git Status에도 정보가 있다

git status

☁️ 해결 : Conflict 파일을 수정하고 해결

cat main.py 
cat > main.py                         # 1. 파일 수정
git commit -a -m "resoved conflict"   # 2. ADD, COMMIT

  • 파일 수정하는 다른 방법 : vi main.py

    사용한 문법

    • d + d : 라인 삭제(단축키)
    • :wq : 저장후 파일 나가기
    # main.py 파일 상태
    <<<<<<<< HEAD
    print("hello, cat")
    ========
    print("hello, dog")
    >>>>>>>> dev3
    # 수정한 main.py 상태 
    print("hello, cat"

☁️ 해결 : 잘 merge 된것 확인

git log --oneline -4

0개의 댓글