
merge = 병합하다
git branch를 다른 branch와 병합하는 과정을 merge라고 한다.
main 에서 새로운 변경 사항이 있는 stage 를 merge 할 때 사용git branch stage # 작업을 위한 브랜치 생성
git checkout stage # 브랜치 이동
# 작업 후
git add .
git commit -m "작업 브랜치에서의 변경 상태를 commit 해야 다른 브랜치로 이동 가능"
//원격에 push가 필요할 경우 push하고 이동
git checkout main # merge 할 브랜치로 이동. main에는 변화가 없음. stage의 변경 사항만
# 받아옴
git merge stage
# 결과 히스토리
A -- B -- C (main)
\
D -- E (stage)
Fast-Forward 후:
A -- B -- C -- D -- E (main, stage)

main 브랜치와 stage 브랜치 모두에서 변경 사항이 존재하는 경우 사용된다.
git branch stage # 작업을 위한 브랜치 생성
git checkout stage # 브랜치 이동
# 작업 후
git add .
git commit -m "작업 내용 commit"
//원격에 push가 필요할 경우 push하고 이동
git checkout main
# 작업 후
git add .
git commit -m "작업 내용 commit"
git merge stage # 병합 커밋 생성, 충돌이 발생할 수 있음
# 결과 히스토리
A -- B -- C -- F -- G (main)
\
D -- E (stage)
Recursive Merge 후:
A -- B -- C -- F -- G -- H (main)
\ /
D ------ E
# H가 병합 커밋

rebase하면, 히스토리 변경으로 인해 충돌과 혼란이 발생할 수 있기에 협업 중인 브랜치에 사용하지 않는 것이 좋다.
git checkout stage
# stage 브랜치를 main 브랜치로 재배치
git rebase main
# main 브랜치로 이동
git checkout main
git merge stage
# 결과 히스토리
A -- B -- C (main)
\
D -- E (stage)
# D, E가 가진 커밋이 각각 재작성 되어 merge
# 이 과정에서 충돌이 일어날 수 있음
A -- B -- C -- D! -- E! (stage)

# 결과 히스토리
main:
A -- B -- C
feature (stage 브랜치):
A -- B -- C
\
D -- E -- F
# squash merge
main:
A -- B -- C -- G


git log 명령어를 통해 히스토리와 체크섬을 확인할 수 있는데, 체크섬 앞자리 일부를 입력하여 버전을 바꿀 수 있다. 커밋 메세지를 잘 적어야 버전 관리에 용이하다.
git checkout <커밋 해시>
# 예시. codeit sprint css 실습 과제 - 항공편 티켓 예매 페이지 버전으로 이동
git checkout ebe3
체크섬(checksum): 송신된 자료의 무결성을 보호하기 위해 해싱된 데이터