한 커밋이 다른 커밋의 하위인지 확인하려면 어떻게 해야 합니까?
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-list
VonC에서처럼 대답도 가능합니다.
편집: 현대 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-ancestor
Szeder 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
'programing' 카테고리의 다른 글
PySpark에서 데이터 프레임의 크기나 모양을 찾는 방법은 무엇입니까? (0) | 2023.07.19 |
---|---|
정확히 sklearn.pipeline입니다.파이프라인? (0) | 2023.07.19 |
팬더 그림에서 x축 눈금 레이블을 회전하는 방법 (0) | 2023.07.19 |
cx_Oracle을 사용하여 사전 목록 만들기 (0) | 2023.07.19 |
멀티프로세싱에서의 공유 메모리 객체 (0) | 2023.07.19 |