생활코딩

Coding Everybody

3 way merge

토픽 생활코딩 > 프로젝트 관리 > 버전관리 시스템 > 지옥에서 온 Git (새 수업으로 대체)

수업소개

이 수업에서는 git이 병합을 어떻게 처리하는지를 알아봅니다. 

 수업

 

댓글

댓글 본문
  1. 주니어개발자
    새로운 GITn 시리즈에서 3 way merge 기법의 실제적인 적용의 예를 소개합니다.

    https://opentutorials.org......684
    https://opentutorials.org......684
  2. kslee
    내용을 테스트해 본 결과입니다.
    c.txt 한 파일에서만 conflict 발생하네요.
    3 way merge 로직이 이렇게 작동하는구나 이해하고 넘어갑니다.
    감사합니다.

    base(master)
    a.txt : A
    b.txt : B
    c.txt : C
    d.txt : D

    >other(new branch)
    a.txt : (내용삭제)
    b.txt : B
    c.txt : 2
    d.txt : D

    >me(master)
    a.txt : A
    b.txt : B
    c.txt : 1
    d.txt : (내용삭제)

    >master(me) merge other
    a.txt : (내용삭제)
    b.txt : B
    c.txt : (1,2 conflict)
    d.txt : (내용삭제)
  3. S.JIN
    제가 이해한 바로는 이겁니다. (아래에 헷갈려 하시는 분들이 많은 것 같아서요)

    변경된 것은 변경된 사람껄로 적용됩니다. (빈칸이 적용된건 그게 변경된 내용이기 때문입니다.)
    내용이 다 같으면 당연히 그냥 두고
    양쪽에서 변경을 해버렸다는 것은 물음표로 뜨는겁니다.

    예를 삭제로 드셔서 그런것이지 첫행에서 AAC 이렇게 되어 있으면 C가 되는 것입니다. 이고잉님의 예는 변경사항이 빈칸이라 빈칸이 최종적으로 채택 된것이구요
    항상 삭제 된다는 것이 아닙니다.
  4. rkfgus90
    3 way merge에서 1, 4번째 행에 들어갈 값은 비어둔다고 강의에서 들었습니다.
    구글링을 해봐도... 도저히 무슨소린지 모르겠어요... Me / Base / Other 중 한칸이 비어져있으면
    최종적으로 3 way merge를 적용한 결과는 비어진 값이 나온다고 생각하면 될까요?....
  5. egoing
    추가로 답변 드리면 말씀하신 경우라면 특정 커밋만을 선택적으로 병합하는 cherry pick이나 rebase 등을 사용하면 될 것 같습니다. 의미있는 궁금증입니다!
    대화보기
    • 에비씨
      Me - Base 병합 후 Base - Other 병합하는 것과 크게 다른가요?
    • PassionOfStudy
      merge ㄱ
      ㄴ 2way merge
      ㄴ 3way merge
    • devchun
      감사합니다
    • 댕혁
      제대로 똑같이 하셨다면 강의내용대로 나오는게 정상이긴한데..
      혹시 base와 other에서 D 부분이 완전 같은지 확인해 보세요(공백이 들어가진 않았는지 등)
      대화보기
      • 제로스
        3 way merge!!
      • daebaksong
        C와 D 사이에 유지해야 될 값이 없기때문에 머지하는 과정에서 C D를 같은 덩어리로 보는거 같습니다.

        C와 D 사이에 E값을 넣어서 실행해 보시면 위 표처럼 동작될 겁니다.

        ex)
        Me/Base/Oter / 3 way merge
        A / A / ' ' / ' '
        B / B / B / B
        1 / C / 2 / ?
        E / E / E / E
        ' ' / D / D / ' '
        대화보기
        • error
          @git초보 저도 같은 결과가 출력되네요. master브랜치에서 exp브랜치를 merge하거나 반대로 할때 모두다 같은 결과가 출력됩니다.
          대화보기
          • git초보
            강의가 이해가 잘 안되서, 직접 테스트를 해보았는데 결과부분이 달라서 질문드립니다.

            f1.txt로 강의와 같이 A~D까지 4줄 작성 후 commit을 친다음, exp라는 브랜치를 만든 후 , exp와 master브랜치를

            강의 내용과 동일하게 f1.txt를 변경 후 각각 commit을 하였습니다.

            그 후, master브랜치에서 exp브랜치를 merge시켰는데요...

            3번째, 4번째 줄이 conflict납니다...


            B
            <<<<<<< HEAD
            1

            =======
            2
            D
            >>>>>>> exp

            요렇게요....

            4번째 라인에서 강의는 빈 결과값이 나온다고 말씀하셨는데, 실제 테스트시 4라인이 충돌나는 원인에 대하여 설명 좀 부탁드리겠습니다.
          • 노마드
            네 한번 알아보도록 할게요. 사실 궁금한게 한두가지가 아니어서 제가 좀더 공부를 한뒤에 질문을 드리는게 맞는것 같네요. merge부분은 테스트상황을 만들어서 실습도 해봐야겠구요. 아무튼 항상 좋은 강의 감사합니다.
            대화보기
            • egoing
              저는 3개 라인 단위로 어딘가에서 들었던 기억이 있습니다만 사실일지는 약 20% 정도 정확합니다. 한번 찾아보시고 여기서 알려주시면 저도 큰 도움이 될 것 같아요 ^^
              대화보기
              • 노마드
                답변감사합니다. 그러면 깃이 판단하는 수정된 범위의 최소단위가 라인단위인가요 아니면 함수단위인가요? 예를들어 어떤함수를 설명하신대로 2명이 각각 다른부분을 수정해도 3way에 따라 라인단위로 자동으로 병합해도 문제가 없다는 말씀인지, 아니면 함수단위로 보면 "충돌"상황이어서 사람이 개입을 해야하는 상황인지 궁금합니다.그렇게 생각하는 이유는 함수내부를 라인단위로 자동으로 병합을 해버리면 제생각엔 오류가 날거같거든요, 함수라는게 하나의 기능을 위해 만들어지는 건데, 이걸 라인단위로 병합한다는게 사실 이해가 좀 안되는 부분이기도 하구요, 앞서 질문도 그래서 드린거구요. 실무경험이 없다보니 협업이나 이런면에서 궁금한게 많네요.
                대화보기
                • egoing
                  제가 질문을 정확히 이해한 것인지는 모르겠습니다만 대체로 자동으로 병합했을 때 문제가 일어난 경우는 없었습니다. 아마도 위의 내용보다는 더 섬세한 처리들이 적용되어 있지 않을까요?
                  대화보기
                  • 노마드
                    현시점까지 배운상태에서 궁금한건, 아랫분과 같은 질문입니다만, 수정된 부분이라고해서 다 합쳐버리면 전체적인 프로그램동작에 문제가 생기지 않을까요? 물론 그정도 프로젝트라면 더 큰그림이 있을거라 생각하지만요
                  • rayku
                    "Me" 사용자가 "A" 코드를 수정하지는 않았지만 "Me" 사용자의 프로그램에서는 필요한 코드일때3
                    3 way merge 후에도 "A" 코드가 존재해야 "Me" 사용자의 프로그램이 동작할 수 있는 것이 아닌가요?
                  • Wbbaki Lee
                    고맙습니다 : ) 이해하기 쉽게 표로 잘 정리해주셨네요 ㅎㅎ