커밋 ID가 주어지면 현재 분기에 커밋이 포함되어 있는지 확인하는 방법은 무엇입니까?


155

내가하려고하는 것은 버전 확인입니다. 코드가 최소 버전 위에 유지되도록하고 싶습니다. 따라서 현재 분기에 지정된 커밋이 포함되어 있는지 알 수있는 방법이 필요합니다.



10
지정된 커밋이 포함 된 모든 분기 를 찾는 방법은 제안 된 복제본을 참조하십시오 . 현재 분기에 commit C 가 포함되어 있는지 확인하려면 "plumbing"명령을 사용하십시오 git merge-base --is-ancestor. 현재 분기 포함 C를 경우 C가 의 조상입니다 HEAD그래서 :if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
torek

1
안녕하세요, 정답으로 선정 될 수 있도록 답변으로 제출해주세요 =)
Ben

1
@Ben-커뮤니티 위키 답변으로 추가했습니다.
Zitrax

1
@Remover : 쉘 스크립트에서 0은 true, 0이 아닌 false : C 규칙의 반대입니다. /bin/true원래 exit 0/bin/false로 구현 되었습니다 exit 1. (현대 조개는 내장되어 있습니다.)
torek

답변:


217

이 결과를 얻는 방법에는 여러 가지가 있습니다. 첫 번째 순진한 옵션은을 사용 git log하여 특정 커밋 을 사용 하고 검색하는 grep것이지만 항상 정확한 것은 아닙니다

git log | grep <commit_id>

git branch주어진 COMMIT_ID사용하여 포함 된 모든 가지를 찾기 위해 직접 사용하는 것이 좋습니다

git branch --contains $COMMIT_ID

다음 단계는 현재 브랜치를 git 1.8.1사용하는 것입니다.

git symbolic-ref --short HEAD

그리고 같이 결합

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

그러나 위의 명령은 true 또는 false를 반환하지 않으며 커밋이 현재 분기에 있으면 종료 코드 0을 반환하고 그렇지 않은 경우 종료 코드 1을 반환하는 짧은 버전이 있습니다

git merge-base --is-ancestor $COMMIT_ID HEAD

종료 코드는 좋지만 문자열 true이나 false답변으로 조금 더 추가 한 다음 ifbash에서 결합 해야합니다.

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi

9
맞지 않습니다. 는 grep경우 잘못된 반응을 초래할 수 git log(가) 그것이 언급 있어요 예, 다른 이유로 SHA 커밋 다른 지점에서 포트의 결과로 커밋 메시지를 언급하고있다.
Adam Spiers

1
수정했거나 다른 옵션이 추가되었습니다.
JiriS

3
내장 git 툴셋을 사용하는 질문에 대한 의견을 참조하십시오. stackoverflow.com/questions/43535132/…
Ben

2
첫 번째 옵션이 마음에 들지만 Adam의 반대 의견을 배제하기 위해 옵션 --format=format:%H을에 추가합니다 git log.
PJSCopeland

71

특정 커밋이 포함 된 지점 목록을 가져옵니다.

# get all the branches where the commit exists
$ git branch --contains <commit-id>

지점에 특정 커밋이 있는지 확인하십시오.

# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>

분기 (예를 들어, 검색 feature포함) 의 정확한 일치를 .

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

예를 들어, 당신이 3 개 지역 지점 호출이있는 경우 feature, feature1, feature2다음

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

당신은 또한 모두 검색 할 수 localremote지점 (사용 -a) 또는에서만 remote지점 (사용 -r).

# search in both 'local' & 'remote' branches  
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'

1
grep(가) 그 이름도 포함 커밋 포함하는 다른 지점이있는 경우도 여기에 잘못된 반응을 초래할 수 <branch-name>문자열로.
Adam Spiers

1
예 @AdamSpiers, 다음에 의해 분기 이름과 정확히 일치하도록 답변을 업데이트했습니다grep -E '(^|\s)branchname$'
Sajib Khan

1
관련 질문에이 댓글 추가하는 것이 유용 할 수 있습니다 -r( "원격") 또는 -a( "모든")하는 옵션이 git branch지역의 repo 복제에 복제 할 수 없습니다 지점을 찾도록합니다.
sxc731

이것은 나를 위해 작동하지 않았다, 나는 필요했다 git branch --all --contains <commit-id>
Arthur Tacca

7

@torek이 답변으로 추출한 주석 :

지정된 커밋이 포함 된 모든 분기를 찾는 방법은 제안 된 복제본을 참조하십시오.

현재 분기에 commit C가 포함되어 있는지 확인하려면 "plumbing"명령을 사용하십시오 git merge-base --is-ancestor. C가 HEAD의 조상이면 현재 분기에는 C가 포함됩니다.

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(측면 참고 : 쉘 스크립트에서 0을 종료하는 명령은 "true"이고 0이 아닌 종료 명령은 "false"입니다.)


4

커밋이 포함 된 로컬 분기를 나열하려면

git branch --contains <commit-id>

커밋을 포함하는 remote 만 포함하여 모든 분기를 나열하려면 다음을 수행하십시오.

git branch -a --contains <commit-id>

마찬가지로 커밋이 특정 분기에 있는지 확인하려면 다음을 수행하십시오.

git log <branch> | grep <commit_id>

분기가 존재하지 않으면 로컬로 분기 이름 앞에 접두사를 붙입니다. origin/


의 의견에 투표했습니다 -a. 그 조언에 감사드립니다!
Thorkil Værge

3

그래 또 다른 대안 :

git rev-list <branch name> | grep `git rev-parse <commit>`

그것은 또한 같은 로컬로 캐시 된 원격 지점에서 작동 것이기 때문에 이것은 나를 위해 잘 작동 remotes/origin/master, 어떤에git branch --contains 작동하지 않습니다를.

여기에는 "현재 지점"에 대한 OP의 질문 이상의 내용이 포함되어 있지만이 질문의 "모든 지점"버전을 묻는 것이 멍청하다는 것을 알았습니다.


1
git branch --contains <commit-id> --points-at <target branch name>

해당 분기에 커밋 ID가 있으면 대상 분기 이름을 반환합니다. 그렇지 않으면 명령이 실패합니다.


nope ...error: malformed object name 'branch-name'
bbodenmiller

1
2 가지 경우에 오류가 발생할 수 있습니다. 1 지정된 <branch name>에 지정된 <commit id>가 포함되지 않은 경우 2. Checkout <branch name>이 지정된 <branch name>이
아님

0

이 질문에는 좋은 스크립트 답변이 있으므로 즐겨 찾기를 추가하고 있습니다.

이것은 브랜치가 각각을 포함하는 마지막 $n커밋에 대해 보여줍니다 $br.

br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'

이것은 비슷하지만 가지 목록에 대해서도 동일합니다.

br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.