source

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

factcode 2023. 4. 19. 23:30
반응형

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

브랜치가 여러 개 있는 git 저장소가 있습니다.

마스터 브랜치에 이미 Marge된 브랜치를 확인하려면 어떻게 해야 합니까?

git branch --merged master마스터에 Marge된 브랜치를 나열합니다.

git branch --mergedHEAD에 병합된 브랜치(즉, 현재 브랜치의 끝)를 나타냅니다.

git branch --no-merged Marge가 를 나타냅니다.

기본적으로는 로컬브런치에만 적용됩니다.-a가 모두 또, 「브런치」는 「브런치」와 「브런치」를 나타냅니다.-r깃발을 들다

명령어를 사용하여 두 지점 간의 최신 공통 커밋을 검색할 수 있습니다.그 커밋이 브랜치헤드와 같은 경우는 브랜치가 완전히 Marge된 것입니다.

:git branch -d아직 완전히 병합되지 않은 브랜치 삭제를 거부하기 때문에 이미 이러한 작업을 수행하고 있습니다.

마스터에 Marge되는 브런치를 확인하려면 다음 명령을 사용해야 합니다.

  • git branch <flag[-r/-a/none]> --merged master이치노
  • git branch <flag[-r/-a/none]> --merged master | wc -l마스터에 병합된 모든 분기의 개수입니다.

플래그:

  • -aflag - (모두) 리모트브런치 및 로컬브런치를 표시합니다.
  • -rflag - (리모트) 리모트브런치만 표시
  • <emptyFlag>- 로컬 브랜치만 표시

예를 들어 다음과 같습니다. git branch -r --merged master마스터에 병합된 모든 원격 리포지토리가 표시됩니다.

그래피컬 인터페이스 솔루션도 있습니다.그냥 입력해 주세요.

gitk --all

새로운 어플리케이션창에 repo 전체의 그래픽이 표시됩니다.브런치가 이미 Marge 되었는지 아닌지는 쉽게 알 수 있습니다.

는 다음과 .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>

이 명령어는 2개의 커밋 간에 최적의 공통 상위 항목을 찾습니다.공통 조상이 "브랜치"의 마지막 커밋과 동일할 경우 "브랜치"가 이미 마스터에 병합되었다고 가정할 수 있습니다.

스텝은 다음과 같습니다.

  1. 마스터 브랜치에서 마지막 커밋 해시 찾기
  2. "브런치"에서 마지막 커밋 해시 찾기
  3. 실행git merge-base <commit-hash-step1> <commit-hash-step2>
  4. 스텝 3의 출력이 스텝2의 출력과 같은 경우, 「브런치」는 이미 마스터에 Marge 되어 있습니다.

git merge-base에 대한 자세한 내용은 https://git-scm.com/docs/git-merge-base를 참조하십시오.

원격 지점 정리 항목

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

여기에는 각 리모트브런치에 이어 최신 SHA가 속한 리모트브런치가 표시됩니다.

이것은 어떤 리모트브런치가 Marge 되었지만 삭제되지 않았는지, 어떤 리모트브런치가 Marge되지 않아 붕괴하고 있는지를 판별하는 데 도움이 됩니다.

tig(gitk와 비슷하지만 단말기 기반)를 사용하는 경우,

tig origin/feature/someones-decaying-feature

체크 아웃을 하지 않고 지점의 커밋 이력을 확인하다

git for-each-ref를 사용하여 특정 리모트브런치에 Marge되거나 Marge되지 않은 브랜치 목록을 가져옵니다(예:origin/integration)

<pattern>과 일치하는 모든 참조에 대해 반복하여 지정된 <format>에 따라 지정된 <key> 세트에 따라 정렬한 후 표시합니다.

: 치환: " "origin/integrationintegration git pullgit fetch.

「Marge」에 origin/integration

git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/
#                ^                           ^                           ^
#                A                           B                           C
branch1
branch2
branch3
branch4

.origin/integration
합니다.B: 지점명을 인쇄합니다.
만 봐주세요.heads

origin/integration

git for-each-ref --no-merged=origin/integration --format="%(committerdate:short) %(refname:short)" --sort=committerdate refs/heads
#                ^                              ^                                                  ^                    ^
#                A                              B                                                  C                    D
2020-01-14 branch10
2020-01-16 branch11
2020-01-17 branch12
2020-01-30 branch13

.Marge는 Marge를 사용합니다.origin/integration
B : 지점 、 지 datebbb 。
커밋 합니다.C: 커밋 날짜로 정렬합니다.
D만 보세요.heads

소스 브랜치가 마스터 브랜치에 Marge되었는지 여부를 확인하려면 다음 bash 명령을 사용할 수 있습니다.

git merge-base --is-ancestor <source branch name> master && echo "merged" || echo "not merged"

기능 브런치의 일반적인 시나리오인 메인 브런치와의 최신 상태를 유지하기 위해 브런치를 통합했는지 여부를 확인할 필요가 있는 경우의 테크닉을 다음에 나타냅니다.

두 방법 모두 바보 같은 증거는 아니지만, 여러 번 유용하다는 것을 알게 되었습니다.

1 모든 브랜치에 대한 로그 표시

gitk나 Tortoise Git 등의 비주얼 툴을 사용하거나 --all을 사용하여 git log를 기록하면 메인 브랜치에 대한 모든 Marge를 볼 수 있습니다.이 특정 기능 브랜치가 Marge되었는지 여부를 확인할 수 있습니다.

2 기능 브랜치로 Marge할 때는 반드시 리모트 브랜치를 삭제한다.

기능 브랜치로 Marge 할 때 로컬브런치와 리모트브런치를 모두 삭제하는 습관이 있는 경우는, 다른 컴퓨터의 리모트를 간단하게 업데이트 해 프루닝 하면, 기능 브랜치는 없어집니다.

이것을 기억하기 위해서, 나는 이미 git flow extensions(AVH 에디션)사용해 기능 브랜치를 로컬로 작성 및 Marge하고 있기 때문에, 리모트 브랜치를 자동적으로 삭제할지를 묻기 위해서 다음의 git flow 훅을 추가했습니다.

기능 브랜치 작성/종료 예시

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)$

.syslog/syslog/post-flow-syslog-syslog

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 커밋 메시지로 검색

리모트 브랜치를 반드시 삭제하지 않아도, 같은 커밋을 검색해 브랜치가 Marge 되었는지 아닌지를 확인할 수 있습니다.여기서의 함정은 커밋을 뭉개거나 커밋 메시지를 변경하는 등 리모트브런치가 인식할 수 없는 것에 근거하고 있는 경우입니다.

  • 모든 원격 가져오기 및 제거
  • 기능 브랜치에서 마지막 커밋 메시지를 찾습니다.
  • 마스터 브랜치에서 같은 메시지를 가진 커밋을 찾을 수 있는지 확인합니다.

마스터 브랜치의 명령어 예:

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 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그에 반대하여git branch --merged main다음과 같습니다.

diff <(git branch) <(git branch --merged main)

그러면 메인 지사로 통합되지 않은 지역 지사를 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/226976/how-can-i-know-if-a-branch-has-been-already-merged-into-master

반응형