IT story

한 커밋이 다른 커밋의 자손인지 어떻게 알 수 있습니까?

hot-time 2020. 7. 6. 07:10
반응형

한 커밋이 다른 커밋의 자손인지 어떻게 알 수 있습니까?


Git을 사용하면 지점의 한 커밋이 다른 커밋의 자손인지 어떻게 알 수 있습니까?


프로그래밍 방식으로 (예 : 스크립트에서) 확인 git merge-base A B하려면 git rev-parse --verify A(B에서 ​​A에 도달 할 수 있는지 ) 또는 (A에서 B에 도달 할 수 있는지) 확인할 수 있습니다 git rev-parse --verify B. git rev-parse커밋 이름에서 커밋 SHA-1 / 커밋 ID로 변환하는 데 필요합니다.

VonCgit rev-list 에서와 같은 답변을 사용하는 것도 가능합니다.

편집 : 현대 Git에는이 쿼리에 대한 형식이 명시 적으로 지원됩니다 git merge-base --is-ancestor.


당신이 요구하는 커밋 중 하나에 대한 경우 지점 팁 , 다음 git branch --contains <commit>또는 git branch --merged <commit>더 나은 비 프로그램의 솔루션이 될 수 있습니다.


Git 1.8.0부터는 다음과 같은 옵션으로 지원됩니다 merge-base.

git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>

매뉴얼 페이지에서 :

-조상

첫 번째가 두 번째의 조상인지 확인하고 true이면 상태 0으로, 그렇지 않으면 상태 1로 종료하십시오. 오류는 1이 아닌 0이 아닌 상태로 표시됩니다.

예를 들면 다음과 같습니다.

git merge-base --is-ancestor origin/master master; echo $?

이러한 종류의 작업은 SO 질문에 자세히 설명 된 수정 범위의 개념에 따라 달라집니다 : " 'git log origin / master'와 'git log origin / master ..'의 차이 "

git rev-list 도달 할 수있는 다른 커밋까지 커밋에서 되돌아 갈 수 있어야합니다.

그래서 시도 할 것입니다 :

git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20

(경계 커밋은 접두사가 붙습니다 -)

표시된 마지막 커밋이 git rev-list명령 의 첫 번째 커밋과 동일 하면 두 번째 커밋에서 도달 할 수있는 커밋입니다.

첫 번째 커밋이 두 번째 커밋에 도달 할 수 git rev-list없으면 아무것도 반환하지 않아야합니다.

git rev-list --boundary A..B

에서 도달 할 수있는 A경우에 완료됩니다 . 다음과 같습니다.AB

git rev-list --boundary B --not A

함께 포지티브 기준제외 참조 . 에서 도달 할 수있는 개정판을 발견 할 때까지 그래프 에서 시작 하여 그래프를 다시 살펴 봅니다. 에서 직접 연결할 수 있으면 옵션 과 관련하여 표시 됩니다.BA
BA
AB--boundaryA


또 다른 방법은 git log 및 grep을 사용하는 것입니다.

git log --pretty=format:%H abc123 | grep def456

commit def456이 commit abc123의 조상이거나 그렇지 않으면 출력이 없으면 한 줄의 출력을 생성합니다.

일반적으로 "--pretty"인수를 생략하면 문제를 해결할 수 있지만 로그 주석 등이 아닌 실제 커밋 해시를 통해서만 검색하도록하려면이 방법이 필요합니다.


https://stackoverflow.com/a/13526591/895245에서 더 인간 친화적으로 만들기 위해 언급했습니다.

git-is-ancestor() (
  if git merge-base --is-ancestor "$1" "$2"; then
      echo 'ancestor'
  elif git merge-base --is-ancestor "$2" "$1"; then
      echo 'descendant'
  else
      echo 'unrelated'
  fi
)
alias giia='git-is-ancestor'

git show-branch branch-sha1 커밋 -sha1

어디:

  • branch-sha1 : 확인하려는 지점의 sha1
  • commit-sha1 : 확인할 커밋의 sha1

저장소의 모든 태그에 대해이 작업을 수행 해야하는 경우 itub의 답변을 기반으로합니다.

for i in `git tag` ; do echo -ne $i "\t" ; git log --pretty=format:%H $i | (grep <commit to find> || echo ""); done

참고 : https://stackoverflow.com/questions/3005392/how-can-i-tell-if-one-commit-is-a-descendant-of-another-commit

반응형