특정 커밋이 포함 된 병합 커밋 찾기 /

다음과 같은 역사를 상상해보십시오.

       c---e---g--- feature
      /         \
-a---b---d---f---h--- master

커밋 “c”가 마스터에 병합되었을 때 어떻게 찾을 수 있습니까 (즉, 찾기 커밋 “h”를 찾으십니까)?



답변

귀하의 예는 브랜치 feature를 여전히 사용할 수 있음을 보여줍니다 .

이 경우 h마지막 결과는 다음과 같습니다.

git log master ^feature --ancestry-path

feature더 이상 지점을 사용할 수없는 경우 c및 사이의 내역 행에 병합 커밋을 표시 할 수 있습니다 master.

git log <SHA-1_for_c>..master --ancestry-path --merges

그러나 이것은 또한 이후에 일어난 모든 병합 표시됩니다 h, 사이 eg에가 feature.


다음 명령의 결과 비교

git rev-list <SHA-1_for_c>..master --ancestry-path

git rev-list <SHA-1_for_c>..master --first-parent

SHA-1을 h마지막 행으로 공통으로 제공합니다.

사용 가능한 comm -1 -2경우이 결과에 사용할 수 있습니다 . msysgit을 사용중인 경우 다음 펄 코드를 사용하여 비교할 수 있습니다.

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

( http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/의 펄 코드 . “comp.unix.shell 뉴스 그룹의 누군가”에서 가져온 것입니다).

하나의 라이너로 만들려면 프로세스 대체를 참조하십시오 .


답변

이것을 다음에 추가하십시오 ~/.gitconfig.

[alias]
    find-merge = "!sh -c 'commit=$0 && branch=${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 -s | uniq -f1 -d | sort -n | tail -1 | cut -f2'"
    show-merge = "!sh -c 'merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge'"

그런 다음 다음과 같이 별칭을 사용할 수 있습니다.

# current branch
git find-merge <SHA-1>
# specify master
git find-merge <SHA-1> master

병합 커밋 메시지 및 기타 세부 정보를 보려면 git show-merge동일한 인수와 함께 사용하십시오 .

( Gauthier의 답변을 기반으로합니다 . 로 문제를 해결 한 Rosen Matevjavabrett 에게 감사드립니다 sort.)


답변

git-get-merge 는 찾고있는 병합 커밋을 찾아서 보여줍니다 :

pip install git-get-merge
git get-merge <SHA-1>

명령은 다른 분기 (아마도 마스터) 로의 병합 이 발견 될 때까지 지정된 커밋의 자식을 따릅니다 .


답변

즉, Gauthier의 게시물을 요약하면 다음과 같습니다.

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' <(git rev-list --ancestry-path <SHA-1_for_c>..master) <(git rev-list --first-parent <SHA-1_for_c>..master) | tail -n 1

편집 : 이것은 프로세스 대체<()“를 사용하기 때문에 POSIX와 호환되지 않으며 쉘에서 작동하지 않을 수 있습니다. 그것은 작동 bash또는 zsh불구하고.


답변

나는 이것을해야했고 어떻게 든 발견했다 git-when-merged(실제로이 SO 질문을 참조하지만 Michael Haggerty는 그의 멋진 Python 스크립트에 대한 참조를 여기에 추가하지 않았다). 그래서 지금 가지고 있습니다.


답변

Gauthier의 훌륭한 답변을 바탕으로 comm목록을 비교하는 데 사용할 필요는 없습니다 . 우리 --ancestry-path는 또한에 있는 마지막 결과를 찾고 있기 때문에 --first-parent전자의 출력에서 ​​후자를 grep 할 수 있습니다.

git rev-list <SHA>..master --ancestry-path | grep -f <(git rev-list <SHA>..master --first-parent) | tail -1

또는 간단하고 재사용 가능한 무언가를 위해 다음과 같은 기능이 있습니다 .bashrc.

function git-find-merge() {
  git rev-list $1..master --ancestry-path | grep -f <(git rev-list $1..master --first-parent) | tail -1
}

답변

Ruby 사용자에게는 git-whence가 있습니다. 아주 쉽게.

$ gem install git-whence
$ git whence 1234567
234557 Merge pull request #203 from branch/pathway