한 커밋이 다른 커밋의 자손인지 어떻게 알 수 있습니까?
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
경우에 완료됩니다 . 다음과 같습니다.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 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
'IT story' 카테고리의 다른 글
Gradle을 사용하여 실행 가능한 JAR 작성 (0) | 2020.07.06 |
---|---|
SQL Server의 행 오프셋 (0) | 2020.07.06 |
Vim에서 80 자 이상의 다른 배경색 표시 (0) | 2020.07.06 |
OSX El Capitan : sudo pip install OSError : [Errno : 1] 작업이 허용되지 않습니다 (0) | 2020.07.06 |
LINQ를 통해 컬렉션의 모든 요소에 기능 적용 (0) | 2020.07.06 |