여러 분기가 있는 git 저장소가 있습니다.
마스터 브랜치에 이미 병합된 브랜치를 어떻게 알 수 있습니까?
질문자 :hectorsq
여러 분기가 있는 git 저장소가 있습니다.
마스터 브랜치에 이미 병합된 브랜치를 어떻게 알 수 있습니까?
git branch --merged master
는 마스터에 병합된 분기를 나열합니다.
git branch --merged
는 HEAD에 병합된 분기를 나열합니다(즉, 현재 분기의 끝).
git branch --no-merged
는 병합되지 않은 분기를 나열합니다.
기본적으로 이것은 로컬 브랜치에만 적용됩니다. -a
플래그는 로컬 및 원격 분기를 모두 표시하고 -r
플래그는 원격 분기만 표시합니다.
git merge-base
명령을 사용하여 두 분기 간의 최신 공통 커밋을 찾을 수 있습니다. 해당 커밋이 분기 헤드와 동일하면 분기가 완전히 병합된 것입니다.
git branch -d
는 이미 완전히 병합 되지 않은 분기 삭제를 거부하기 때문에 이미 이러한 종류의 작업을 수행합니다.
그래픽 인터페이스 솔루션도 있습니다. 그냥 입력
gitk --all
새 응용 프로그램 창에서 전체 저장소를 그래픽으로 표시하여 분기가 이미 병합되었는지 여부를 쉽게 알 수 있습니다.
마스터에 병합된 분기를 확인하려면 다음 명령을 사용해야 합니다.
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
는 마스터에 병합된 모든 원격 저장소를 표시합니다.
다음과 같은 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 에 대한 추가 정보.
원격 지점 정리 주제에 대해
git branch -r | xargs -t -n 1 git branch -r --contains
여기에는 최신 SHA가 있는 원격 분기 뒤에 오는 각 원격 분기가 나열됩니다.
이것은 병합되었지만 삭제되지 않은 원격 분기와 병합되지 않아 소멸되는 원격 분기를 식별하는 데 유용합니다.
'tig'(gitk와 비슷하지만 터미널 기반)를 사용하는 경우 다음을 수행할 수 있습니다.
tig origin/feature/someones-decaying-feature
git checkout 없이 브랜치의 커밋 히스토리 보기
git for-each-ref origin/integration
)에 병합되거나 병합되지 않은 분기 목록을 가져옵니다.
주어진 <key> 세트에 따라 정렬한 후 <pattern>과 일치하는 모든 참조를 반복하고 지정된 <format>에 따라 표시합니다.
참고: git fetch
대신 git pull
을 사용하는 경향이 있는 경우 origin/integration
을 integration
바꾸십시오.
origin/integration
브랜치에 병합된 로컬 브랜치 목록 git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/ # ^ ^ ^ # ABC 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 # ^ ^ ^ ^ # ABCD 2020-01-14 branch10 2020-01-16 branch11 2020-01-17 branch12 2020-01-30 branch13
origin/integration
분기에 병합되지 않은 분기만 가져옵니다.
B: 마지막 커밋 날짜와 함께 분기 이름을 인쇄합니다.
C: 커밋 날짜별로 출력 정렬
heads
(예: 분기)만 봅니다.
다음은 기능 분기에 대한 일반적인 시나리오인 기본 분기와 함께 최신 상태로 리베이스되었을 수 있는 경우에도 분기가 병합되었는지 확인해야 할 때의 기술입니다.
이러한 접근 방식 중 어느 것도 완벽한 증거는 아니지만 여러 번 유용하다는 것을 알았습니다.
gitk 또는 TortoiseGit과 같은 시각적 도구를 사용하거나 --all과 함께 간단히 git log를 사용하여 기록을 살펴보고 기본 분기에 대한 모든 병합을 확인합니다. 이 특정 기능 분기가 병합되었는지 여부를 확인할 수 있어야 합니다.
기능 브랜치를 병합할 때 항상 로컬 브랜치와 원격 브랜치를 모두 제거하는 좋은 습관이 있다면 다른 컴퓨터에서 단순히 원격 브랜치를 업데이트하고 정리할 수 있으며 기능 브랜치는 사라질 것입니다.
이 작업을 기억하는 데 도움이 되도록 이미 git 흐름 확장(AVH 버전) 을 사용하여 기능 분기를 로컬로 만들고 병합하고 있으므로 다음 git 흐름 후크를 추가하여 원격 분기도 자동 제거할지 묻습니다.
기능 분기 생성/완료 예
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 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
내가 현재 상태인지 확인하기 위해.
출처 : http:www.stackoverflow.com/questions/226976/how-can-i-know-if-a-branch-has-been-already-merged-into-master
Firefox 또는 Chrome 브라우저에서 HTTP POST 요청을 수동으로 보내는 방법 (0) | 2023.04.26 |
---|---|
값을 기준으로 다차원 배열을 정렬하는 방법 (0) | 2023.04.26 |
git 브랜치 이름 지정에 일반적으로 사용되는 몇 가지 예는 무엇입니까? [닫은] (0) | 2023.04.26 |
여러 git 커밋을 되돌리는 방법은 무엇입니까? (0) | 2023.04.26 |
여러 열에서 그룹화 사용 (0) | 2023.04.26 |