ค้นหาสาขา Git ที่ยังไม่ได้ขุด?


276

ฉันมีพื้นที่เก็บข้อมูล Git ที่มีสาขาจำนวนมากบางแห่งรวมอยู่แล้วและบางสาขาไม่ได้ เนื่องจากจำนวนสาขามีขนาดค่อนข้างใหญ่ฉันจะทราบได้อย่างไรว่าสาขาใดที่ยังไม่ได้รวมเข้าด้วยกัน ฉันต้องการหลีกเลี่ยงไม่ให้ทำการรวม "octopus" และการรวมสาขาใหม่ที่รวมเข้าด้วยกันแล้ว


1
ครั้งแรกที่ฉันหัวเราะเกี่ยวกับคำว่า "octopus merge" แต่ในกรณีที่คุณไม่ทราบเช่นฉัน: นั่นเป็นชื่ออย่างเป็นทางการของกลยุทธ์การผสาน :-) ดูgit-scm.com/docs/git-mergeหรือatlassian.com/de/git/tutorials/using-branches/ ผสานกลยุทธ์
ผู้สังเกตการณ์

คำตอบ:


462

ลองสิ่งนี้:

git branch --merged master

มันไม่สิ่งที่กล่าวในดีบุก (สาขารายชื่อที่ได้รับการผสานเข้าmaster) นอกจากนี้คุณยังสามารถดึงค่าผกผันด้วย:

git branch --no-merged master

หากคุณไม่ได้ระบุmasterเช่น ..

git branch --merged

จากนั้นจะแสดงให้คุณเห็นถึงสาขาที่ได้รับการผสานเข้ากับปัจจุบันHEAD(ดังนั้นถ้าคุณเปิดอยู่masterก็เท่ากับคำสั่งแรกถ้าคุณเปิดอยู่fooก็เท่ากับgit branch --merged foo)

คุณสามารถเปรียบเทียบสาขาอัพสตรีมโดยระบุ-rแฟล็กและการอ้างอิงเพื่อตรวจสอบซึ่งอาจเป็นโลคัลหรือรีโมต:

git branch -r --no-merged origin/master

5
หากคุณผสานfooเข้าmasterก็จะปรากฏในgit branch --merged masterรายการ แต่สิ่งที่เกิดขึ้นถ้าคุณกระทำอีกครั้งเพื่อfoo? มันจะไม่ปรากฏในรายการนั้นอีกต่อไปหรือไม่แม้ว่ามันจะมีความมุ่งมั่นใหม่มันก็มีอยู่ณ จุดหนึ่งที่ถูกรวมเข้าด้วยกันmaster?
Craig Otis

11
@CraigOtis มันจะไม่ปรากฏในรายการอีกต่อไป --mergedเฉพาะสาขารายการที่สมบูรณ์รวมเข้าไปในสาขาที่กำหนด
แอมเบอร์

และgitk --remotes --not origin/masterจะแสดงให้เห็นถึงความมุ่งมั่นในแต่ละสาขาที่ไม่ได้รวมเข้ากับมาสเตอร์
yoyo

5
ลองนึกภาพนี้ ... คำตอบ git ง่ายต่อการเข้าใจและใช้!
jleach

1
มีวิธีรับรายการโดยไม่ต้องตรวจสอบสาขาหรือไม่ ชอบชี้ไปที่เซิร์ฟเวอร์แล้วรับรายการหรือไม่
xbmono

57

คุณยังสามารถใช้พารามิเตอร์ -r เพื่อแสดงรีโมตแบรนช์ที่ไม่ได้ผสานเข้ากับมาสเตอร์:

git branch -r --merged master

git branch -r --no-merged

19
หรือ-aเพื่อดูทั้งระยะไกลและท้องถิ่นพร้อมกัน
Simon Forsberg

1
อันสุดท้ายควรเป็นสาขาคอมไพล์ -r - เจ้านายที่ไม่รวมกันหรือไม่
MortimerCat

28

หากมีการรวมสาขาแล้วการรวมสาขาอีกครั้งจะไม่ทำอะไรเลย ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับสาขา "การรวมกันอีกครั้ง" ที่ถูกผสานแล้ว

เพื่อตอบคำถามของคุณคุณสามารถออก

 git branch --merged

เพื่อดูสาขาที่ผสานหรือ

 git branch --no-merged

เพื่อดูกิ่งที่ยังไม่จม สาขาปัจจุบันของคุณมีความหมาย แต่คุณสามารถระบุสาขาอื่นได้หากต้องการ

 git branch --no-merged integration

จะแสดงให้คุณเห็นสาขาที่ยังไม่ได้รวมเข้าไปในintegrationสาขา


1

สคริปต์ด้านล่างจะค้นหาorigin/*สาขาทั้งหมดที่อยู่ก่อนหน้าสาขาปัจจุบัน

#!/bin/bash

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

echo -e "Current branch: \e[94m$CURRENT_BRANCH\e[0m"
echo ''

git branch -a | grep remotes/origin/ | while read LINE
do
    CMD="git diff --shortstat remotes/origin/${CURRENT_BRANCH}...${LINE}"

    if $CMD | grep ' file' > /dev/null; then
        echo -e "\e[93m$LINE\e[0m" | sed 's/remotes\/origin\///'
        $CMD
        echo ''
    fi
done

สคริปต์เวอร์ชันล่าสุด


0
Below script will fetch you unmerged branches and write results in .xls file 
#!/usr/bin/env bash
echo "getting list of unmerged_branches from the remote"
file_name=unmerged_branches.xls`enter code here`
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
for branch in `git branch -r --no-merged | grep -v HEAD`;
do echo -e `git show --format="%cd  \\t%cr  \\t%ae" $branch | head -n 1` \\t$branch; 
done | sort -r >> $current_time.$file_name
echo "result is writtein in ";
echo $current_time.$file_name;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.