답변:
git branch --merged master
마스터 로 병합 된 분기를 나열합니다
git branch --merged
HEAD 로 병합 된 분기를 나열합니다 (예 : 현재 분기의 팁)
git branch --no-merged
병합되지 않은 분기를 나열합니다
기본적으로 이것은 로컬 브랜치에만 적용됩니다. -a
플래그는 로컬 및 원격 지사, 그리고 모두가 표시됩니다 -r
플래그 쇼에만 원격 지점.
git branch -a --merged/no-merged
프로세스에서 로컬 추적 분기를 만들지 않고도 작동합니다.
git branch -r --merged/--no-merged
원격 지점을 찾기 위해.
--merged/--no-merged
뒤에 선택적인 commit 인수가 필요합니다. 적어도 내 버전의 git (1.9.1)에서 -a
나 -r
뒤에 플래그를 추가하면 치명적인 오류가 발생합니다. -a
또는 -r
이전을 추가하십시오 --(no-)merged
.
git merge-base
명령을 사용 하여 두 분기 사이의 최신 공통 커밋을 찾을 수 있습니다 . 해당 커밋이 브랜치 헤드와 동일하면 브랜치가 완전히 병합 된 것입니다.
참고
git branch -d
이런 종류의 이미 수행이 지점 삭제를 거부하기 때문에 하지 않은 이미 완전히 통합되어 있습니다.
git branch -d
현재 분기에 병합되지 않은 분기 삭제를 거부합니다. 현재 분기를 삭제하지 않습니다 .
그래픽 인터페이스 솔루션도 있습니다. 그냥 입력
gitk --all
브랜치가 이미 병합되었는지 아닌지를 쉽게 알 수있는 새로운 리포지토리 창에 전체 리포지토리가 그래픽으로 표시됩니다.
git
클라이언트의 일부가 아닌 응용 프로그램을 설치해야합니다 . 우분투에서 apt-get install gitk
.
brew install git-gui
얻기 위해 gitk
명령 줄에.
다음과 같은 bash 함수를 사용하고 있습니다. git-is-merged develop feature/new-feature
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2
merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)
if [[ $merge_base = $merge_source_current_commit ]]
then
echo $merge_source_branch is merged into $merge_destination_branch
return 0
else
echo $merge_source_branch is not merged into $merge_destination_branch
return 1
fi
}
사용하십시오 git merge-base <commit> <commit>
.
이 명령은 두 커밋 사이에서 가장 일반적인 공통 조상을 찾습니다. 그리고 공통 조상이 "분기"의 마지막 커밋과 동일하다면 "분기"가 이미 마스터에 병합되었다고 가정 할 수 있습니다.
단계는 다음과 같습니다
git merge-base <commit-hash-step1> <commit-hash-step2>
. git merge-base https://git-scm.com/docs/git-merge-base 에 대한 자세한 정보 .
master
에 병합 되었는지 여부를 알려주지 않고 branch
4 개의 커밋이 추가되었습니다 branch
.
git log -1 $(git merge-base base-branch feature-branch)
볼 수 없다면 왜 feature-branch
병합되는지 알고 있습니까?
원격 브랜치 정리 주제
git branch -r | xargs -t -n 1 git branch -r --contains
여기에는 각 원격 분기와 최신 SHA가 속한 원격 분기가 나열됩니다.
이것은 어느 원격 브랜치가 병합되었지만 삭제되지 않았으며, 병합되지 않았으며 따라서 쇠퇴하는지 식별하는 데 유용합니다.
'tig'(gitk와 비슷하지만 터미널 기반)를 사용하는 경우 다음을 수행 할 수 있습니다
tig origin/feature/someones-decaying-feature
체크 아웃을하지 않고도 브랜치의 커밋 히스토리를 볼 수 있습니다.
마스터에 병합 된 브랜치를 확인하려면 다음 명령을 사용해야합니다.
git branch <flag[-r/-a/none]> --merged master
마스터로 병합 된 모든 분기 목록git branch <flag[-r/-a/none]> --merged master | wc -l
마스터로 병합 된 모든 분기의 수플래그는 :
-a
플래그- (모두) 원격 및 로컬 지점 표시-r
플래그- (원격) 원격 지점 만 표시<emptyFlag>
- 현지 지점 만 표시예를 들어 : git branch -r --merged master
마스터에 병합 된 모든 원격 저장소를 표시합니다.
다음은 지사를 병합했는지 여부를 파악해야 할 때의 기술입니다. 기능 분기에 대한 일반적인 시나리오 인 기본 지사와 함께 최신 버전으로 리베이스되었을 수도 있습니다.
이러한 접근법 중 어느 것도 바보 증거는 아니지만 여러 번 유용하다는 것을 알았습니다.
gitk 또는 TortoiseGit과 같은 시각적 도구를 사용하거나 단순히 --git with git log를 사용하여 히스토리를 통해 메인 브랜치에 대한 모든 병합을 볼 수 있습니다. 이 특정 기능 분기가 병합되었는지 여부를 확인할 수 있어야합니다.
기능 분기에서 병합 할 때 항상 로컬 및 원격 분기를 모두 제거하는 습관이 좋은 경우 다른 컴퓨터에서 원격을 업데이트하고 정리하면 기능 분기가 사라집니다.
이 작업을 기억하기 위해 이미 git flow extension (AVH edition) 을 사용하여 기능 분기를 로컬로 작성하고 병합하고 있으므로 다음 git flow hook을 추가하여 원격 분기를 자동 제거할지 묻습니다.
피처 브랜치 생성 / 종료 예제
554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'
Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$
.git / hooks / post-flow-feature-finish
NAME=$1
ORIGIN=$2
BRANCH=$3
# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] )
echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
git push $2 :$3;
break;;
[Nn] )
echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
break;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
# Stop reading user input (close STDIN)
exec <&-
exit 0
원격 지점을 항상 제거하지 않는 경우에도 비슷한 커밋을 검색하여 지점이 병합되었는지 여부를 확인할 수 있습니다. 함정은 스쿼시 커밋 또는 커밋 메시지 변경과 같이 원격 지사가 인식 할 수없는 것으로 리베이스 된 경우입니다.
마스터 브랜치의 명령 예 :
gru
gls origin/feature/foo
glf "my message"
내 bash .profile 구성에서
alias gru='git remote update -p'
alias glf=findCommitByMessage
findCommitByMessage() {
git log -i --grep="$1"
}
git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
git log
추가 할 수 있습니다 --merges
. stackoverflow.com/a/25986615/134761
다음은 현재 지점에 원격 원산지 / 마스터 지점의 데이터가 포함되어 있거나 데이터가 없는지 알려주는 작은 하나의 라이너입니다.
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
피처 브랜치에서 작업 할 때이 질문에 부딪 히고 자주 가장 최근의 작업을 내 별도의 작업 브랜치에 통합하려고합니다.
이 테스트를 일반화하기 위해 ~ / .gitconfig에 다음 별칭을 추가했습니다.
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
그런 다음 전화 할 수 있습니다.
$ git current origin/master
내가 현재 있는지 확인합니다.
git branch --merged
다음 로컬 및 원격 지점을 삭제했습니다.