Git Merge
는 현재 위치한 버전에 다른 버전을 병합하는 작업이다.
git merge <branch_name>
git merge dev
Merge Commit 결과
Main branch에서 dev branch로 merge하는 경우는 다음과 같다.
git checkout dev
git merge main
Merge Commit 결과
dev branch에서 main branch로 merge하는 경우는 다음과 같다.
git merge dev
이 경우는 main은 갱신이 없고 dev만 갱신을 한 상태로 dev만 버전이 하나 더 증가를 한 상태이다.
Merge Commit 결과
C2에서 C4로 갱신된 버전이 합쳐도 C4 그대로이기 때문에 main이 C4를 가리키는 동작으로만 종료가 된다. 새로운 merge 버전은 생기지 않는다.
이 경우는 C2에서 dev branch를 생성하고 dev는 버전을 갱신한 상태이고 dev에서 main을 땡겨오겠다는 말이다. 따라서 HEAD를 dev로 옮겨야한다.
git checkout dev
git merge main
Merge Commit 결과
Main과 dev를 merge하면 버전 차이가 없어서 아무일도 일어나지 않는다.
Conflict
는 두 branch에서 같은 버전의 같은 부분을 수정하는 경우, Auto Merge가 불가능한 상황에서 발생한다.
따라서 merge 중 conflict가 발생하면 개발자가 직접 해결해야 한다.
Auto Merge가 불가능한 상황은 다음과 같다.
<<<<<<<< HEAD
print("Hello, Irene!")
=======
print("Hello, Yeji!")
>>>>>>>> HEAD
Conflict가 발생한 부분이 여러군데일 수 있다.
1) 파일 수정
print("Hello, Irene!")
2) Git Add
git add <conflict_file_name>
3) Git Commit
git commit -m <merge_message>
Push 동작 중 conflict 상황이 발생하면,
Pull 동작 중 conflict 상황이 발생하면,
TIP
따라서 해당 conflict 발생을 줄이려면 remote 서버랑 연동을 할 때 push를 해야되는 상황에서 바로 push를 하지말고 항상 업데이트 된게 있는지 local 서버로 pull 먼저 하고 push하는 습관을 가지면 좋다.
1) GitHub 로그인
2) New
버튼 클릭
3) Repository name
입력
4) Private
선택
5) Add a README file
선택
6) Create repository
버튼 클릭
7) < > Code
클릭
8) HTTPS 주소
복사
https://github.com/yeji4175/merge_project.git
1) Terminal 실행
2) Query 입력
git_ws % git clone https://https://github.com/yeji4175/merge_project.git
git_ws % cd merge_project
merge_project % ls
merge_project % git log --oneline
merge_project % git branch dev
merge_project % git log --oneline
merge_project % touch main.py
merge_project % git add main.py
merge_project % git commit -m "add main.py"
merge_project % git log --oneline
merge_project % git checkout dev
merge_project % touch dev.py
merge_project % git add dev.py
merge_project % git commit -m "add dev.py"
merge_project % git log --oneline
merge_project % ls
merge_project % git checkout main
merge_project % ls
merge_project % git branch
merge_project % git merge dev #main에 dev를 병합
merge_project % git log --oneline
merge를 하면 빈 VSCode가 열리는데 아무것도 작성을 안하고 닫아버리면 git log --oneline
을 썼을 때 자동으로 Merge branch 'dev'
메시지가 작성이 된다.
merge_project % ls
merge_project % git checkout dev
merge_project % ls
merge_project % git log --oneline
merge_project % git checkout main
merge_project % git branch
merge_project % status
merge_project % git push origin main
GitHub의 merge_project를 새로고침하면 원격의 main branch가 local 저장소와 merge가 된걸 확인할 수 있다.
merge_project % git checkout dev
merge_project % git branch
merge_project % git status
merge_project % git push origin dev
GitHub의 merge_project에서 dev branch가 추가가 된걸 확인할 수 있다. 또한 2개의 commits으로 dev의 local과 같은 상태인걸 확인할 수 있다.
다른 사람이 remote repository에 branch를 생성해서 올렸다라는 상황이다.
1) main의 오른쪽 branch 클릭
2) New branch
클릭
3) Create a branch 팝업창에서 New branch name
입력
4) Source
선택
5) Create new branch
버튼 클릭
dev2가 생긴걸 확인할 수 있다.
main과 똑같이 4개의 commits을 확인할 수 있다.
1) Add file +
버튼에서 Create new file
클릭
2) 파일 이름 입력
3) 파일 내용 편집
4) Commit changes
버튼 클릭
5) Commit message
입력
6) Commit changes
버튼 클릭
위의 새로운 파일을 만드는 동작은 local 서버에서 새로운 파일을 만드는 동작과 똑같은 동작을 remote에서 하는거다.
merge_project % git checkout main
merge_project % git branch -a
위의 이미지에서 보면 dev2의 폴더는 찾아볼수가 없다. 그 이유는 remote에서는 버전이 변경이 되었지만 remote꺼를 pull 해오지 않아서 remote 서버와 local 서버가 동기화가 안되어 있어서 local 서버는 dev2가 있는지 모르는 상태이다.
Git fetch를 서버의 정보가 다운로드가 되고 merge가 되지는 않는다.
merge_project % git fetch
merge_project % git branch -a
remote 서버에 dev2가 있는거지 local 서버에는 아직 dev 폴더가 없는걸 확인 할 수 있다.
merge_project % git merge origin/dev2
merge_project % ls
merge_project % git log --oneline
dev2 파일이 추가가 된걸 확인할 수 있다.
merge_project % git branch
merge_project % cat > main.py
print("Hello, world")
merge_project % git commit -a -m "Hello, world"
merge_project % git log --oneline -1
merge_project % git branch dev3
merge_project % git branch
merge_project % cat > main.py
print("Hello, people")
merge_project % git commit -a -m "Hello, people"
merge_project % git log --oneline -2
merge_project % git checkout dev3
merge_project % cat > main.py
print("Hello, everyone")
merge_project % git commit -a -m "Hello, everyone"
merge_project % git log --oneline -2
merge_project % git checkout main
merge_project % git branch
merge_project % git merge dev3
CONFLICT message를 확인할 수 있다.
merge_project % cat main.py
merge_project % cat > main.py
print("Hello, people")
merge_project % git commit -a -m "resoved conflict"
merge_project % git log --oneline -4