차이 무엇 git merge
과 git rebase
?
차이 무엇 git merge
과 git rebase
?
답변:
가정 원래 3 커밋이 있었다, A
, B
, C
:
그런 다음 개발자 Dan은 commit을 작성 D
했고 개발자 Ed는 commit을 작성했습니다 E
.
분명히,이 갈등은 어떻게 든 해결되어야합니다. 이를 위해 두 가지 방법이 있습니다.
합병 :
두 커밋 D
과는 E
아직 여기있다, 그러나 우리는 커밋 병합을 만들 M
모두으로부터 상속 변경 D
과 E
. 그러나 이것은 많은 사람들이 혼동되는 다이아몬드 모양을 만듭니다 .
REBASE :
R
실제 파일 내용이 M
위 의 merge commit의 내용과 동일한 commit을 만듭니다 . 그러나 커밋 E
은 존재하지 않는 것처럼 제거합니다 (점-사라지는 선으로 표시). 이러한 소멸로 인해 E
개발자 Ed에 로컬이어야하며 다른 저장소로 푸시 된 적이 없어야합니다. rebase의 장점은 다이아몬드 모양을 피하고 역사는 좋은 직선을 유지한다는 것입니다. 대부분의 개발자는 그것을 좋아합니다!
git merge
커밋을 인터리브하지 않습니다 (그러나 보았을 때 나타날 수 있습니다 git log
). 대신, git merge
Dan과 Ed의 개발 이력은 한 번에 하나의 관점에서 볼 때 그대로 유지됩니다. git rebase
Dan이 먼저 작업 한 것처럼 보이고 Ed는 그를 따라갔습니다. 두 경우 모두 (병합 및 리베이스) 실제 결과 파일 트리는 완전히 동일합니다.
나는 git에 대해 내가 싫어하는 10 가지 발췌문을 정말 좋아합니다 (두 번째 예에서 rebase에 대한 간단한 설명을 제공합니다).
3. Crappy 문서
맨 페이지는 전능 한“f *** you” 1 입니다. 사용자가 아닌 컴퓨터 과학자의 관점에서 명령을 설명합니다. 지목 사항:
git-push – Update remote refs along with associated objects
인간에 대한 설명은 다음과 같습니다.
git-push – Upload changes from your local repository into a remote repository
업데이트, 다른 예 : (cgd 덕분에)
git-rebase – Forward-port local commits to the updated upstream head
번역:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
그리고 우리는
git-merge - Join two or more development histories together
좋은 설명입니다.
1. 원본에서 무수정
개인적으로 나는 표준 다이어그램 기법이 그다지 도움이되지 않는다고 생각합니다. 화살표는 항상 저에게 잘못된 길을 가리키는 것 같습니다. (일반적으로 각 커밋의 "부모"를 가리키며 시간이 지나면 이상합니다.)
단어로 설명하려면 :
내가 이해하지 못하는 이유 때문에 Git의 GUI 도구는 개별 병합을 추상화하여 병합 이력을보다 깔끔하게 제시하기 위해 많은 노력을 기울이지 않았습니다. "깨끗한 기록"을 원하면 리베이스를 사용해야합니다.
rebase 만 사용하는 프로그래머 와 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 가지"의 저자입니다 )
인정되고 가장 많이 찬성 된 답변이 훌륭하지만, 나는 단어로만 차이점을 설명하는 것이 유용하다는 것을 알았습니다.
합병
리베이스
요약 : 가능하면 리베이스가 거의 항상 좋습니다. 메인 지점으로의 재 통합이 쉬워집니다.
때문에? feature 주요 작업과 관련하여 기능 작업을 하나의 큰 '패치 파일'(일명 diff) 로 표시 할 수 있으며 여러 부모를 '설명'할 필요가 없습니다. 두 개 이상, 하나의 병합에서 발생하지만 더 많은 경우 여러 번의 합병이있었습니다. 병합과 달리 여러 리베이스는 합산되지 않습니다. (또 다른 큰 플러스)
git rebase vs merge 에 대한 흥미로운 기사를 찾았 습니다 .