❇️ 요약
📖 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 Message와 Git Status로 파악할 수 있다
- Merge 과정에서 충돌 발생시 가운데 ========를 기준으로 충돌 부분을 보여주는데 이를 기준으로 코드 수정
<<<<<<<< HEAD
print("Hello, cat!")
========
print("Hello, dog!")
>>>>>>>> HEAD
🔆 Conflict 해결
- Git Commit까지 완료되면 Conflict 상태가 해지되어 Merge 할 수 있다.
- 참고, Git Commit이 실패하는 경우
git commit -i 로 강제 Commit 할 수 있다.
- Merge도 완료 된다.
-
파일 수정 ⭐⭐⭐
- 꼼꼼하게 다 수정 되었는지 확인
- 특수문자(====)가 전부 제거 되었는지 확인
print("Hello, cat!")
-
Git Add
git add <conflict_file_name>
-
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
