Git | Git 브랜치 | git merge


git merge 명령어

병합은 Git에서 분기 한 내용을 다시 통합하는 방법입니다. git merge 는 git branch 명령을 사용하여 만든 독립 한 복수의 개발 라인을 하나의 브랜치에 통합하는 명령입니다.

여기서 아래에서 설명하는 모든 명령은 현재 브랜치에 병합 할 것임에 유의하십시오. 현재 브랜치는 병합 결과 업데이트되지만 대상 지점 (인수에서 지정한 지점)은 그대로 유지됩니다. 따라서, git merge 명령은 보통 브랜치를 선택 git checkout 명령 및 필요하지 않은 대상 지점을 삭제 git branch -d 명령과 함께 사용됩니다.

사용법

git merge <branch>

지정한 브랜치를 현재 브랜치에 병합하는 명령입니다. Git은 병합 알고리즘은 자동으로 선택됩니다 (아래에서 설명합니다).

git merge --no-ff <branch>

지정한 브랜치를 현재 브랜치에 병합하지만 그 때 항상 (비록 그것이 “빨리 감기"가능하더라도) 병합 커밋을 생성하고 병합합니다. 이 명령은 저장소에서 발생한 모든 병합을 기록하는 경우에 유용합니다.

보충 설명

독립적 인 지점에서 기능 개발 작업이 완료되면, 그것을 메인 코드베이스에 반영시킬 필요가 생깁니다. Git은 이렇게 있어서는 저장소의 구성 상태에 따라 여러 가지 알고리즘 (빨리 감기 병합 및 3-way 병합)가 준비되어 있습니다.

앞으로 병합 은 현재 브랜치의 끝에서 목표 지점을 향해 1 개의 직선 인 경로 만 다니고있는 경우에 적용됩니다. 이 경우 실제로 병합이되는 것은 아니고, 단지 현재 브랜치의 끝을 대상 분기의 끝으로 이동시킴으로써 (즉 “빨리 감기"에 의해) 통합이 이루어집니다. 이에 따라 실질적으로 기록 결합이 이루어 대상 지점에서 액세스 가능했던 커밋이 모든 브랜치에서 액세스 할 수 있습니다. 예를 들어 아래 그림은 some-feature 브랜치를 master 브랜치로 앞으로 병합 한 예를 보여줍니다 :

Git 튜토리얼 : 앞으로 병합

그러나 분기가 분기하는 경우는 앞으로 병합을 적용 할 수 없습니다. 경로가 대상 지점으로 향하는 1 개만 아니기 때문에 기록을 결합하는 방법은 세 방향 병합 이외에는 없습니다. 세 방향 병합은 두 기록을 결합하기 위하여 전용의 커밋이 생성 실행됩니다. 이 명칭은 3 개의 커밋 (두 분기의 각 끝의 커밋과 공통 조상 인 커밋)를 사용하여 병합 커밋을 생성하는 것으로부터 비롯됩니다. Git 튜토리얼 : 3-way 병합

이 두 병합 알고리즘 모두 사용 가능하지만, 많은 개발자는 작은 기능과 버그 수정에 ( 로 Rebase 를 사용했다) 앞으로 병합을 장기에 걸쳐 진행된 기능에는 세 방향 병합 사용하는 경향이 있습니다. 후자의 경우, 생성 된 병합 커밋은 두 지점의 상징적 결합으로 작동합니다.

충돌 해결

병합하려고하고있는 두 지점에서 동일 파일의 동일한 부분에 변경이있는 경우, 어느 버전을 사용할 것인지를 Git 측에서 판단 할 수 없습니다. 그런 상황이되었을 경우 병합 커밋 생성의 앞에서 정지하여 수동으로 충돌 해결을 촉구합니다.

Git 병합 프로세스가 뛰어나다는 병합시 충돌을 해결 편집 / 스테이지 / 커밋하는 일반적인 워크 플로우를 사용할 수 있다는 것입니다. 병합시 충돌이 발생하는 경우는 git status 명령을 실행하면 충돌을 해결해야 파일이 표시됩니다. 예를 들어 두 지점에서 hello.py 의 동일한 부분이 변경되지 않으면 다음과 같은 정보가 표시됩니다 :

# On branch master
# Unmerged paths:
# (use "git add/rm ..." as appropriate to mark resolution)
#
# both modified: hello.py
#

여기에서 병합 할 내용을 확인하여 필요한 수정을합니다. 수정이 끝난 병합을 수행 할 준비가되면 git add 명령을 사용하여 충돌이 발생한 파일을 스테이징 영역에 추가합니다. 이어 일반 git commit 명령을 사용하여 병합 커밋을 만듭니다. 이 과정은 일반 스냅 샷 커밋과 완전히 동일하기 때문에 일반 개발자 병합 작업은 알기 쉬운 것으로되어 있습니다.

또한 병합시 충돌이 일어나는 것은 세 방향 병합의 경우 뿐이다 것을 명심하십시오. 앞으로 병합으로 변경이 충돌을 일으킬 수는 없습니다.

git merge사용 예

앞으로 병합

먼저 앞으로 병합의 예를 보여줍니다. 다음 코드에서는 새 브랜치를 만들고이 두 커밋을 넣고 마지막으로 앞으로 병합하여 그것을 master 브랜치에 통합하고 있습니다.

# Start a new feature
git checkout -b new-feature master

# Edit some files
git add <file>
git commit -m "Start a feature"

# Edit some files
git add <file>
git commit -m "Finish a feature"

# Merge in the new-feature branch
git checkout master
git merge new-feature
git branch -d new-feature

이것은 (장기의 기능 개발을 행하기위한 대규모 조직을위한 브랜치가 아닌) 독립적 인 소규모 개발을위한 단기간의 기능 가지를 사용하는 경우의 일반적인 흐름입니다.

또한 new-feature 브랜치는 master 브랜치에서 액세스 가능하기 때문에 git branch -d 명령을 사용하여 경고가 표시되지 않습니다.

세 방향 병합

다음 예제는 이전 예제와 비슷하지만 기능이 진행되는 동안 master 도 진행하고 있기 때문에 세 방향 병합이 필요합니다. 이 시나리오는 대규모 기능의 경우와 프로젝트에서 여러 개발자들이 동시에 작업을 수행하는 경우에 자주 발생합니다.

# Start a new feature
git checkout -b new-feature master

# Edit some files
git add <file>
git commit -m "Start a feature"

# Edit some files
git add <file>
git commit -m "Finish a feature"

# Develop the master branch
git checkout master

# Edit some files
git add <file>
git commit -m "Make some super-stable changes to master"

# Merge in the new-feature branch
git merge new-feature
git branch -d new-feature

이 경우 퇴보를하지 않고 master 를 new-feature 로 이동 할 수 없기 때문에 앞으로 병합 실행이 불가능하다는 것을 명심하십시오.

일반적인 워크 플로는 new-feature 사실은 장기간의 개발을 필요로하는 대규모 기능인 경우가 많고, 그 사이에 master 에 새로운 커밋이 추가되는 경우가 종종 있습니다. 기능 가지 실제로도 위의 예와 같이 소규모 인 경우는 아마도 그것을 master 으로 업데이트하여 앞으로 병합하는 쪽을 선택해야합니다. 이 방법은 불필요한 병합 커밋을 줄이고 프로젝트 이력의 합병증을 방지합니다.