Bagaimana saya bisa tahu jika cabang sudah digabung menjadi master?

1140

Saya memiliki repositori git dengan banyak cabang.

Bagaimana saya bisa tahu cabang mana yang sudah bergabung ke cabang master?

hectorsq
sumber

Jawaban:

1793

git branch --merged masterdaftar cabang digabung menjadi master

git branch --mergeddaftar cabang yang digabung ke dalam HEAD (yaitu ujung cabang saat ini)

git branch --no-merged daftar cabang yang belum digabung

Secara default ini hanya berlaku untuk cabang lokal. The -abendera akan menunjukkan kedua cabang lokal dan remote, dan -rbendera menunjukkan hanya cabang terpencil.

hectorsq
sumber
2
Hanya catatan tambahan, ketika saya mencoba melihat apakah cabang jarak jauh telah digabung, saya pertama-tama menyiapkan cabang pelacakan lokal, mengidentifikasi statusnya dengan git branch --mergeddan kemudian menghapus cabang-cabang lokal dan jauh.
Kenneth Kalmer
83
Tampaknya, git branch -a --merged/no-mergeditu juga berfungsi, tanpa membuat cabang pelacakan lokal dalam proses.
fresskoma
70
Atau hanya git branch -r --merged/--no-mergeduntuk hanya menemukan cabang yang jauh.
Asfand Qazi
5
Adakah cara untuk menghapus cabang yang tidak dihapus yang sebenarnya digabungkan setelah rebasing?
Ashfame
9
Catatan yang --merged/--no-mergedmembutuhkan argumen komit opsional setelahnya. Setidaknya dalam versi git saya (1.9.1), menambahkan -aatau -rmenandai setelah itu memberi saya kesalahan fatal. Tambahkan -aatau -r sebelumnya --(no-)merged .
Jonathan Gawrych
113

Anda dapat menggunakan git merge-baseperintah untuk menemukan komit umum terbaru antara dua cabang. Jika komit itu sama dengan kepala cabang Anda, maka cabang telah sepenuhnya digabung.

Perhatikan bahwa git branch -dlakukan hal semacam ini karena akan menolak untuk menghapus cabang yang belum sepenuhnya digabung.

Greg Hewgill
sumber
3
Jawaban @ hari lebih detail tentang cara menggunakan ini.
Muhd
bagaimana kita dapat melakukan ini secara otomatis / terprogram?
Alexander Mills
1
"belum sepenuhnya digabung" ... sepenuhnya digabung ke cabang apa?
Alexander Mills
@AlexanderMills: Ke cabang Anda saat ini.
Greg Hewgill
2
@AlexanderMills: git branch -dakan menolak untuk menghapus cabang yang belum digabungkan ke cabang saat ini. Tidak menghapus cabang saat ini .
Greg Hewgill
27

Ada solusi antarmuka grafis juga. Ketik saja

gitk --all

Jendela aplikasi baru akan meminta dengan representasi grafis dari seluruh repo Anda, di mana sangat mudah untuk menyadari jika cabang sudah digabung atau tidak

iberbeu
sumber
17
Yang jelas, membutuhkan instalasi aplikasi yang bukan bagian dari gitklien. Di Ubuntu apt-get install gitk,.
metame
Di macOS, jika Anda memiliki Homebrew terinstal, akan brew install git-gui, untuk mendapatkan gitkdi commandline.
program247365
24

Saya menggunakan fungsi bash berikut seperti: 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
}
Carl G
sumber
3
ini sebenarnya tidak berhasil. Jika cabang sumber telah bergabung ke cabang tujuan, dan kemudian cabang tujuan mendapat beberapa komitmen lagi, itu tidak berfungsi lagi tetapi saya tidak tahu mengapa
Alexander Mills
1
lihat pertanyaan di sini: stackoverflow.com/questions/51355331/…
Alexander Mills
18

Gunakan git merge-base <commit> <commit>.

Perintah ini menemukan leluhur bersama terbaik di antara dua commit. Dan jika nenek moyang yang sama identik dengan komit terakhir dari "cabang", maka kita dapat dengan aman berasumsi bahwa "cabang" telah digabung menjadi master.

Inilah langkah-langkahnya

  1. Temukan hash komit terakhir di cabang master
  2. Temukan hash komit terakhir di "cabang"
  3. Jalankan perintah git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Jika output dari langkah 3 sama dengan output dari langkah 2, maka "cabang" telah digabung menjadi master.

Info lebih lanjut tentang git merge-base https://git-scm.com/docs/git-merge-base .

Hari
sumber
2
Saya pikir ini hanya akan memberi tahu Anda jika tips digabungkan. Misalnya, ini tidak akan memberi tahu Anda jika masterdigabungkan branch, dan kemudian 4 komitmen ditambahkan branch.
mkobit
Mengapa tidak git log -1 $(git merge-base base-branch feature-branch)dan jika Anda melihat feature-branchdi output, maka Anda tahu mereka digabungkan?
Carl G
12

Pada topik membersihkan cabang-cabang terpencil

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

Ini mencantumkan setiap cabang jarak jauh yang diikuti oleh cabang jarak jauh mana SHA terbaru mereka berada.

Ini berguna untuk membedakan cabang jarak jauh mana yang telah digabung tetapi tidak dihapus, dan mana yang belum digabung dan karenanya membusuk.

Jika Anda menggunakan 'tig' (seperti gitk tapi berbasis terminal) maka Anda bisa

tig origin/feature/someones-decaying-feature

untuk melihat riwayat komit cabang tanpa harus melakukan checkout

xxjjnn
sumber
3
Bagus sekali, pria itu! Sangat berguna setelah Anda mengetahui apa yang sebenarnya ditampilkan! Aplikasi GitHub perlu memasukkan ini ke dalam tampilan visual cabang Anda, bukan daftar alfabet tanpa hierarki!
CMash
12

Untuk memverifikasi cabang mana yang digabungkan menjadi master, Anda harus menggunakan perintah ini:

  • git branch <flag[-r/-a/none]> --merged master daftar semua cabang digabung menjadi master.
  • git branch <flag[-r/-a/none]> --merged master | wc -l hitung jumlah semua cabang yang digabung menjadi master.

Bendera:

  • -aflag - (semua) yang menunjukkan cabang jarak jauh dan lokal
  • -rflag - (jarak jauh) hanya menampilkan cabang jarak jauh
  • <emptyFlag>- menunjukkan lokal cabang

misalnya: git branch -r --merged master akan menunjukkan semua repositori jarak jauh yang digabung menjadi master.

avivamg
sumber
5

Berikut adalah teknik saya ketika saya perlu mencari tahu apakah cabang telah digabung, bahkan jika mungkin telah diubah kembali agar tetap up to date dengan cabang utama kami, yang merupakan skenario umum untuk cabang fitur.

Tidak satu pun dari pendekatan ini adalah bukti bodoh, tetapi saya telah menemukan mereka berguna berkali-kali.

1 Tampilkan log untuk semua cabang

Menggunakan alat visual seperti gitk atau TortoiseGit, atau cukup git log dengan --all, lihat sejarah untuk melihat semua penggabungan ke cabang utama. Anda harus dapat melihat apakah cabang fitur khusus ini telah digabung atau tidak.

2 Selalu hapus cabang jarak jauh ketika bergabung dalam cabang fitur

Jika Anda memiliki kebiasaan yang baik untuk selalu menghapus cabang lokal dan remote ketika Anda bergabung dalam cabang fitur, maka Anda dapat dengan mudah memperbarui dan memangkas remote di komputer lain dan cabang fitur akan hilang.

Untuk membantu mengingat hal ini, saya sudah menggunakan ekstensi git flow (edisi AVH) untuk membuat dan menggabungkan cabang-cabang fitur saya secara lokal, jadi saya menambahkan kait aliran git berikut untuk bertanya apakah saya juga ingin menghapus otomatis cabang jarak jauh.

Contoh membuat / menyelesaikan cabang fitur

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-fitur-selesai

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 Cari berdasarkan pesan komit

Jika Anda tidak selalu menghapus cabang jarak jauh, Anda masih bisa mencari komit yang sama untuk menentukan apakah cabang telah digabung atau belum. Perangkap di sini adalah jika cabang jarak jauh telah direstrukturisasi menjadi yang tidak dapat dikenali, seperti squashing commit atau mengubah pesan komit.

  • Ambil dan pangkas semua remote
  • Temukan pesan komit terakhir pada cabang fitur
  • Lihat apakah komit dengan pesan yang sama dapat ditemukan di cabang master

Contoh perintah pada cabang utama:

gru                   
gls origin/feature/foo
glf "my message"

Di bash saya. Konfigurasi profil

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}
angularsen
sumber
@anjdeas - langkah 1 - bagaimana Anda tahu cabang mana yang telah digabungkan menjadi cabang utama. Saya telah melihat alat-alat log dan gui - dan tidak dapat menemukan tempat di mana ia secara eksplisit menunjukkan ini ???
The Huff
@TheHuff Coba ini: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 Di TortoiseGit, jika Anda berada di cabang utama, itu akan menampilkan semua penggabungan ke dalam main.
angularsen
Terima kasih - tetapi bagaimana saya tahu apa itu penggabungan? Saya berasumsi mereka semua berkomitmen - apakah ini benar?
The Huff
@TheHuff: Anda harus secara visual melihat dua aliran / jalur komit bergabung bersama menjadi komit tunggal "hilir" (lebih tinggi di tampilan log). Komit itu adalah komit gabungan. Juga, di git logAnda dapat menambahkan --mergesuntuk hanya menampilkan komit gabungan. stackoverflow.com/a/25986615/134761
angularsen
4

Berikut ini adalah satu-liner kecil yang akan memberi tahu Anda jika cabang Anda saat ini menggabungkan atau kehabisan data dari cabang asal / master jarak jauh:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

Saya menemukan pertanyaan ini ketika mengerjakan cabang fitur dan sering ingin memastikan bahwa saya memiliki karya terbaru yang dimasukkan ke dalam cabang kerja saya sendiri yang terpisah.

Untuk menggeneralisasi tes ini, saya telah menambahkan alias berikut ke ~ / .gitconfig saya:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

Maka saya bisa menelepon:

$ git current origin/master

untuk memeriksa apakah saya terkini.

Radke
sumber