내가하려고하는 것은 버전 확인입니다. 코드가 최소 버전 위에 유지되도록하고 싶습니다. 따라서 현재 분기에 지정된 커밋이 포함되어 있는지 알 수있는 방법이 필요합니다.
답변
이 결과를 얻는 방법에는 여러 가지가 있습니다. 첫 번째 순진한 옵션은을 사용 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
답변으로 조금 더 추가 한 다음 if
bash에서 결합 해야합니다.
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
답변
특정 커밋이 포함 된 지점 목록을 가져옵니다.
# 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
당신은 또한 모두 검색 할 수 local
및 remote
지점 (사용 -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$'
답변
@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”입니다.)
답변
커밋이 포함 된 로컬 분기를 나열하려면
git branch --contains <commit-id>
커밋을 포함하는 remote 만 포함하여 모든 분기를 나열하려면 다음을 수행하십시오.
git branch -a --contains <commit-id>
마찬가지로 커밋이 특정 분기에 있는지 확인하려면 다음을 수행하십시오.
git log <branch> | grep <commit_id>
분기가 존재하지 않으면 로컬로 분기 이름 앞에 접두사를 붙입니다. origin/
답변
그래 또 다른 대안 :
git rev-list <branch name> | grep `git rev-parse <commit>`
그것은 또한 같은 로컬로 캐시 된 원격 지점에서 작동 것이기 때문에 이것은 나를 위해 잘 작동 remotes/origin/master
, 어떤에git branch --contains
작동하지 않습니다를.
여기에는 “현재 지점”에 대한 OP의 질문 이상의 내용이 포함되어 있지만이 질문의 “모든 지점”버전을 묻는 것이 멍청하다는 것을 알았습니다.
답변
git branch --contains <commit-id> --points-at <target branch name>
해당 분기에 커밋 ID가 있으면 대상 분기 이름을 반환합니다. 그렇지 않으면 명령이 실패합니다.
답변
이 질문에는 좋은 스크립트 답변이 있으므로 즐겨 찾기를 추가하고 있습니다.
이것은 브랜치가 각각을 포함하는 마지막 $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