주어진 커밋이 포함 된 분기를 나열하는 방법은 무엇입니까?


1087

주어진 커밋을 포함하는 분기를 찾기 위해 git을 어떻게 쿼리 할 수 ​​있습니까? gitk너무 많지 않은 한 일반적으로 가지를 나열합니다.이 경우 "many (38)"또는 이와 유사한 것이 표시됩니다. 전체 목록 또는 적어도 특정 브랜치에 커밋이 있는지 여부를 알아야합니다.



댓글 당 동등한 커밋에 대한 관련 질문 : stackoverflow.com/questions/16304574/…
UpAndAdam

답변:


1470

로부터 자식 분기 매뉴얼 페이지 :

 git branch --contains <commit>

지정된 커밋이 포함 된 분기 만 나열합니다 (지정하지 않은 경우 HEAD). 의미 --list합니다.


 git branch -r --contains <commit>

목록은 원격 지점을 추적 (에서 언급뿐만 아니라 user3941992대답은 "원격 지점에 직접 관계가있는 지역의 지점"입니다 아래 참조).


자식 준비 기사를 참조하십시오.

--contains일정이 지사에 아직 가져 된 커밋 경우 태그는 알아낼 것입니다. 아마도 당신이 적용했다고 생각한 패치에서 커밋 SHA를 얻었거나 메모리 사용을 75 % 줄이는 좋아하는 오픈 소스 프로젝트에 대한 커밋이 아직 있는지 확인하고 싶을 것입니다.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

참고 : 커밋이 원격 추적 분기 에있는 경우 -a옵션을 추가하십시오 .
( 아래 MichielB 의견 )

git branch -a --contains <commit>

MatrixFrog정확한 커밋이 포함 된 분기 만 표시한다고 말합니다 .
어느 분기에 "동등한"커밋이 포함되어 있는지 (즉 어떤 커밋이 해당 커밋을 선택했는지) 알고 싶다면 다음과 같습니다 git cherry.

git cherry 커밋 ID (sha1)가 아닌 변경 세트를 비교 하기 때문에 git cherry로컬로 만든 커밋이 <upstream>다른 커밋 ID 아래 에 적용되었는지 확인할 수 있습니다 .
예를 들어 <upstream>커밋을 직접 푸시하거나 당기지 않고 전자 메일을 통해 패치 를 제공하는 경우에 이런 일이 발생합니다 .

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(여기서, ' -' 로 표시된 커밋은로 표시 되지 않습니다 git cherry. 이는 이미에 있음을 의미 <upstream>합니다.)


3
testsmaster- master따라서 별표 현재 지점입니다.
blueyed

54
여기에는 정확한 커밋이 포함 된 분기 만 표시 됩니다. 어떤 분기에 "동등한"커밋이 포함되어 있는지 (즉, 어떤 분기가 커밋을 고른 지사인지) 알고 싶다면 git cherry: "git cherry가 커밋 ID (sha1)가 아닌 변경 세트를 비교하기 때문에 git cherry를 사용하여 알아낼 수 있습니다. 로컬로 만든 커밋이 다른 커밋 ID 아래에 <업스트림>으로 적용된 경우. 예를 들어 커밋을 직접 푸시하거나 가져 오는 대신 이메일을 통해 <업스트림> 패치를 제공하는 경우에 발생합니다. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog

62
-a원격 브랜치를 확인 하는 매개 변수를 추가하십시오 .
Raman

28
당신은 또한 할 수 있습니다 git tag --contains <commit>. 커밋이 포함 된 모든 태그 검색을 참조하십시오 . .
Andrew Marshall

5
를 들어 git cherry일부 @UpAndAdam 여기에 질문을 : stackoverflow.com/questions/16304574/...는 , 슬프게도, 문제는 (아직) 응답되지 않았습니다.
adeelx

22

당신은 실행할 수 있습니다 :

git log <SHA1>..HEAD --ancestry-path --merges

출력의 마지막 커밋에 대한 의견에서 원래 지점 이름을 찾을 수 있습니다.

예:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

6
좋은! 나는 git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1이것을 한 줄로 얻었습니다
James EJ

1
순수한 git 명령을 사용하려면 다음을 사용할 수 있습니다.git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

참고 :이 샤 가장 최근의 마스터 / foo는 분기 (HEAD)에 커밋 커밋 할 때 ... 당신이 할 수없는 A..B단지 해달라고 사용을, 범위를 커밋 그래서 :: 같은 범위 git log HEAD --oneline -1>를 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode

이 git repo가 ​​하위 모듈이고 분리 된 HEAD 문제를 해결하려고하면 선호하는 분기에 대한 어려운 질문이 있습니다 ... 이전 예제 master에서는이 목록에 있으면 항상 선호 한다고 말할 수 있습니다 . 거기에서 덜 명확합니다. .gitmodules 파일에서 git branch를 시도하고 읽을 수 git config -f .gitmodules submodule.src/foo/submodule.branch있습니다. 이것은 오래 지속되는 포크 / 홍보 일 수 있습니다. CD를 루트로 리포 지하여 실행할 수 있습니다 git config submodule.src/foo/submodule.branch. superprojects 현재 자식 분기를 사용할 수도 있습니다.
Devin G Rhode

옆으로 작은로서 : git config submodule.src/foo/submodule.branch의 repo 로컬 .gitconfig 파일을 포함하여 자식 CONFIGS,의 다양한에 의해 영향을받을 수있다. (달리기 필요 git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.