git rebase는 언제 충돌합니까?

Sep 28 2020

이 포럼, progit, Youtube 및 rebase에 대한 일부 무작위 블로그에서 여러 게시물을 읽고 있습니다.

이 주제를 결론 짓는 가장 일반적인 형식은 다음과 같습니다.

- A - B - C   Master
   \  D - E Topic

그리고 나는 수행한다 :

git checkout Topic
git rebase Master

이상적으로는 다음과 같습니다.

- A - B - C - D' - E' Master, Topic

그러나 두 가지 우려 사항은 다음과 같습니다.

  1. D '= D, E'= E입니까?
  2. git rebase 충돌이란 무엇입니까?

제에 대하여 우려하고 이 후 ,

  1. Rebase는 D와 E, 무엇보다도 복잡한 입력으로 병합을 수행합니다.

예를 들어, D로 갈 때 게시물에 따라 내가 맞다면

  1. HEAD가 C에 분리됨
  2. Git은 A에서 D 로의 변경 사항과 A에서 C 로의 변경 사항을 비교합니다.
  3. 병합 후 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

그들은 같은 줄을 바꾸지 않습니까?

답변

TimBiegeleisen Sep 28 2020 at 20:27

위의 예에서 병합하거나 리베이스하면 병합 충돌이 발생할 수 있습니다. 둘 중 하나만 충돌이있을 수 있습니다. 리베이스가 수행하는 작업을 이해하려면 리베이스 Topic이후의 모습 을 보여주는 다음 다이어그램을 고려하십시오 Master.

Topic:  -- A -- B -- C -- D' -- E'

여기서 아포스트로피는 D및 E커밋이의 새 기반에 다시 적용 되었음을 나타냅니다 Master. 각 커밋이 다시 적용되면 병합 충돌이 발생할 가능성이 있습니다. 따라서 N 커밋을 다시 적용하는 경우 N 세트의 병합 충돌이있을 수 있습니다. 반면에 병합은 항상 최대 한 세트의 병합 충돌을 발생시킵니다. 이것이 당신의 문제라면 리베이스보다 병합을 선호 할 수 있습니다.