programing

한 커밋이 다른 커밋의 하위인지 확인하려면 어떻게 해야 합니까?

testmans 2023. 7. 19. 21:13
반응형

한 커밋이 다른 커밋의 하위인지 확인하려면 어떻게 해야 합니까?

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

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

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

맨 페이지에서:

--아이-아이-아이-아이-에이치

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

예:

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

프로그래밍 방식으로(예: 스크립트에서) 확인하려면 다음을 확인할 수 있습니다.git merge-base A B와 같음git rev-parse --verify A(그러면 A가 B에서 도달할 수 있음), 또는 도달할 수 있는 경우git rev-parse --verify B(A에서 B에 도달할 수 있음). git rev-parse여기서 커밋 이름에서 커밋 SHA-1 / 커밋 ID로 변환해야 합니다.

사용.git rev-listVonC에서처럼 대답도 가능합니다.

편집: 현대 Git에서는 다음과 같은 형태로 이 쿼리를 명시적으로 지원합니다.git merge-base --is-ancestor.


만약 당신이 질문하는 커밋 중 하나가 분기 팁이라면,git branch --contains <commit>또는git branch --merged <commit>비프로그래밍 솔루션이 더 나을 수도 있습니다.

이러한 종류의 작업은 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,한다면A에서 도달 가능B.
이것은 다음과 같습니다.

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

,와 함께B긍정적인 언급, 그리고.A부정적인 언급
시작 시간:B그리고 그것이 도달할 수 있는 개정을 만날 때까지 그래프를 뒤로 걷습니다.A.
저는 만약에A에서 직접 연결 가능B그것은 마주칠 것이다 (그리고, 그것 때문에, 디스플레이.--boundary옵션)A그 자체로

다른 방법은 다음과 같습니다.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 2.28을 사용하십시오(2020년 3분기).

2과 함께, "Git 2.28 (2020년 3분기)"의몇 .struct commit항상 존재할 필요는 없는 슬래브를 커밋하도록 이동했습니다.

커밋 c752ad0, 커밋 c49c82a, 커밋 4844812, 커밋 6da43d9 (2020년 6월 17일) by Abhishek Kumar()abhishekkumar2718 참조.
(주니오 C 하마노에 의해 합병됨 -- -- 80bea4, 2020년 7월 6일)

commit-graph소개하다commit_graph_data_slab

사인 오프 바이: 아비셰크 쿠마르

구조 커밋은 많은 컨텍스트에서 사용됩니다.멤버들은generation그리고.graph_pos커밋 그래프 관련 작업 및 메모리 낭비에만 사용됩니다.

이러한 낭비는 현재의 32비트가 아닌 64비트 생성 번호를 사용하는 v2 세대로 전환함에 따라 더욱 두드러졌을 것입니다.

하는 경우가 구조체를 해 보겠습니다.commit_graph_data그리고 그들을 a로 옮깁니다.commit_graph_data슬래브를 깔다

는 전체테제실속 만큼 빠릅니다.master (시리즈: 26m48s)master더), 27m34s, 2.87% 빨짐다, 과같은특과 같은 git merge-base --is-ancestorSzeder Gavor에 의해 발견된 바와 같이 40% 느려졌습니다.
커밋 슬래브 액세스를 최소화한 후 속도 저하는 지속되지만 20%에 가깝습니다.

Derrick Stolee는 느린 속도가 커밋 슬래브 액세스의 느림보다는 기본 알고리즘에 기인한다고 생각하며 이후 시리즈에서 후속 작업을 수행할 것입니다.

git show-timeout branch-sha1 commit-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

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

반응형