지점이 이미 마스터로 병합되었는지 어떻게 알 수 있습니까?


1139

여러 분기가있는 자식 저장소가 있습니다.

어떤 브랜치가 이미 마스터 브랜치에 병합되었는지 어떻게 알 수 있습니까?

답변:


1792

git branch --merged master마스터 로 병합 된 분기를 나열합니다

git branch --mergedHEAD 로 병합 된 분기를 나열합니다 (예 : 현재 분기의 팁)

git branch --no-merged 병합되지 않은 분기를 나열합니다

기본적으로 이것은 로컬 브랜치에만 적용됩니다. -a플래그는 로컬 및 원격 지사, 그리고 모두가 표시됩니다 -r플래그 쇼에만 원격 지점.


2
참고로 원격 지점이 병합되었는지 확인하려고 할 때 먼저 로컬 추적 지점을 설정하고 상태를 확인한 git branch --merged다음 로컬 및 원격 지점을 삭제했습니다.
케네스 칼 메르

83
분명히 git branch -a --merged/no-merged프로세스에서 로컬 추적 분기를 만들지 않고도 작동합니다.
fresskoma

70
아니면 그냥 git branch -r --merged/--no-merged원격 지점을 찾기 위해.
Asfand Qazi

5
리베 이싱 후 실제로 병합 된 병합되지 않은 분기를 삭제하는 방법은 무엇입니까?
Ashfame

9
--merged/--no-merged뒤에 선택적인 commit 인수가 필요합니다. 적어도 내 버전의 git (1.9.1)에서 -a-r뒤에 플래그를 추가하면 치명적인 오류가 발생합니다. -a또는 -r 이전을 추가하십시오 --(no-)merged.
Jonathan Gawrych

113

git merge-base명령을 사용 하여 두 분기 사이의 최신 공통 커밋을 찾을 수 있습니다 . 해당 커밋이 브랜치 헤드와 동일하면 브랜치가 완전히 병합 된 것입니다.

참고 git branch -d이런 종류의 이미 수행이 지점 삭제를 거부하기 때문에 하지 않은 이미 완전히 통합되어 있습니다.


3
@hari의 대답 은 이것을 사용하는 방법에 대해 자세히 설명합니다.
Muhd

자동 / 프로그래밍 방식으로 어떻게 할 수 있습니까?
Alexander Mills

1
"아직 완전히 합병되지 않았습니다"... 완전히 어떤 지점으로 합병 되었습니까?
Alexander Mills

@AlexanderMills : 현재 지점으로.
Greg Hewgill

2
@AlexanderMills : git branch -d현재 분기에 병합되지 않은 분기 삭제를 거부합니다. 현재 분기를 삭제하지 않습니다 .
Greg Hewgill

27

그래픽 인터페이스 솔루션도 있습니다. 그냥 입력

gitk --all

브랜치가 이미 병합되었는지 아닌지를 쉽게 알 수있는 새로운 리포지토리 창에 전체 리포지토리가 그래픽으로 표시됩니다.


17
확실하게 git클라이언트의 일부가 아닌 응용 프로그램을 설치해야합니다 . 우분투에서 apt-get install gitk.
metame

당신이 브루 설치 한 경우 맥 OS에서, 것 brew install git-gui얻기 위해 gitk명령 줄에.
program247365

24

다음과 같은 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
}

3
이것은 실제로 작동하지 않습니다. 소스 브랜치가 이미 대상 브랜치에 병합 된 후 대상 브랜치가 더 커밋을 더 받으면 더 이상 작동하지 않지만 이유를 모르겠습니다.
Alexander Mills

1
여기 질문을 참조하십시오 : stackoverflow.com/questions/51355331/…
Alexander Mills

18

사용하십시오 git merge-base <commit> <commit>.

이 명령은 두 커밋 사이에서 가장 일반적인 공통 조상을 찾습니다. 그리고 공통 조상이 "분기"의 마지막 커밋과 동일하다면 "분기"가 이미 마스터에 병합되었다고 가정 할 수 있습니다.

단계는 다음과 같습니다

  1. 마스터 브랜치에서 마지막 커밋 해시 찾기
  2. "분기"에서 마지막 커밋 해시 찾기
  3. 명령을 실행하십시오 git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. 3 단계의 출력이 2 단계의 출력과 동일하면 "브랜치"가 이미 마스터로 병합 된 것입니다.

git merge-base https://git-scm.com/docs/git-merge-base 에 대한 자세한 정보 .


2
팁이 병합되었는지 만 알려줄 것입니다. 예를 들어, master에 병합 되었는지 여부를 알려주지 않고 branch4 개의 커밋이 추가되었습니다 branch.
mkobit

출력에서 git log -1 $(git merge-base base-branch feature-branch)볼 수 없다면 왜 feature-branch병합되는지 알고 있습니까?
Carl G

12

원격 브랜치 정리 주제

git branch -r | xargs -t -n 1 git branch -r --contains

여기에는 각 원격 분기와 최신 SHA가 속한 원격 분기가 나열됩니다.

이것은 어느 원격 브랜치가 병합되었지만 삭제되지 않았으며, 병합되지 않았으며 따라서 쇠퇴하는지 식별하는 데 유용합니다.

'tig'(gitk와 비슷하지만 터미널 기반)를 사용하는 경우 다음을 수행 할 수 있습니다

tig origin/feature/someones-decaying-feature

체크 아웃을하지 않고도 브랜치의 커밋 히스토리를 볼 수 있습니다.


3
잘 했어! 실제로 표시되는 내용을 둘러 보면 매우 유용합니다! GitHub 앱은 계층 구조가없는 알파벳순 목록이 아닌 브랜치의 시각적 표시에이를 통합해야합니다!
CMash

12

마스터에 병합 된 브랜치를 확인하려면 다음 명령을 사용해야합니다.

  • 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 마스터에 병합 된 모든 원격 저장소를 표시합니다.


5

다음은 지사를 병합했는지 여부를 파악해야 할 때의 기술입니다. 기능 분기에 대한 일반적인 시나리오 인 기본 지사와 함께 최신 버전으로 리베이스되었을 수도 있습니다.

이러한 접근법 중 어느 것도 바보 증거는 아니지만 여러 번 유용하다는 것을 알았습니다.

1 모든 지점에 대한 로그 표시

gitk 또는 TortoiseGit과 같은 시각적 도구를 사용하거나 단순히 --git with git log를 사용하여 히스토리를 통해 메인 브랜치에 대한 모든 병합을 볼 수 있습니다. 이 특정 기능 분기가 병합되었는지 여부를 확인할 수 있어야합니다.

2 피쳐 브랜치에서 병합 할 때 항상 원격 브랜치를 제거

기능 분기에서 병합 할 때 항상 로컬 및 원격 분기를 모두 제거하는 습관이 좋은 경우 다른 컴퓨터에서 원격을 업데이트하고 정리하면 기능 분기가 사라집니다.

이 작업을 기억하기 위해 이미 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

3 커밋 메시지로 검색

원격 지점을 항상 제거하지 않는 경우에도 비슷한 커밋을 검색하여 지점이 병합되었는지 여부를 확인할 수 있습니다. 함정은 스쿼시 커밋 또는 커밋 메시지 변경과 같이 원격 지사가 인식 할 수없는 것으로 리베이스 된 경우입니다.

  • 모든 리모컨 가져 오기 및 정리
  • 기능 브랜치에서 마지막 커밋 메시지 찾기
  • 마스터 브랜치에서 동일한 메시지를 가진 커밋을 찾을 수 있는지 확인

마스터 브랜치의 명령 예 :

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"
}

@anjdeas-1 단계-어떤 브랜치가 메인으로 병합되었는지 어떻게 알 수 있습니까? 나는 로그와 GUI 도구를 살펴 보았으며 명시 적으로 이것을 나타내는 곳을 찾을 수 없습니까 ???
허프

@TheHuff 이것을보십시오 :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]"
angularsen

@TheHuff TortoiseGit에서 메인 브랜치에있는 경우 메인에 모든 병합을 표시해야합니다.
angularsen

감사합니다. 그러나 병합이 무엇인지 어떻게 알 수 있습니까? 나는 그들이 모두 커밋이라고 가정하고 있습니다-이것이 맞습니까?
허프

@TheHuff : 커밋의 두 스트림 / 경로가 단일 커밋 "다운 스트림"(로그보기에서 더 높음)과 함께 병합되는 것을 시각적으로 볼 수 있습니다. 그 커밋은 병합 커밋입니다. 또한 병합 커밋 만 표시하도록 git log추가 할 수 있습니다 --merges. stackoverflow.com/a/25986615/134761
angularsen

4

다음은 현재 지점에 원격 원산지 / 마스터 지점의 데이터가 포함되어 있거나 데이터가 없는지 알려주는 작은 하나의 라이너입니다.

$ 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

내가 현재 있는지 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.