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

당신의 병합 변경하려는 경우 SubBranchMainBranch

  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.