Git 분기 의 새로 만 들 기 및 병합

11438 단어 Git갈래
분기 의 새로 만 들 기와 병합
지금 우 리 는 간단 한 분기 와 합병 의 예 를 살 펴 보 자.실제 업무 에서 도 대체적으로 이런 업무 절 차 를 사용 할 것 이다.
  • 어떤 사 이 트 를 개발 합 니 다.
  • 새로운 수 요 를 실현 하기 위해 가 지 를 만 듭 니 다.
  • 이 지점 에서 일 을 전개한다.
  • 만약 에 이때 당신 이 갑자기 심각 한 문제 가 긴급 하 게 수리 해 야 한다 고 전 화 를 받 았 다 면 다음 과 같은 방식 으로 처리 할 수 있 습 니 다.
  • 생산 서버 에 발 표 된 지점 으로 되 돌아 갑 니 다.
  • 이번 긴급 보 수 를 위해 새로운 가 지 를 만 들 고 그 중에서 문 제 를 복원 합 니 다.
  • 테스트 를 통과 한 후 생산 서버 가 있 는 지점 으로 돌아 가 수리 지점 을 합쳐서 생산 서버 에 전송합니다.
  • 이전에 새로운 수 요 를 실현 하 는 지점 으로 전환 하여 계속 작업 합 니 다.
  • 분기 의 새 설정 과 전환
    우선,우 리 는 당신 이 프로젝트 에서 즐겁게 일 하고 있다 고 가정 하고 이미 몇 차례 업 데 이 트 를 제출 했다(그림 3-10 참조).

    그림 3-10.짧 은 제출 역사
    이제 문제 추적 시스템 의\#53 문 제 를 고치 기로 했 습 니 다.설명 에 따라 Git 은 특정한 문제 추적 시스템 과 다르다.여기 서 해결 해 야 할 문 제 를 설명 하기 위해 서 새로 만 든 가 지 를 iss 53 이 라 고 지 었 습 니 다.이 지점 으로 새로 만 들 고 전환 하려 면git checkout을 실행 하고-b인 자 를 추가 하 십시오.
    
    $ git checkout -b iss53
    Switched to a new branch 'iss53'
    이것 은 아래 두 명령 을 집행 하 는 것 과 같다.
    
    $ git branch iss53
    $ git checkout iss53
    그림 3-11 은 이 명령 의 집행 결 과 를 나타 낸다.

    그림 3-11.새 분기 의 지침 을 만 들 었 습 니 다.
    이 어 복구 문 제 를 시도 하기 시 작 했 습 니 다.몇 번 의 업 데 이 트 를 제출 한 후에iss53분기 의 지침 도 앞으로 추 진 될 것 입 니 다.이것 이 바로 현재 분기(다시 말 하면 현재HEAD지침 이 가리 키 고 있 기 때 문 입 니 다iss53.그림 3-12 참조):
    
    $ vim index.html
    $ git commit -a -m 'added a new footer [issue 53]'

    그림 3-12.iss 53 분 지 는 업무 진행 에 따라 앞으로 추진 된다.
    지금 너 는 그 사이트 문제 의 긴급 전 화 를 받 았 으 니 즉시 수리 해 야 한다.Git 이 있 으 면 이 패 치 와iss53의 수정 사항 을 동시에 발표 할 필요 도 없고,서버 에 패 치 를 만 들 거나 발표 하기 전에 이 수정 사항 을 복원 하 는 데 많은 힘 을 들일 필요 도 없습니다.유일 하 게 필요 한 것 은 분기 전환master입 니 다.
    그러나 그 전에 임시 저장 소 나 작업 디 렉 터 리 에 제출 되 지 않 은 수정 사항 을 주의 하 십시오.이것 은 곧 검출 될 분기 와 충돌 하여 Git 이 분기 전환 을 막 을 것 입 니 다.분기 전환 을 할 때 는 깨끗 한 작업 영역 을 유지 하 는 것 이 좋 습 니 다.잠시 후 이 문 제 를 돌아 가 는 방법 몇 가 지 를 소개 하 겠 습 니 다.현재 모든 수정 사항 이 제출 되 었 기 때문에 다음은 정상적으로master분기 로 전환 할 수 있 습 니 다.
    
    $ git checkout master
    Switched to branch 'master'
    이 때 작업 목록 의 내용 은 당신 이 문 제 를 해결 하기 전과 똑 같 습 니 다.긴급 수리 에 집중 할 수 있 습 니 다.이 점 은 명심 할 필요 가 있다.Git 은 작업 디 렉 터 리 의 내용 을 어떤 지점 이 검출 되 었 을 때 가리 키 는 제출 대상 의 스냅 샷 으로 복원 할 것 이다.디 렉 터 리 의 내용 이 제출 했 을 때 와 똑 같 도록 파일 을 자동 으로 추가 하고 삭제 하 며 수정 합 니 다.
    이제 긴급 수 리 를 해 야 합 니 다.우 리 는 해결 할 때 까지 긴급 보수 지점hotfix을 만 들 었 다.(그림 3-13 참조)
    
    $ git checkout -b hotfix
    Switched to a new branch 'hotfix'
    $ vim index.html
    $ git commit -a -m 'fixed the broken email address'
    [hotfix 3a0874c] fixed the broken email address
     1 files changed, 1 deletion(-)

    그림 3-13.hotfix 지점 은 master 지점 에서 분 화 된 것 이다.
    수리 가 성공 적 이 었 는 지 확인 하고master분기 로 돌아 가 합 쳐 생산 서버 에 발표 할 필요 가 있다.git merge명령 으로 합병 하기:
    
    $ git checkout master
    $ git merge hotfix
    Updating f42c576..3a0874c
    Fast-forward
     README | 1 -
     1 file changed, 1 deletion(-)
    합병 시'Fast forward'라 는 힌트 가 나 왔 음 을 주의 하 세 요.현재master분기 가 있 는 제출 대상 은 병합 할hotfix분기 의 직접 상류 이기 때문에 Git 은master분기 지침 을 직접 오른쪽으로 이동 하면 됩 니 다.한 갈래 를 따라 내 려 가면 다른 갈래 에 도달 할 수 있다 면 Git 은 두 가 지 를 합 칠 때 간단하게 포인 터 를 오른쪽으로 이동 할 수 밖 에 없다.이런 단선 의 역사 가 지 는 해결 해 야 할 이견 이 없 기 때문에 이러한 합병 과정 을 빠 른 전진(Fast forward)이 라 고 할 수 있다.
    현재 최신 수정 사항 은 현재master지점 이 가리 키 는 제출 대상 에 있 습 니 다.생산 서버 에 배치 할 수 있 습 니 다(그림 3-14 참조).

    그림 3-14.합병 후 master 분기 와 hotfix 분기 가 같은 위 치 를 가리 키 고 있 습 니 다.
    그 아주 중요 한 보수 가 발 표 된 후에 당신 은 방 해 받 기 전의 일 로 돌아 가 고 싶 습 니 다.현재hotfix지점 과master모두 같은 제출 대상 을 가리 키 기 때문에hotfix역사적 사명 을 완 수 했 으 니 삭제 할 수 있다.git branch-d옵션 을 사용 하여 삭제 작업 을 수행 합 니 다.
    
    $ git branch -d hotfix
    Deleted branch hotfix (was 3a0874c).
    현재 완료 되 지 않 은\#53 문제 복구 지점 으로 돌아 가 계속 작업(그림 3-15):
    
    $ git checkout iss53
    Switched to branch 'iss53'
    $ vim index.html
    $ git commit -a -m 'finished the new footer [issue 53]'
    [iss53 ad82d7a] finished the new footer [issue 53]
     1 file changed, 1 insertion(+)

    그림 3-15.iss 53 가 지 는 영향 을 받 지 않 고 계속 추진 할 수 있다.
    주의해 야 할 것 은 이전hotfix분기 의 수정 내용 이 아직iss53에 포함 되 지 않 았 다 는 점 이다.이번 보수 가 필요 하 다 면git merge mastermaster 분기iss53를 합 칠 수 있 습 니 다.또는iss53이 완 료 된 후에iss53분기 의 업 데 이 트 를 합병 합 니 다master.
    원 격 분기 삭제:
    
    $ git push origin --delete <BranchName>
    원 격 분기 보기:
    
    $ git branch -a
    분기 적 합병
    문제\#53 관련 작업 이 완료 되면 분기master를 합 칠 수 있 습 니 다.실제 작업 은 앞의 합병hotfix과 분기 차이 가 많 지 않 습 니 다.master분기 로 돌아 가 고 실행git merge명령 은 합병 할 가 지 를 지정 합 니 다.
    
    $ git checkout master
    $ git merge iss53
    Auto-merging README
    Merge made by the 'recursive' strategy.
     README | 1 +
     1 file changed, 1 insertion(+)
    이번 합병 작업 의 밑바닥 실현 은 이전hotfix의 합병 방식 과 같 지 않 음 을 주의 하 십시오.이번 개발 역 사 는 더 일찍 갈 라 지기 시 작 했 으 니까.현재master분기 가 가리 키 는 제출 대상(C4)은iss53분기 의 직접적인 조상 이 아니 기 때문에 Git 은 추가 처 리 를 해 야 합 니 다.예 를 들 어 Git 은 두 갈래 의 끝(C4 와 C5)과 그들의 공동 조상(C2)으로 간단 한 3 자 합병 계산 을 한다.그림 3-16 은 Git 이 병합 에 사용 할 세 개의 제출 대상 을 빨간색 상자 로 표시 합 니 다.

    그림 3-16.Git 은 분기 합병 을 위해 가장 좋 은 동원 합병 점 을 자동 으로 식별 한다.
    이번에 Git 은 간단하게 분기 포인 터 를 오른쪽으로 이동 하지 않 고 세 측 이 합 친 결과 에 대해 새로운 스냅 샷 을 만 들 고 제출 대상(C6)을 자동 으로 만 듭 니 다(그림 3-17 참조).이 제출 대상 은 두 조상(C4 와 C5)이 있 는 비교적 특수 하 다.
    특히 Git 은 어떤 공동 조상 이 가장 좋 은 합병 기반 인지 스스로 판단 할 수 있다.CVS 나 Subversion(1.5 이후 버 전)과 달리 개발 자가 수 동 으로 통합 기반 을 지정 해 야 합 니 다.그래서 Git 의 통합 작업 은 다른 시스템 보다 훨씬 간단 하 다.

    그림 3-17.Git 은 통합 결 과 를 포함 하 는 제출 대상 을 자동 으로 만 들 었 다.
    이전의 업무 성과 가master로 합 쳐 졌 으 니iss53소 용이 없다.이 문 제 를 삭제 하고 문제 추적 시스템 에서 닫 을 수 있 습 니 다.
    
    $ git branch -d iss53
    충돌 시 분기 통합
    합병 작업 이 이렇게 순 조 롭 지 않 을 때 도 있다.만약 서로 다른 지점 에서 같은 파일 의 같은 부분 을 수정 하면 Git 은 둘 을 깨끗하게 합 칠 수 없다.만약 당신 이 문 제 를 해결 하 는 과정 에서hotfix에서 수정 한 부분 을 수정 하면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
    
    $ git merge iss53
    Auto-merging index.html
    CONFLICT (content): Merge conflict in index.html
    Automatic merge failed; fix conflicts and then commit the result.
    Git 이 합병 을 했 지만 제출 하지 않 았 습 니 다.충돌 이 해결 되 기 를 기다 리 는 것 이 멈 출 것 입 니 다.어떤 파일 이 합병 할 때 충돌 하 는 지 보 려 면git status으로 찾 아 볼 수 있 습 니 다.
    
    $ git status
    On branch master
    You have unmerged paths.
     (fix conflicts and run "git commit")
    
    Unmerged paths:
     (use "git add <file>..." to mark resolution)
    
        both modified:   index.html
    
    no changes added to commit (use "git add" and/or "git commit -a")
    충돌 이 해결 되 지 않 은 파일 은 병합 되 지 않 은 상태 로 표 시 됩 니 다.Git 은 충돌 이 있 는 파일 에 표준 충돌 해결 표 시 를 추가 합 니 다.충돌 을 수 동 으로 찾 아서 해결 할 수 있 습 니 다.이 파일 은 아래 와 같은 부분 을 포함 하고 있 습 니 다:
    
    <<<<<<< HEAD
    <div id="footer">contact : [email protected]</div>
    =======
    <div id="footer">
     please contact us at [email protected]
    </div>
    >>>>>>> iss53
    =======분 리 된 상반부,HEAD(즉master분기,merge명령 을 실행 할 때 전환 한 분기)의 내용 을 볼 수 있 으 며,하반 부 는iss53분기 에 있 는 내용 입 니 다.충돌 을 해결 하 는 방법 은 둘 중 하 나 를 선택 하거나 당신 이 직접 통합 하 는 것 이 아 닙 니 다.예 를 들 어 당신 은 이 내용 을 다음 과 같이 바 꾸 어 해결 할 수 있 습 니 다.
    
    <div id="footer">
    please contact us at [email protected]
    </div>
    이 해결 방안 은 각각 두 가지 중 일 부 를 채 택 했 고 나 는<<<<<<<,=======>>>>>>>이 줄 들 을 삭제 했다.모든 파일 의 충돌 을 해결 한 후 실행git add은 해 결 된 상태 로 표시 합 니 다.일단 잠 정적 으로 남 으 면 충돌 이 해결 됐다 는 뜻 이기 때문이다.만약 당신 이 그래 픽 인터페이스 가 있 는 도구 로 이러한 문 제 를 해결 하고 싶다 면 실행git mergetool하 십시오.이것 은 시각 화 된 합병 도 구 를 호출 하여 모든 충돌 을 해결 하도록 유도 할 것 입 니 다.
    
    $ git mergetool
    
    This message is displayed because 'merge.tool' is not configured.
    See 'git mergetool --tool-help' or 'git help config' for more details.
    'git mergetool' will now attempt to use one of the following tools:
    opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
    Merging:
    index.html
    
    Normal merge conflict for 'index.html':
     {local}: modified file
     {remote}: modified file
    Hit return to start merge resolution tool (opendiff):
    기본 병합 도구(Git 이 기본 으로 선택opendiff를 사용 하지 않 으 려 면 Mac 에서 이 명령 을 실 행 했 기 때 문 입 니 다)위 에 있 는'merge tool candidates'에서 사용 가능 한 병합 도구 목록 을 찾 아 사용 하고 싶 은 도구 이름 을 입력 하 십시오.우 리 는 제7 장 에서 환경 에서 의 기본 값 을 어떻게 바 꾸 는 지 토론 할 것 이다.
    병합 도 구 를 종료 하면 Git 에서 병합 에 성 공 했 는 지 물 어 봅 니 다.만약 그렇다 고 대답 한다 면,그것 은 상 태 를 해결 했다 는 것 을 나타 내기 위해 관련 서 류 를 잠시 저장 할 것 이다.
    모든 충돌 이 해결 되 었 는 지 확인 하기 위해 서 다시 한 번git status을 실행 합 니 다.
    
    $ git status
    On branch master
    Changes to be committed:
     (use "git reset HEAD <file>..." to unstage)
    
        modified:  index.html
    만족 하고 모든 충돌 이 해결 되 었 다 는 것 을 확인 하면 임시 저장 구역 에 들 어가 면git commit으로 이번 합병 제출 을 완성 할 수 있다.제출 한 기록 의 차이 가 많 지 않 습 니 다.
    
    Merge branch 'iss53'
    
    Conflicts:
     index.html
    #
    # It looks like you may be committing a merge.
    # If this is not correct, please remove the file
    #    .git/MERGE_HEAD
    # and try again.
    #
    앞으로 이번 합병 을 보 여 주 려 는 사람들 에 게 편 의 를 주 려 면 이 정 보 를 수정 하고 더 많은 합병 세부 사항 을 제공 할 수 있다.예 를 들 어 당신 이 어떤 변경 을 했 는 지,그리고 이렇게 한 원인.때때로 판결 충돌 의 이 유 는 직접적 이거 나 뚜렷 하지 않 으 므 로 약간 주석 을 달 필요 가 있다.
    총결산
    여기 서 Git 분기 의 새로 만 들 기 및 통합 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Git 분기 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기