2012-11-19 5 views
2

다른 분기에 포함 된 가장 최근의 커밋을 찾고 싶습니다. 역사다른 분기에서 첫 번째 상위 커밋 찾기

A-B-C---E <-master 
    └-F---G <-develop 
    └-H-I <-branch1 

내가 F.의 난 단지 시작점 BRANCH1을 알고 참고, 다른 지점이 아닌 이름을 찾으려면 주어진.

나는

git branch --contains branch1~i 

출력 한 줄 이상,하지만 그것은 낭비 것 때문에 단순히 가장 낮은 i≥0를 확인할 수 있다는 것을 알고. 예를 들어 BRANCH1에 대한

+0

나는 당신이 찾고있는 것을 잘 모르겠다. 가장 초기 (또는 가장 최근)를 찾고 싶습니다. "첫 번째"는 현재 위치와 다른 지점에 포함되어있는 "최초의"또는 "현재 위치에 가장 가까운"것을 의미합니까? 그것은 현재 지점뿐만 아니라 다른 지점에도 포함되어 있습니까? 다이어그램에 실제로 분기가 표시되지 않습니다 (나는 E, G 및 I가 커밋이라고 가정하고 있음). 따라서 어느 것이 세고 있는지 말할 수 없습니다. –

+0

@BrianCampbell 추가 및 설명; 다이어그램은 실제로 너무 부정확했다. – phihag

+0

글쎄, 당신이 원하는 것은'git merge-base branch1 development'이지만, 당신의 지사가 무엇인지 알지 못한다면 그것을하는 쉬운 방법을 모른다. merge-base'를 다른 지점과 비교하고 어떻게 든 "승자"를 선택하는 것입니다 ... – twalberg

답변

3

Git 배포판과 함께 제공되는 post-receive-email 스크립트를 살펴보십시오 (로컬 복사본이 필요한 경우 /usr/share/doc/git-core/contrib/hooks/post-receive-email과 같은 위치에 설치해야합니다). ,

# Consider this: 
    # 1 --- 2 --- O --- X --- 3 --- 4 --- N 
    # 
    # O is $oldrev for $refname 
    # N is $newrev for $refname 
    # X is a revision pointed to by some other ref, for which we may 
    # assume that an email has already been generated. 
    # In this case we want to issue an email containing only revisions 
    # 3, 4, and N. Given (almost) by 
    # 
    # git rev-list N ^O --not --all 
    # 
    # The reason for the "almost", is that the "--not --all" will take 
    # precedence over the "N", and effectively will translate to 
    # 
    # git rev-list N ^O ^X ^N 
    # 
    # So, we need to build up the list more carefully. git rev-parse 
    # will generate a list of revs that may be fed into git rev-list. 
    # We can get it to make the "--not --all" part and then filter out 
    # the "^N" with: 
    # 
    # git rev-parse --not --all | grep -v N 
    # 
    # Then, using the --stdin switch to git rev-list we have effectively 
    # manufactured 
    # 
    # git rev-list N ^O ^X 

이 코멘트에 코너 케이스를 처리하기 위해 자세한 내용이 있습니다 이것은 단지 찾을 주어진 지점에서 새로운 것을 확약하고, 전에 다른 사람에서 볼되지 않은 방법에 대해 설명 긴 설명을 가지고 나머지 스크립트

git rev-parse --not --all | grep -v I | git rev-list --stdin I 

당신이 $(git rev-parse branch1)으로 I을 계산할 수 있습니다 : 기본 경우 당신이 걱정하는 모든 경우 그러나, 이것은 당신에게 대답을해야한다. 결과의 마지막 항목은 커밋 H, 가장 가까운 조상은 H^로 분기 할 수 있습니다.

+0

@phihag 편집 해 주셔서 감사합니다! –

+0

감사! 약간의 수정을 가하면 해결됩니다. – phihag

0

당신은 H-I와 분기의 이름을 알고있는 경우는,

git reflog show --all|grep branch1

찬사에서 가장 높은 번호는 첫 번째는 그 지점에 커밋이다.

+0

글쎄, 이건 분명히 효과가 있지만 반복적 인 i *보다 해커처럼 느껴진다. 하나는 reflog가 질문에 대답 할 필요가 없습니다. 또한,'I' 커밋은 실제로 어떤 지점에도 있지 않을 수도 있고, 여러 가지 지점에있을 수도 있습니다. 그리고'refs/heads/branch1 @'에 대해서 grep을 써서 my_branch11가 일치하지 않게해야합니다. – phihag

관련 문제