programing

'git merge'와 'gitrebase'의 차이점은 무엇입니까?

subpage 2023. 5. 24. 22:09
반응형

'git merge'와 'gitrebase'의 차이점은 무엇입니까?

사이에 무슨 차이가 있습니까?git merge그리고.git rebase?

원래 3번의 커밋이 있었다고 가정하면,A,B,C:

A-B-C

커밋을 .D는 커밋을 .E:

A-B-C-D-E

분명히, 이 갈등은 어떻게든 해결되어야 합니다.이를 위해 두 가지 방법이 있습니다.

병합:

A-B-C-D-E-M

다 커밋 두밋모두D그리고.E 커밋 아직기 여 병 커 만 듭 다 을 니 밋M두 가지 모두에서 변경 사항을 상속합니다.D그리고.E하지만, 이것은 많은 사람들이 혼란스럽게 생각하는 다이아몬드 모양을 만듭니다.

기본 재배치:

A-B-C-D-E-R

는 커밋을 .R한 것은 입니까?M 커밋 ㅠㅠ 요. 하지만, 우리는 커밋을 제거합니다.E마치 존재하지 않았던 것처럼 (점으로 표시됨 - 사라지는 선).이런 폐단 때문에E개발자 Ed의 로컬에 있어야 하며 다른 리포지토리로 푸시되지 않아야 합니다.리베이스의 장점은 다이아몬드 모양을 피할 수 있고 역사는 직선으로 유지된다는 입니다 - 대부분의 개발자들은 그것을 좋아합니다!

개인적으로 저는 표준 다이어그램 기술이 별로 도움이 되지 않는다고 생각합니다. 화살표는 항상 저에게 잘못된 방향을 가리키는 것 같습니다. (일반적으로 각 커밋의 "부모"를 가리키는데, 이는 결국 시간이 거꾸로 되어 이상합니다.)

말로 설명하기:

  • 당신의 가지를 그들의 가지에 재배치할 때, 당신은 Git에게 당신이 그들의 가지를 깨끗하게 체크한 것처럼 보이게 하라고 말하고, 거기서부터 시작해서 당신의 모든 일을 했습니다.이는 누군가 검토할 수 있는 깨끗하고 개념적으로 간단한 변경 패키지를 만듭니다.분기에 새 변경사항이 있을 때 이 프로세스를 다시 반복할 수 있으며, 분기의 "끝"에 항상 새 변경사항 집합이 표시됩니다.
  • 분기를 분기로 병합할 때 두 분기 기록을 이 지점에서 함께 묶습니다.나중에 더 많은 변경 사항을 적용하여 이 작업을 다시 수행하면 인터리브 방식의 기록 스레드가 생성됩니다. 일부 변경 사항, 일부 변경 사항, 일부 변경 사항, 일부 변경 사항.어떤 사람들은 이것이 지저분하거나 바람직하지 않다고 생각합니다.

이해할 수 없는 이유로, Git의 GUI 도구는 개별 병합을 추상화하면서 병합 기록을 더 깨끗하게 표시하기 위해 노력한 적이 없습니다.따라서 "깨끗한 내역"을 원한다면, rebase를 사용해야 합니다.

저는 리베이스만 사용하는 프로그래머들과 리베이스를 사용하지 않는 다른 프로그래머들의 블로그 게시물을 읽은 기억이 있는 것 같습니다.

저는 이것을 정의로운 단어들의 예를 들어 설명해 보겠습니다.프로젝트의 다른 사용자가 사용자 인터페이스에서 작업하고 있고 사용자가 문서를 작성하고 있다고 가정해 보겠습니다.리베이스가 없으면 이력이 다음과 같이 표시될 수 있습니다.

Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md

즉, 문서 커밋 중간에 병합 및 UI 커밋을 수행합니다.

코드를 병합하는 대신 마스터에 코드를 재배치하면 다음과 같습니다.

Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger

이 맨 위에 있고 이 맨 위에 .master분점.

(거부자: 저는 다른 답변에서 언급된 "Git에 대해 싫어하는 10가지" 게시물의 작성자입니다.)

대부분의 사람들이 인정하고 지지하는 답변은 훌륭하지만, 저는 단어로만 그 차이를 설명하는 것이 유용하다고 생각합니다.

합병하다

  • "좋아요, 우리는 우리 저장소의 두 가지 다른 상태를 개발했습니다.그것들을 함께 병합해 봅시다.부모가 둘이고, 그 결과 하나는 자식."

리베이스

  • "메인 분기(이름에 상관없이)의 변경사항을 내 피쳐 분기에 지정합니다.실제로 메인 브랜치의 현재 상태에 대해 나중에 기능 작업이 시작된 것처럼 가장하여 이 작업을 수행합니다.
  • "변경 내역을 다시 작성하여 이를 반영합니다."(일반적으로 버전 관리는 지정된 내역을 변경하지 않는 전부이기 때문에 변경 내용을 강제로 푸시해야 합니다.)
  • "아마도 제가 조사한 변화가 제 업무와 거의 관련이 없다면, 제가 저의 커밋을 다르게 본다면, 역사는 실제로 크게 바뀌지 않을 것입니다('패치'를 생각할 수도 있습니다).

요약:가능하면 기본 재배치가 거의 항상 더 좋습니다.메인 브랜치로의 재통합이 용이해집니다.

왜냐하면?◦ 피쳐 작업은 여러 부모를 '접두사'할 필요 없이 메인 분기와 관련하여 하나의 큰 '접두사 파일'(일명 diff)로 표시될 수 있습니다.하나의 병합에서 최소 두 개, 그러나 여러 개의 병합이 있는 경우 더 많을 수 있습니다.병합과 달리 여러 개의 기본 재배치는 합산되지 않습니다. (또 다른 큰 플러스)

Gitrebase가 병합에 가까워졌습니다.기본 재배치의 차이점은 다음과 같습니다.

  • 로컬 커밋이 분기에서 일시적으로 제거됩니다.
  • 허풍을 떨다
  • 모든 로컬 커밋을 다시 삽입합니다.

즉, 모든 원격 커밋 후에 모든 로컬 커밋이 끝으로 이동됩니다.병합 충돌이 있으면 이를 해결해야 합니다.

사이에 무슨 차이가 있습니까?merge그리고.rebase?

공식 Git 매뉴얼을 읽으면 "베이스를 다른 베이스 브랜치 에 커밋을 다시 적용"하는 반면, "합병은 두 개 이상의 개발 기록을 함께 결합"하는 것으로 명시되어 있습니다.즉, 병합과 재배치의 주요 차이점은 다음과 같습니다.merge역사를 그대로 보존하고 있습니다rebase다시 씁니다.

이 문장들을 나란히 예를 들어 상황에 맞게 설명해 보겠습니다!

병합과 보강재의 비교

와 같이 위서설바명와같이한에,같이▁the▁as,merge운영은 새로운 단일 병합 커밋(C7)을 생성하여 분기를 서로 얽히게 하여 다이아몬드 모양의 비선형 이력을 발생시켰습니다. 즉, 발생한 내역을 그대로 보존하는 것입니다.이 결과를 다음의 결과와 비교함으로써.rebase병합 커밋이 생성되지 않은 대신 두 커밋 C5와 C6C4 위에 되감겨져 바로 다시 적용되어 기록이 선형으로 유지되는 것을 확인할 수 있습니다.

두의 커밋을 살펴보면 알 수 .rebase진정으로 역사를 다시 씁니다.

주목할 가치가 있음

당신이 언제든지rebase분기, 내용이 동일하더라도 항상 새 커밋이 생성됩니다! 포인터가 참조하지 에서 삭제됩니다.", " " " " " " " " " " (" " (" "/" ") " " " " " " " (" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "

큰 힘에는 큰 책임이 따릅니다.

우리는 rebase가 기록을 다시 쓰는 반면 merge는 기록을 보존하는 방법을 보았습니다.하지만 이것은 더 넓은 의미에서 무엇을 의미할까요?그리고 두 작업에는 어떤 가능성과 잠재적인 단점이 있습니까?

충돌하는 변경 사항

예를 들어, 여러분이 변화를 통합하기 위해 몇 가지 끔찍한 갈등을 겪었다고 가정해 보겠습니다.병합 시나리오에서는 C7 커밋에서 한 번만 충돌을 해결하면 됩니다.반면에 기본 재배치를 사용하면 각 커밋(C5 C6)에서 유사한 충돌을 다시 적용할 때 해결해야 할 수도 있습니다.

게시된 분기

재배치와 관련된 또 다른 잠재적인 문제는 재배치 중인 분기가 이미 원격으로 게시되었고 다른 사용자가 이를 기반으로 작업을 수행한 경우에 발생합니다.그런 다음, 당신의 지점이 앞에 있고 뒤에 있다고 Git가 말해줄 것이기 때문에, 당신의 지점을 재조정하는 것은 모든 관련 당사자들에게 심각한 혼란과 두통을 야기할 수 있습니다.이 경우 기본 재배치 플래그(git pull --rebase)를 사용하여 원격 변경을 풀링하면 일반적으로 문제가 해결됩니다.

또한 이미 게시된 분기의 기본을 변경할 때마다 다른 사용자가 해당 분기를 기반으로 하지 않은 경우에도 원격 서버로 업데이트를 가져오려면 해당 분기를 강제로 밀어 기존 원격 참조를 완전히 덮어써야 합니다.

데이터 손실(사용자에게 유리)

마지막으로, rebase는 기록을 다시 작성하고 merge는 기록을 보존하므로 rebase 시 실제로 데이터가 손실될 수 있습니다.새 커밋이 다시 적용되면 이전 커밋은 삭제됩니다(결국 가비지 수집 이후).이와 같은 특성이 리베이스를 매우 강력하게 만드는 이유입니다. 리베이스를 공개적으로 사용하기 전에 개발 기록을 정리할 수 있습니다.

결론

하는 동안에merge잠재적인 데이터 손실의 관점에서 안전하게 사용할 수 있으며 사용을 보다 쉽게 느낄 수 있습니다.은 다은관가장일반문인방데제도지되다몇니포가입과 된 가장 데 이 될 수 있는 몇 지침입니다.rebase.

  • 원격으로 게시된 분기를 기본 재배치하지 않음...
  • …자신만이 작업하고 있다는 것을 알지 못하는 한(그리고 안전하게 밀어내기)
  • 기본 재배치를 수행하기 전에 기본 재배치하려는 분기 끝에서 백업 분기를 생성하면 결과를 쉽게 비교할 수 있고 필요한 경우 기본 재배치 이전 상태로 다시 이동할 수 있습니다.

출처: 위의 발췌는 Git Merge와 Rebase의 차이 - 그리고 당신이 관심을 가져야 하는 이유라는 주제에 대한 이 전체 길이의 게시물에서 발췌한 것입니다.

이해하기 쉽도록 제 모습을 볼 수 있습니다.

기본 재배치는 커밋 해시를 변경하므로 충돌을 방지하려면 분기가 안정적으로 완료/완료될 때 기본 재배치를 사용하십시오.

여기에 이미지 설명 입력

Gitrebase vs merge에 대한 정말 흥미로운 기사를 하나 발견했습니다. 여기서 공유하려고 생각했습니다.

  • 기록을 발생한 것과 완전히 동일하게 보려면 병합을 사용해야 합니다.병합은 기록을 보존하는 반면 기본 재배치는 기록을 다시 씁니다.
  • 병합은 기록에 새 커밋을 추가합니다.
  • 기본 재배치는 복잡한 기록을 간소화하는 데 더 좋습니다. 대화형 기본 재배치를 통해 커밋 기록을 변경할 수 있습니다.

피쳐 분기 변경 사항을 메인 분기로 전송하려는 경우 피쳐 분기에서 커밋을 3번 수행했다고 가정합니다.두 가지 옵션이 있습니다.

  1. git merge을 1개커밋 만.
  2. git rebase의 커밋을 .

언급URL : https://stackoverflow.com/questions/16666089/whats-the-difference-between-git-merge-and-git-rebase

반응형