힘내 : 두 가지의 가장 일반적인 공통 조상 찾기


844

두 가지 Git 브랜치의 가장 일반적인 공통 조상을 찾는 방법은 무엇입니까?


3
가장 최근을 정의하십시오 : 실제 시간, 커밋 수, 기타 메트릭?
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

2
관련 (십자 간 병합) : stackoverflow.com/questions/26370185/…
jub0bs

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 그것은 어떤 지표에서도 같지 않습니까?
YakovL

@YakovL 나는 분기로 인해 커밋 객체에 임의의 커밋 날짜를 설정할 수 있기 때문에 믿지 않습니다. 그 날짜 자체는 원하는 것이 아닙니다.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 트리에서 마지막 공통 커밋 이전에 타임 스탬프가 오래된 커밋이있는 경우에만 다를 수 있습니다. 덜 간단한 예를 제공 할 수 있습니까?
YakovL

답변:


1019

찾고 있습니다 git merge-base. 용법:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

85
이것은 가장 최근의 공통 조상을 발견한다는 점에 유의하십시오. 이것은 질문자가 원하는 것이므로 +1입니다. 그냥 찾으려고 여기 경우 누구라도, 그것을 온다 지적 오래된 (나처럼) 공통 조상을 -하는, 참조 : stackoverflow.com/questions/1527234/...
lindes

16
@funroll : 또는 그 약칭 :git log master...HEAD
CB Bailey

17
@lindes 가장 오래된 공통 조상이 초기 커밋이 아닌가?
Thorbjørn Ravn Andersen 님이

8
@ ThorbjørnRavnAndersen, 예, 그렇게 가정합니다 ... 설명의 어려움은 git이 Directed Acyclic Graph를 사용한다는 사실과 관련이 있지만 기술적으로 그렇지 않은 트리로 종종 생각됩니다. 내 말에 더 조심하기 위해, 나는 당신이 "분기"의 첫 번째 인스턴스의 부모를 분기하려는 경우에 대해 이야기하고있었습니다 ... 다시 병합하고 다시 나누는 여러 지점이있을 수 있기 때문에, 이것은 이 중 "가장 오래된"것이지만, 가장 오래된 조상은 아닙니다. 항상 초기 커밋입니다.
lindes

5
이 질문은 가지 의 공통 조상을 찾는 것에 관한 것이지만 , 개 이상의 가지 의 공통 조상을 원하는 사람 --octopus은 올바른 결과를 얻으려면 깃발을 통과해야한다는 점에 유의해야합니다 . 명백하지만 잘못 git merge-base branch1 branch2 branch3은 커밋을 제공하지만 문서의 토론 섹션에 설명 된 것처럼 반드시 세 가지 가지의 공통 조상 은 아닙니다 .
Mark Amery

46

git diff master...feature

현재 (아마도 커밋 된) 기능 브랜치의 모든 새로운 커밋을 보여줍니다.

man git-diff 다음과 같은 서류 :

git diff A...B

와 같다:

git diff $(git merge-base A B) B

그러나 ...입력하고 기억하기가 더 쉽습니다.

Dave가 언급했듯이 의 특별한 경우는 HEAD생략 할 수 있습니다. 그래서:

git diff master...HEAD

와 같다:

git diff master...

현재 분기가 인 경우 충분합니다 feature.

마지막으로, 그 순서가 중요하다는 것을 기억하십시오! 수행 중이 아닌 git diff feature...master변경 사항이 표시됩니다 .masterfeature

더 많은 git 명령이 해당 구문을 지원하기를 원하지만 그렇게 생각하지 않습니다. 그리고 일부는 심지어 다른 의미를 가지고 ...: 망할 놈의 "..." ".."트리플 점 두 점 사이의 차이는 범위는 무엇 커밋인가?


8
아니면 git diff master...특별한 경우HEAD
Dave

"..."는 powershell에서 저에게 효과가 없었습니다. 재미있는 것은 git 콘솔에서 작동했을 것입니다. 아마 repo가 ​​완료되지 않았을 수도 있습니다. 나는이 지점 : 병합 수 있다는 약간 회의적이었다
Moiz 아메드

1
와. 꽤 놀랍습니다. 체크 아웃 한 적이 없어서 원하는 지점이 로컬 리포지토리에 존재하지 않으면 간단하게 할 수 있습니다git diff origin/branchname...
Mark Ch

25

이전 답변에서 언급했듯이 다음과 같이 git merge-base작동합니다.

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

그러나 myfeature현재 분기가 일반적인 경우 use를 사용할 수 있습니다 --fork-point.

$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

이 인수는 충분히 최신 버전의 git에서만 작동합니다. 그러나 불행히도 항상 작동하는 것은 아니며 왜 그런지 명확하지 않습니다. 이 답변 끝에 언급 된 제한 사항을 참조하십시오 .


전체 커밋 정보를 보려면 다음을 고려하십시오.

$ git log -1 $(git merge-base --fork-point develop) 

나는있다 git version 2.14.1.windows.1. 실행 git merge-base --fork-point branch2지점으로 (자신의 커밋과) 것을 내가 아는 어떤 결과를 양보하지 않는 현재의 지점에서 포크했다, 반면 git merge-base branch1 branch2올바르게 포크 점을 보여줍니다. 무엇이 문제 일 수 있습니까?
ADTC

@ADTC Checkout branch2을 실행 한 다음 실행하십시오 git merge-base --fork-point branch1.
Acumenus

@ADTC 그래픽 커밋 뷰어 (예 : gitk등)를 사용하여 트리가 어떻게 보이는지 확인하십시오. 아마 당신은 당신의 대답을 얻을 것입니다.
Acumenus

그래픽으로 볼 때 나무에 이상한 점이 없습니다. 경로를 추적하고의 결과와 일치하는 공통 조상을 찾을 수 있습니다 git merge-base branch1 branch2. 그러나 이상한 점 --fork-point은 어느 쪽도 제공하지 않는다는 것입니다. 의도 한대로 작동하는지 확인 했습니까?
ADTC

1
@ADTC와 동일합니다. 'git log -1 $ (git merge-base --fork-point anotherBranch)'명령은 git 버전 2.16.2.windows.1을 사용한 결과를 표시하지 않습니다.
masinger

10

함께 gitk사용하면 그래픽으로 두 가지를 볼 수 있습니다

gitk branch1 branch2

그리고 두 가지의 역사에서 공통 조상을 쉽게 찾을 수 있습니다.


6
모든 경우에 모든 것을 시각적으로 수행 할 수있는 것은 아닙니다. 프로그래밍 방식으로 자동화해야하는 이유가 있습니다.
ADTC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.