git rebase는 언제 충돌합니까?
이 포럼, progit, Youtube 및 rebase에 대한 일부 무작위 블로그에서 여러 게시물을 읽고 있습니다.
이 주제를 결론 짓는 가장 일반적인 형식은 다음과 같습니다.
- A - B - C Master
\ D - E Topic
그리고 나는 수행한다 :
git checkout Topic
git rebase Master
이상적으로는 다음과 같습니다.
- A - B - C - D' - E' Master, Topic
그러나 두 가지 우려 사항은 다음과 같습니다.
- D '= D, E'= E입니까?
- git rebase 충돌이란 무엇입니까?
제에 대하여 우려하고 이 후 ,
- Rebase는 D와 E, 무엇보다도 복잡한 입력으로 병합을 수행합니다.
예를 들어, D로 갈 때 게시물에 따라 내가 맞다면
- HEAD가 C에 분리됨
- Git은 A에서 D 로의 변경 사항과 A에서 C 로의 변경 사항을 비교합니다.
- 병합 후 git은 D ', D 및 E를 비교합니다.
그리고 이것은 나를 가장 혼란스럽게합니다. 2 개 이상의 커밋을 포함하는 병합이 왜 발생합니까? 또한 충돌은 어떻게 나타 납니까?
편집하다:
몇 가지 명령을 실행했습니다. 다음을 참조하십시오.
git init
Random.txt 콘텐츠 생성 : 마스터 1
git add Random.txt
git commit -m "Master 1"
새 분기 만들기
git checkout -b rebase_conflict
Random.txt 내용 변경 : 1
git add Random.txt
git commit -m "Conflict 1"
임의 변경. txt 내용 : 2
git add Random.txt
git commit -m "Conflict 1"
마스터로 전환
git checkout master
Random.txt 콘텐츠 변경 : 마스터 2
git add Random.txt
git commit -m "Master 2"
분기 전환 및 리베이스
git checkout rebase_conflict
git rebase master
충돌 오류 가져 오기 Random.txt 내용 변경 : 1
git add Random.txt
git rebase --continue
이 시점에서 다른 리베이스 충돌이 예상됩니다. 논리에 따르면
-- Master 1 -- Master 2
\ -- Conflict 1 -- Conflict 2
첫 번째 리베이스 이후
-- Master 1 -- Master 2 -- Conflict 1'
\ -- Conflict 1 -- Conflict 2
이 단계에서 나는 Conflict 1 '위에 새로운 커밋을 기대하고 있습니다. Conflict 2와 Conflict 1 '간에 병합 충돌이 있지 않습니까?
Conflict 1 'Random.txt 콘텐츠 : 1, 반면
충돌 2 Random.txt 콘텐츠 : 2
그들은 같은 줄을 바꾸지 않습니까?
답변
위의 예에서 병합하거나 리베이스하면 병합 충돌이 발생할 수 있습니다. 둘 중 하나만 충돌이있을 수 있습니다. 리베이스가 수행하는 작업을 이해하려면 리베이스 Topic이후의 모습 을 보여주는 다음 다이어그램을 고려하십시오 Master.
Topic: -- A -- B -- C -- D' -- E'
여기서 아포스트로피는 D및 E커밋이의 새 기반에 다시 적용 되었음을 나타냅니다 Master. 각 커밋이 다시 적용되면 병합 충돌이 발생할 가능성이 있습니다. 따라서 N 커밋을 다시 적용하는 경우 N 세트의 병합 충돌이있을 수 있습니다. 반면에 병합은 항상 최대 한 세트의 병합 충돌을 발생시킵니다. 이것이 당신의 문제라면 리베이스보다 병합을 선호 할 수 있습니다.