다음과 같은 역사를 상상해보십시오.
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
, 사이 e
와 g
에가 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 Matev 와 javabrett 에게 감사드립니다 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