GIT에서 2 개의 분기를 병합


131

방금 GIT를 사용하기 시작했고 훌륭하다고 생각했지만 merge명령이 수행 하는 작업에 대해 약간 혼란 스럽습니다 .

"A"지점에 작업중인 프로젝트가 있다고 가정 해 보겠습니다.

집에 가서이 지점을 변경하고 "B"로 저장합니다. 다른 프로그래머가 "A"를 변경하고 "C"로 저장합니다.

두 분기 "B"와 "C"를 병합 한 다음 변경 사항을 새 분기로 커밋하는 방법이 있습니까?

아니면 '병합'의 요점을 놓치고 있습니까?


다른 지점에 '변경 사항을 저장'할 필요가 없습니다. A를 작업 한 다음 다른 A를 병합합니다.
— knittl 2010-08-04

나는 따르지 않는다. A는 내 로컬 컴퓨터에 있고, dev1은 A의 복사본을 자신의 컴퓨터에, dev2에는 A의 복사본이 있습니다. 두 개발자 모두 변경 사항을 적용합니다. 이러한 변경 사항을 병합하려면 어떻게해야합니까?
— dotty

< kernel.org/pub/software/scm/git/docs/git-pull.html >을 참조하십시오 . 개발자는 아마도 먼저 저장소를 어딘가에 푸시 / 업로드해야 할 것입니다
— knittl

답변:


196

merge 두 개 (또는 그 이상)의 가지를 하나로 모으는 데 사용됩니다.

약간의 예 :

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

이제 서로 다른 머리를 가진 세 개의 개별 분기 (즉, AB와 C)가 있습니다.

B와 C에서 다시 A로 변경 사항을 가져 오려면 A를 체크 아웃 한 다음 (이 예에서는 이미 수행됨) merge 명령을 사용합니다.

# create an octopus merge
$ git merge B C

기록은 다음과 같이 보일 것입니다.

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

저장소 / 컴퓨터 경계를 넘어 병합하려면 git pull예를 들어 분기 A가있는 pc 에서 명령을 살펴보십시오 (이 예제는 두 개의 새 커밋을 생성합니다).

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

이는 두 분기가 동일한 코드를 변경했음을 의미합니다. conflitcs를 수정 git add conflicting_files한 다음git commit
— knittl

A의 파일에 "hello"라는 단어가 포함되어 있고 A는 "HELLO"로 수정하고 B는 "Hello world"로 수정했다고 가정합니다. 이러한 파일을 병합하면 어떤 결과가 발생합니까?
— dotty

아, B가 수정하고 C가 수정했음을 의미합니다.
— dotty

git에서 다른 것을 의미하는 '수정'이라는 단어에주의하십시오 (기존 커밋 변경). 파일 'hello'를 한쪽에서 'HELLO'로 변경하고 다른 쪽에서 'Hello World'로 변경하면 병합 충돌이 발생합니다
— knittl

19
@dotty : git은 종종 마술처럼 보이지만 실제로는 마음을 읽을 수 없습니다. 두 가지 분기가 동일한 콘텐츠에 대해 두 가지 다른 변경을 수행하면 인간 만이이를 조정하는 방법을 알아낼 수 있습니다. 이것이 바로 병합 충돌입니다.
— Cascabel

47

당신의 병합 변경하려는 경우 SubBranch 에 MainBranch

  1. MainBranch에 있어야합니다. git checkout MainBranch
  2. 그런 다음 병합 명령을 실행하십시오. git merge SubBranch

2
@luckytaxi : 동의합니다. 때로는 적을수록 더
— 좋습니다

이 작업을 취소 할 수 있습니까?
— Yohanelly

0

사례 : 기본적으로 생성 된 병합 커밋 을 무시 해야하는 경우 다음 단계를 따르세요.

이미 2 개의 커밋이있는 마스터에서 새로운 기능 브랜치를 체크 아웃했다고 가정 해 보겠습니다.

  • "추가 된 A", "추가 된 B"

Checkout a new feature_branch

  • "추가 된 C", "추가 된 D"

그런 다음 기능 분기가 두 개의 커밋을 추가합니다 .-->

  • "추가 된 E", "추가 된 F"

여기에 이미지 설명 입력

이제 feature_branch 변경 사항을 마스터에 병합하려면 마스터에 git merge feature_branch앉아 있습니다.

이렇게하면 모든 커밋이 마스터 브랜치에 추가됩니다 (마스터 분기에 4 개 + feature_branch에 2 개 = 총 6 개) + 'Merge branch 'feature_branch'마스터 가 분기 됨에 따라 '와 같은 추가 병합 커밋이 추가 됩니다.

이러한 커밋 (FB에서 만든 것)을 정말로 무시하고 feature_branch에서 만든 전체 변경 사항을 'Integrated feature branch changes into master', Run 과 같은 단일 커밋으로 추가해야하는 경우 git merge feature_merge --no-commit.

--no-commit을 사용하면 병합 커밋을 생성하기 직전에 병합을 수행하고 중지합니다. 이제 기능 브랜치에 추가 된 모든 변경 사항이 master에 있고 새 커밋을 생성 할 기회를 얻게됩니다.

자세한 내용은 여기를 참조하십시오 : https://git-scm.com/docs/git-merge

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.