Come posso sapere in git se un ramo è già stato fuso in master?

Ho un repository git con più rami.

Come posso sapere quali rami sono già stati uniti nel ramo principale?

git branch --merged master i rami uniti in master

git branch --merged liste di rami uniti fusi in HEAD (cioè tip of current branch)

git branch --no-merged elenchi di liste non unite che non sono state unite

Di default questo vale solo per le filiali locali. Il flag -a mostrerà sia i rami locali che quelli remoti e il flag -r mostra solo i rami remoti.

È ansible utilizzare il comando git merge-base per trovare l’ultimo commit comune tra i due rami. Se quel commit è uguale al tuo branch head, allora il branch è stato completamente unito.

Nota che git branch -d fa già questo genere di cose perché rifiuterà di cancellare un ramo che non è già stato completamente unito.

C’è anche una soluzione di interfaccia grafica. Basta digitare

gitk --all

Una nuova finestra dell’applicazione richiederà una rappresentazione grafica dell’intero repository, in cui è molto facile capire se un ramo è già stato unito o meno

Sul tema della pulizia di filiali remote

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

Elenca ciascun ramo remoto seguito da quali rami remoti si trovano all’interno dei loro ultimi SHA.

Ciò è utile per distinguere quali rami remoti sono stati uniti, ma non cancellati, e che non sono stati uniti e quindi in decadimento.

Se stai usando ‘tig’ (è come gitk ma basato sul terminale), allora puoi farlo

 tig origin/feature/someones-decaying-feature 

per vedere la cronologia dei commit di un ramo senza dover eseguire il checkout

Usa git merge-base .

Questo comando trova i migliori antenati comuni tra due commit. E se l’antenato comune è identico all’ultimo commit di un “ramo”, allora possiamo tranquillamente presumere che un “ramo” è già stato fuso nel master.

Ecco i passaggi

  1. Trova l’ultimo hash di commit sul ramo principale
  2. Trova l’ultimo hash di commit su un “ramo”
  3. Esegui il comando git merge-base .
  4. Se l’output del passaggio 3 è uguale all’output del passaggio 2, un “ramo” è già stato unito al master.

Maggiori informazioni su git merge-base https://git-scm.com/docs/git-merge-base .

Ecco le mie tecniche quando ho bisogno di capire se un ramo è stato unito, anche se potrebbe essere stato aggiornato per essere aggiornato con il nostro ramo principale, che è uno scenario comune per i rami di funzionalità.

Nessuno di questi approcci è infallibile, ma li ho trovati utili molte volte.

1 Mostra registro per tutti i rami

Usando uno strumento visivo come gitk o TortoiseGit, o semplicemente git accedi con –all, passa attraverso la cronologia per vedere tutte le unioni con il ramo principale. Dovresti essere in grado di individuare se questo particolare ramo di funzionalità è stato unito o meno.

2 Rimuovi sempre il ramo remoto durante l’unione in un ramo di funzione

Se hai la buona abitudine di rimuovere sempre sia la filiale locale che quella remota quando ti unisci in un ramo della funzione, puoi semplicemente aggiornare e sfoltire i telecomandi sul tuo altro computer e le diramazioni delle funzioni scompariranno.

Per aiutare a ricordare di farlo, sto già usando le estensioni di git flow (edizione AVH) per creare e unire i miei branch di feature localmente, quindi ho aggiunto il seguente hook git flow per chiedermi se voglio anche rimuovere automaticamente il ramo remoto.

Esempio di creazione / finitura ramo di funzionalità

 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 / ganci / post-flow-funzione-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 

3 Ricerca per messaggio di commit

Se non si rimuove sempre il ramo remoto, è comunque ansible cercare commit simili per determinare se il ramo è stato unito o meno. La trappola qui è se il ramo remoto è stato ribasato all'irriconoscibile, come lo schiacciamento dei commit o la modifica dei messaggi di commit.

  • Scarica e poti tutti i telecomandi
  • Trova il messaggio dell'ultimo commit sul ramo di funzionalità
  • Verifica se è ansible trovare un commit con lo stesso messaggio sul ramo principale

Esempi di comandi sul ramo principale:

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

Nella mia configurazione .profile bash

 alias gru='git remote update -p' alias glf=findCommitByMessage findCommitByMessage() { git log -i --grep="$1" } 

Sto usando la seguente funzione di bash come: 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 }