다음 쉘 명령은 원하는 작업을 수행해야합니다.
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
경고
이 경우 mybranch
체크 아웃, 위의 명령이 작동하지 않습니다. 이는 커밋에 mybranch
도달 할 수 HEAD
있기 때문에 Git은 커밋을 고유 한 것으로 간주하지 않습니다 mybranch
. mybranch
체크 아웃 할 때 작동하게하려면 다음에 대한 제외도 추가해야합니다 HEAD
.
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
그러나를 체크 아웃 하지 않으면 제외 HEAD
하지 않아야합니다 mybranch
. 그렇지 않으면 독점이 아닌 커밋이 표시 될 위험이 mybranch
있습니다.
마찬가지로 origin/mybranch
로컬 mybranch
브랜치에 해당 하는 원격 브랜치가있는 경우 이를 제외해야합니다.
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
그리고 원격 브랜치가 원격 리포지토리의 기본 브랜치 인 경우 (보통은 true origin/master
), 제외 origin/HEAD
해야합니다.
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
당신이있는 경우 분기 체크 아웃, 그리고 거기에 원격 지점이다, 그리고 원격 지점은 다음 많이 제외한 결국, 원격 저장소에 대한 기본값입니다
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
설명
이 git rev-list
명령은 주어진 개정을 수행하고 발견 된 SHA1 식별자를 덤프하는 저수준 (배관) 명령입니다. git log
SHA1 (로그 메시지, 작성자 이름, 타임 스탬프 없음, "팬시"항목 없음) 만 표시한다는 점 을 제외하고 는 동등한 것으로 생각하십시오 .
--no-walk
옵션, 이름에서 알 수 있듯이, 방지 git rev-list
조상 체인을 걸어에서. 따라서 입력 git rev-list --no-walk mybranch
하면 mybranch
분기 의 팁 커밋 식별자 인 하나의 SHA1 식별자 만 인쇄됩니다 .
--exclude=refs/heads/mybranch --all
인수 알 git rev-list
을 제외하고 각 기준에서 시작합니다 refs/heads/mybranch
.
git rev-list --no-walk --exclude=refs/heads/mybranch --all
따라서을 실행 하면 Git은을 제외한 각 심판의 팁 커밋의 SHA1 식별자를 인쇄합니다 refs/heads/mybranch
. 이 커밋과 그 조상은 관심 이 없는 커밋입니다.이 커밋은보고 싶지 않습니다 .
다른 커밋은 우리의 출력을 수집, 그래서보고 싶은 것들 git rev-list --no-walk --exclude=refs/heads/mybranch --all
과 모든 그러나 그 커밋과 그들의 조상을 보여 힘내을 말한다.
--no-walk
인수는 큰 저장소에 필요한 (작은 저장소에 대한 최적화입니다) : 그것은, 힘내 인쇄 할 것없이, 쉘 수집해야합니다 (메모리에 저장) 많은 사람들이 필요 이상으로 식별자를 커밋합니다. 저장소가 크면 수집 된 커밋 수가 쉘의 명령 줄 인수 제한을 쉽게 초과 할 수 있습니다.
힘내 버그?
나는 다음이 작동 할 것으로 예상했다.
git log --all --not --exclude=refs/heads/mybranch --all
그러나 그렇지 않습니다. 나는 이것이 Git의 버그라고 생각하지만 의도적 일 수 있습니다.