programing

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

telebox 2023. 5. 12. 22:02
반응형

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

제가 하려는 것은 버전 확인입니다.코드가 최소 버전 위에 있는지 확인하고 싶습니다.그래서 현재 지점에 지정된 커밋이 있는지 알 수 있는 방법이 필요합니다.

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

git log | grep <commit_id>

하는 것이 .git branch 지정된를분기포모분직함든찾기습다니접를는하▁cont▁▁given▁directly▁to▁all▁find다니찾습직접지정을 포함하는 모든 분기를 직접 찾습니다.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

문자열 종료코 좋문자을원하는대로열만지는드▁exit▁is로대는▁you원하▁but▁string▁want▁as▁code▁nicetrue또는false답으로 당신은 조금 더 추가한 다음에 결합해야 합니다.if에서 당신은 시부터배를 .

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그리고.remotebranch )-a )에서만 사용할 수 있습니다.remotebranch )-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가 HEAD의 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

모든 분기(로컬 및 원격으로 가져온)를 체크인합니다.

git branch -a --contains $COMMIT_ID

리모컨을 가져와야 합니다.

git fetch origin

커밋이 포함된 로컬 분기를 나열하는 방법

git branch --contains <commit-id>

및 커밋이 포함된 원격 전용을 포함한 모든 분기를 나열합니다.

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

커밋이 특정 분기에 있는지 확인하는 것과 유사합니다.

git log <branch> | grep <commit_id>

인 branch name이 하지 않는 .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

윈도우즈/CMD 터미널의 윈도우즈 시스템.할 수 있는 일:

> git log | findstr "commit-id"

예:

> git log | findstr "c601cd6366d"

Git checkout은 현재 HEAD(현재 파일)의 분기로 돌아가지만 모든 분기를 체크아웃하지는 않습니다.예를 들어 git checkout master를 수행하는 경우 코드는 마스터 분기에 있는 것처럼 체크아웃되지만 해당 분기 외부에서 변경된 파일은 체크아웃되지 않습니다.

언급URL : https://stackoverflow.com/questions/43535132/given-a-commit-id-how-to-determine-if-current-branch-contains-the-commit

반응형