특정 커밋이 포함된 병합 커밋 찾기
다음과 같은 기록을 상상해 보십시오.
c---e---g--- feature
/ \
-a---b---d---f---h--- master
커밋 "c"가 마스터에 병합되었을 때 어떻게 찾을 수 있습니까(즉, 병합 커밋 "h" 찾기)?
을 당신의 니추합다에 추가하세요.~/.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
같은 주장으로
(Gautier의 답변을 토대로 함)로젠 마테브와 자바브렛에게 문제를 해결해 주셔서 감사합니다.sort
.)
예를보분기가면제▁▁the가▁that분을 보여줍니다.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
("comp.dll.shell news group"에서 가져온 http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ 의 코드를 삭제합니다.)
한 선으로 만들려면 공정 대체를 참조하십시오.
git-get-commit는 찾고 있는 병합 커밋을 찾아 표시합니다.
pip install git-get-merge
git get-merge <SHA-1>
명령은 다른 분기(아마 마스터)로의 병합이 발견될 때까지 지정된 커밋의 자식을 따릅니다.
즉, 고티에의 게시물을 요약하면 다음과 같습니다.
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
그래도.
저는 이것을 해야 했고 어떻게든 찾았습니다(실제로 이 SO 질문을 참조하지만 마이클 해거티는 여기서 그의 매우 멋진 파이썬 스크립트에 대한 참조를 추가하지 않았습니다).그래서 지금은.
답변을 는 고에의훌륭답한바로탕으변, 우는사필없습다니가요할용티리을▁▁need없니▁don습을 사용할 필요가 없습니다.comm
목록을 비교합니다.우가마지결과찾있때기문에고를막리▁in▁we▁result▁since▁last▁the때.--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
}
git log --topo-order
그런 다음 커밋하기 전에 첫 번째 병합을 찾습니다.
루비 군중들을 위해, 활기찬 장소가 있습니다.아주 쉽습니다.
$ gem install git-whence
$ git whence 1234567
234557 Merge pull request #203 from branch/pathway
경로에 배치하는 아래의 bash 스크립트를 사용합니다.~/bin/git-find-merge
고티어의 답변과 악스트릭의 답변을 기반으로 하며, 코너 케이스를 처리하기 위한 수정 사항은 거의 없습니다. comm
입력이 정렬되지 않을 때 던집니다. grep -f
완벽하게 작동합니다.
코너 케이스:
- 커밋이 분기의 첫 번째 상위 경로에 대한 병합 커밋인 경우 커밋을 반환합니다.
- 커밋이 분기의 첫 번째 상위 경로에서 병합되지 않은 커밋인 경우 분기를 반환합니다.병합 또는 커밋은 분기에만 있으며 올바른 커밋을 파악할 수 있는 좋은 방법이 없습니다.
- 커밋과 분기가 같으면 커밋을 반환합니다.
~/bin/git-find-merge
스크립트:
#!/bin/bash
commit=$1
if [ -z $commit ]; then
echo 1>&2 "fatal: commit is required"
exit 1
fi
commit=$(git rev-parse $commit)
branch=${2-@}
# if branch points to commit (both are same), then return commit
if [ $commit == $(git rev-parse $branch) ]; then
git log -1 $commit
exit
fi
# if commit is a merge commit on first-parent path of branch,
# then return commit
# if commit is a NON-merge commit on first-parent path of branch,
# then return branch as it's either a ff merge or commit is only on branch
# and there is not a good way to figure out the right commit
if [[ $(git log --first-parent --pretty='%P' $commit..$branch | \
cut -d' ' -f1 | \
grep $commit | wc -l) -eq 1 ]]; then
if [ $(git show -s --format="%P" $commit | wc -w) -gt 1 ]; then
# if commit is a merge commit
git log -1 $commit
else
# if commit is a NON-merge commit
echo 1>&2 ""
echo 1>&2 "error: returning the branch commit (ff merge or commit only on branch)"
echo 1>&2 ""
git log -1 $branch
fi
exit
fi
# 1st common commit from bottom of first-parent and ancestry-path
merge=$(grep -f \
<(git rev-list --first-parent $commit..$branch) \
<(git rev-list --ancestry-path $commit..$branch) \
| tail -1)
if [ ! -z $merge ]; then
git log -1 $merge
exit
fi
# merge commit not found
echo 1>&2 "fatal: no merge commit found"
exit 1
이렇게 할 수 있습니다.
(master)
$ git find-merge <commit> # to find when commit merged to current branch
$ git find-merge <branch> # to find when branch merged to current branch
$ git find-merge <commit> pu # to find when commit merged to pu branch
이 스크립트는 내 github에서도 사용할 수 있습니다.
제 루비 버전의 @robinst 아이디어는 두 배 더 빨리 작동합니다(매우 오래된 커밋을 검색할 때 중요함).
find-commit.rb
commit = ARGV[0]
master = ARGV[1] || 'origin/master'
unless commit
puts "Usage: find-commit.rb commit [master-branch]"
puts "Will show commit that merged <commit> into <master-branch>"
exit 1
end
parents = `git rev-list #{commit}..#{master} --reverse --first-parent --merges`.split("\n")
ancestry = `git rev-list #{commit}..#{master} --reverse --ancestry-path --merges`.split("\n")
merge = (parents & ancestry)[0]
if merge
system "git show #{merge}"
else
puts "#{master} doesn't include #{commit}"
exit 2
end
다음과 같이 사용할 수 있습니다.
ruby find-commit.rb SHA master
마스터에서 커밋을 찾는 가장 좋은 방법은 다음과 같습니다.
[alias]
find-merge = !"f() { git rev-list $1..master --ancestry-path --merges --reverse | head -1; }; f"
이런 거 한번 해보세요.이 아이디어는 모든 병합 커밋을 반복하고 다음 중 하나에서 커밋 "c"에 도달할 수 있는지 확인하는 것입니다.
$ git log --merges --format='%h' master | while read mergecommit; do
if git log --format='%h' $mergecommit|grep -q $c; then
echo $mergecommit;
break
fi
done
저는 이것을 몇 번이나 해야 했고(이 질문에 대답한 모든 사람들 덕분에!), 결국 제 작은 git 유틸리티 모음에 추가할 수 있는 스크립트를 작성하게 되었습니다.https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point 에서 찾을 수 있습니다.
그래픽 솔루션은 gitk("SHA1 ID" 상자 사용)에서 해당 항목을 찾고 병합 커밋까지의 커밋 행을 따르는 것입니다.
언급URL : https://stackoverflow.com/questions/8475448/find-merge-commit-which-include-a-specific-commit
'programing' 카테고리의 다른 글
Firestore 쿼리 문서 시작끈 포함 (0) | 2023.07.10 |
---|---|
유형 스크립트 결합 유형에서 다른 속성 액세스 (0) | 2023.07.05 |
정적 클래스에서 사용자 지정 이벤트를 발생시키는 방법 (0) | 2023.07.05 |
오라클에서 숫자 데이터가 포함되지 않은 행 찾기 (0) | 2023.07.05 |
리비전 번호에 대한 Git 등가물은 무엇입니까? (0) | 2023.07.05 |