커밋 ID가 주어지면 현재 분기에 커밋이 포함되어 있는지 확인하는 방법은 무엇입니까? 확인입니다. 코드가 최소 버전 위에

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



답변

이 결과를 얻는 방법에는 여러 가지가 있습니다. 첫 번째 순진한 옵션은을 사용 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


답변

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

# 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$'


답변

@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


이 글은 Git 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.