Git 커밋에서 나온 브랜치 찾기 브랜치에서 나오는지 알 수있는

SHA-1 해시 값이 주어지면 커밋이 어떤 브랜치에서 나오는지 알 수있는 방법이 있습니까?

Ruby Grit을 사용하여이 작업을 수행하는 방법을 알려 주면 보너스 포인트입니다.



답변

Dav는 정보가 직접 저장되지 않았다는 것이 맞지만 이것이 결코 찾을 수 없다는 것을 의미하지는 않습니다. 할 수있는 몇 가지가 있습니다.

커밋이있는 지점 찾기

git branch -a --contains <commit>

이것은 당신에게 주어진 커밋을 가진 모든 브랜치를 알려줄 것입니다. 커밋이 이미 병합 된 경우 분명히 유용하지 않습니다.

Reflogs 검색

커밋이 수행 된 리포지토리에서 작업중인 경우 해당 커밋에 대한 행의 reflog를 검색 할 수 있습니다. 90 일이 지난 Reflog는 git-gc에 의해 제거되므로 커밋이 너무 오래된 경우 찾을 수 없습니다. 즉, 당신은 이것을 할 수 있습니다 :

git reflog show --all | grep a871742

커밋 a871742를 찾으십시오. 커밋의 약어 7 첫 번째 숫자를 사용해야합니다. 출력은 다음과 같아야합니다.

a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite

커밋이 “완료”분기에서 수행되었음을 나타냅니다. 기본 출력에는 약식 커밋 해시가 표시되므로 전체 해시를 검색하지 마십시오. 그렇지 않으면 아무것도 찾지 않습니다.

git reflog show실제로는에 대한 별칭 git log -g --abbrev-commit --pretty=oneline이므로 출력 형식을 사용하여 grep 할 수있는 다양한 항목을 만들고 싶다면 이것이 시작점입니다!

커밋이 이루어진 리포지토리에서 작업하지 않는 경우이 경우에 수행 할 수있는 최선의 방법은 reflog를 검사하고 커밋이 리포지토리에 처음 도입 된 시점을 찾는 것입니다. 운이 좋으면 커밋 된 지점을 가져 왔습니다. 커밋 트리와 reflog를 동시에 걸을 수 없기 때문에 조금 더 복잡합니다. reflog 출력을 구문 분석하여 각 해시에 원하는 커밋이 포함되어 있는지 확인하십시오.

후속 병합 커밋 찾기

이는 워크 플로우에 따라 다르지만 워크 플로우가 양호하면 개발 브랜치에서 커밋되어 병합됩니다. 다음과 같이 할 수 있습니다.

git log --merges <commit>..

주어진 커밋을 조상으로 갖는 병합 커밋을 볼 수 있습니다. (커밋이 한 번만 병합 된 경우 첫 번째 병합은 이후의 병합이어야합니다. 그렇지 않으면 몇 가지를 조사해야합니다.) 병합 커밋 메시지에는 병합 된 분기 이름이 포함되어야합니다.

이 작업을 의지하고 싶을 경우, 빠른 경우에도 병합 커밋 생성을 강제 실행 하는 --no-ff옵션을 사용할 수 있습니다 git merge. (너무 열심하지 마십시오. 과도하게 사용하면 혼란 스러워 질 수 있습니다.) 관련 질문에 대한 VonC의 답변 이이 주제에 도움이됩니다.


답변

이 간단한 명령은 매력처럼 작동합니다.

git name-rev <SHA>

예를 들어, test-branch 는 지점 이름입니다.

git name-rev 651ad3a
251ad3a remotes/origin/test-branch

이조 차도 다음과 같은 복잡한 시나리오에서 작동합니다.

origin/branchA/
              /branchB
                      /commit<SHA1>
                                   /commit<SHA2>

여기 git name-rev commit<SHA2>에서 branchB를 반환합니다 .


답변

2013 년 12 월 업데이트 :

슈베르트 코멘트

git-what-branch(펄 스크립트, 아래 참조)는 더 이상 유지되지 않는 것 같습니다.
git-when-merged파이썬으로 작성된 대안으로 저에게 매우 효과적입니다.

특정 커밋을 포함하는 병합 커밋 찾기 “를 기반으로 합니다.

git when-merged [OPTIONS] COMMIT [BRANCH...]

커밋이 하나 이상의 분기로 병합 된시기를 찾으십시오. 지정된 지점으로
가져온 병합 커밋을 찾으십시오 COMMIT.

특히 조상으로 BRANCH포함 된 첫 번째 상위 히스토리에서 가장 오래된 커밋을 찾으십시오 COMMIT.


원래 답변 2010 년 9 월 :

Sebastien Douche 는 다음과 같이 트위트했습니다 (SO 답변 16 분 전).

git-what-branch : 커밋이 어떤 브랜치인지 또는 어떻게 지명 된 브랜치에 도달했는지 알아 봅니다.

이것은 세스 로버트슨펄 스크립트 입니다 .

개요

git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...

개요

요청 된 커밋을 명명 된 브랜치에 가져 오기 위해 커밋 및 병합의 가장 빠른 인과 경로를 기본적으로 알려주십시오. 명명 된 브랜치에서 커밋을 직접 수행 한 경우 가장 빠른 경로입니다.

가장 빠른 인과 경로는 커밋 시간에 의해 ( --topo-order지정 되지 않은 한 ) 가장 이른 지명 된 브랜치로 병합 된 경로를 의미합니다 .

공연

많은 브랜치 (예 : 수백)에 커밋이 포함 된 경우 시스템에서 시간이 오래 걸릴 수 있습니다 (Linux 트리의 특정 커밋의 경우 브랜치를 탐색하는 데 8 초가 걸렸지 만 후보 브랜치가 200 개가 넘음). 각 커밋에. 검사 할
특정 항목의 선택 --reference-branch --reference tag은 수백 개의 후보 분기가있는 경우 수백 배 더 빠릅니다.

실시 예

 # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
   v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May  5 08:59:37 2005)
   v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May  3 18:27:24 2005)
   v2.6.12-rc3-461-g84e48b6 is on master
   v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
   [...]

이 프로그램은 관심있는 커밋의 체리 피킹 효과를 고려하지 않고 병합 작업 만 수행합니다.


답변

예를 들어, c0118fa커밋 을 찾으려면 redesign_interactions다음 을 수행하십시오 .

* ccfd449 (HEAD -> develop) Require to return undef if no digits found
*   93dd5ff Merge pull request #4 from KES777/clean_api
|\
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| *   a435005 Merge branch 'redesign_interactions' into clean_api
| |\
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event

다음을 실행해야합니다.

git log c0118fa..HEAD --ancestry-path --merges

그리고 아래로 스크롤하여 마지막 병합 커밋 을 찾으십시오 . 어느 것이 :

commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'redesign_interactions' into clean_api

최신 정보

또는 하나의 명령 만 :

git log c0118fa..HEAD --ancestry-path --merges --oneline --color | tail -n 1


답변

git branch --contains <ref>가장 확실한 “porcelain”명령입니다. “배관”명령만으로 비슷한 작업을 수행하려는 경우 :

COMMIT=$(git rev-parse <ref>) # expands hash if needed
for BRANCH in $(git for-each-ref --format "%(refname)" refs/heads); do
  if $(git rev-list $BRANCH | fgrep -q $COMMIT); then
    echo $BRANCH
  fi
done

( 이 SO 답변의 교차점 )


답변

khichar.anil 은 그의 답변에서 대부분을 다루었습니다 .

개정 이름 목록에서 태그를 제거하는 플래그를 추가하고 있습니다. 이것은 우리에게 :

git name-rev --name-only --exclude=tags/* $SHA


답변

가난한 사람의 옵션은 도구 tig1 on 을 사용 하고HEAD 커밋을 검색 한 다음 병합 커밋이 보일 때까지 해당 커밋의 라인을 시각적으로 따르는 것입니다. 기본 병합 메시지는 어떤 브랜치가 어디에 병합되는지 지정해야합니다. 🙂

1 Tig는 Git 용 ncurses 기반 텍스트 모드 인터페이스입니다. 주로 Git 리포지토리 브라우저로 작동하지만 청크 수준에서 커밋에 대한 변경 사항을 준비하고 다양한 Git 명령의 출력을위한 호출기로 작동 할 수도 있습니다.