Temukan cabang Git yang tidak dihapus?


276

Saya memiliki repositori Git dengan banyak cabang, beberapa dari mereka sudah bergabung dan beberapa tidak. Karena jumlah cabang cukup besar, bagaimana saya bisa menentukan cabang mana yang belum digabung? Saya ingin menghindari melakukan penggabungan "gurita" dan menggabungkan kembali cabang yang telah digabung.


1
Pertama saya tertawa tentang istilah "gurita bergabung". Tetapi jika Anda tidak tahu, seperti saya: Itu adalah nama resmi strategi gabungan :-) Lihat git-scm.com/docs/git-merge atau atlassian.com/de/git/tutorials/using-branches/ merge-strategy
observer

Jawaban:


463

Coba ini:

git branch --merged master

Itu melakukan apa yang tertulis di kaleng (daftar cabang yang telah digabung ke dalam master). Anda juga dapat menarik kebalikannya dengan:

git branch --no-merged master

Jika Anda tidak menentukan master, misalnya ..

git branch --merged

maka itu akan menunjukkan kepada Anda cabang yang telah digabungkan ke dalam arus HEAD(jadi jika Anda aktif master, ini setara dengan perintah pertama; jika Anda aktif foo, itu setara dengan git branch --merged foo).

Anda juga dapat membandingkan cabang-cabang hulu dengan menentukan -rtanda dan referensi yang harus diperiksa, yang bisa lokal atau jauh:

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

5
Jika Anda menggabungkan fooke master, itu akan muncul dalam git branch --merged masterdaftar. Tetapi apa yang terjadi jika Anda berkomitmen sekali lagi foo? Apakah itu tidak lagi muncul dalam daftar itu, atau apakah, meskipun memiliki komitmen baru, itu pada satu titik bergabung ke dalam master?
Craig Otis

11
@CraigOtis Tidak akan lagi muncul dalam daftar. --mergedhanya daftar cabang yang sepenuhnya digabung ke cabang yang diberikan.
Kuning

dan gitk --remotes --not origin/masterakan menunjukkan komit pada setiap cabang yang belum digabungkan untuk dikuasai.
yoyo

5
Bayangkan ini ... jawaban git yang mudah dimengerti dan digunakan!
jleach

1
Apakah ada cara untuk mendapatkan daftar tanpa memeriksa cabang? Suka menunjuk ke server lalu mendapatkan daftarnya?
xbmono

57

Anda juga dapat menggunakan -rparameter untuk menampilkan cabang jarak jauh yang tidak digabungkan menjadi master:

git branch -r --merged master

git branch -r --no-merged

                         

19
atau -auntuk melihat jarak jauh dan lokal secara bersamaan
Simon Forsberg

1
Haruskah yang terakhir adalah git branch -r --no-merger?
MortimerCat

28

Jika cabang sudah digabung, menggabungkannya lagi tidak akan melakukan apa-apa. Jadi, Anda tidak perlu khawatir tentang "menggabungkan kembali" cabang yang sudah digabung.

Untuk menjawab pertanyaan Anda, Anda bisa mengeluarkan

 git branch --merged

untuk melihat cabang yang digabung atau

 git branch --no-merged

untuk melihat cabang tanpa penghalang. Cabang Anda saat ini tersirat tetapi Anda dapat menentukan cabang lain jika Anda mau.

 git branch --no-merged integration

akan menunjukkan cabang yang belum digabung menjadi integrationcabang.


1

Skrip di bawah ini akan menemukan semua origin/*cabang di depan cabang saat ini

#!/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

Versi skrip terbaru


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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.