it-swarm.com.de

Woher weiß ich, ob eine Zweigstelle bereits mit dem Master zusammengeführt wurde?

Ich habe ein Git-Repository mit mehreren Filialen. 

Woher weiß ich, welche Filialen bereits in der Master-Filiale zusammengeführt sind?

930
hectorsq

git branch --merged master listet Zweige auf, die in master zusammengeführt wurden.

git branch --merged listet inHEADzusammengeführte Zweige (d. h. Spitze des aktuellen Zweigs)

git branch --no-merged listet Zweige auf, die nicht zusammengeführt wurden

Standardmäßig gilt dies nur für die lokalen Niederlassungen. Das -a-Flag zeigt sowohl lokale als auch entfernte Zweige, und das -r-Flag zeigt nur die entfernten Zweige.

1523
hectorsq

Mit dem Befehl git merge-base können Sie das letzte gemeinsame Commit zwischen den beiden Zweigen ermitteln. Wenn dieses Commit mit Ihrem Zweigleiter identisch ist, wurde der Zweig vollständig zusammengeführt.

Beachten Sie, dass git branch -d dies bereits tut, weil es das Löschen eines Zweigs verweigert, der nicht bereits vollständig zusammengefügt wurde.

89
Greg Hewgill

Es gibt auch eine grafische Schnittstellenlösung. Schreib einfach

gitk --all

Ein neues Anwendungsfenster zeigt Prompt mit einer grafischen Darstellung Ihres gesamten Repos an, wobei es sehr leicht zu erkennen ist, ob ein Zweig bereits zusammengeführt wurde oder nicht

24
iberbeu

Zum Thema entfernte Filialen bereinigen

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

Hier wird jeder entfernte Zweig aufgelistet, gefolgt von den entfernten Zweigstellen, in denen sich die neuesten SHAs befinden.

Dies ist nützlich, um festzustellen, welche Remote-Zweige zusammengefügt, aber nicht gelöscht wurden, und welche nicht zusammengeführt wurden und daher zerfallen.

Wenn Sie 'tig' verwenden (es ist wie gitk aber endgerätebasiert), dann können Sie das 

tig Origin/feature/someones-decaying-feature

so können Sie die Festschreibungshistorie einer Zweigstelle anzeigen, ohne zur Kasse gehen zu müssen

12
xxjjnn

Verwenden Sie git merge-base <commit> <commit>

Dieser Befehl findet den besten gemeinsamen Vorfahren zwischen zwei Commits. Und wenn der gemeinsame Vorfahr mit dem letzten Commit eines "Zweigs" identisch ist, können wir davon ausgehen, dass ein "Zweig" bereits mit dem Master zusammengeführt wurde.

Hier sind die Schritte

  1. Suche nach dem letzten Commit-Hash im Master-Zweig 
  2. Letzten Commit-Hash auf einem "Zweig" finden 
  3. Führen Sie den Befehl git merge-base <commit-hash-step1> <commit-hash-step2> aus. 
  4. Wenn die Ausgabe von Schritt 3 der Ausgabe von Schritt 2 entspricht, wurde eine "Verzweigung" bereits mit dem Master zusammengeführt.

Weitere Informationen zu git merge-base https://git-scm.com/docs/git-merge-base

11
Hari

Ich verwende die folgende Bash-Funktion wie: 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
}
9
Carl G

Hier sind meine Techniken, wenn ich herausfinden muss, ob eine Verzweigung zusammengeführt wurde, auch wenn sie möglicherweise auf den neuesten Stand unserer Hauptverzweigung gebracht wurde. Dies ist ein übliches Szenario für Verzweigungen von Funktionen.

Keiner dieser Ansätze ist idiotensicher, aber ich habe sie oft als nützlich befunden.

1 Protokoll für alle Niederlassungen anzeigen

Mit einem visuellen Werkzeug wie gitk oder TortoiseGit oder einfach mit --all protokollieren Sie den Verlauf, um alle Zusammenführungen mit dem Hauptzweig anzuzeigen. Sie sollten in der Lage sein zu erkennen, ob dieser bestimmte Funktionszweig zusammengeführt wurde oder nicht.

2 Entfernen Sie den Remote-Zweig immer, wenn Sie ihn in einem Feature-Zweig zusammenführen

Wenn Sie die Gewohnheit haben, beim Zusammenführen in einem Funktionszweig immer sowohl den lokalen Zweig als auch den entfernten Zweig zu entfernen, können Sie einfach die Remotes und Prune-Fernbedienungen auf Ihrem anderen Computer aktualisieren und die Zweigzweige werden ausgeblendet.

Um dies zu erleichtern, verwende ich bereits git flow-Erweiterungen (AVH Edition) , um meine Feature-Zweige lokal zu erstellen und zusammenzuführen. Daher fügte ich den folgenden Git Flow-Hook hinzu, um zu fragen, ob ich auch automatisch entfernen möchte der entfernte Zweig.

Beispiel Feature-Zweig erstellen/beenden

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

3 Suche nach Commit-Nachricht

Wenn Sie den entfernten Zweig nicht immer entfernen, können Sie immer noch nach ähnlichen Commits suchen, um festzustellen, ob der Zweig zusammengeführt wurde oder nicht. Die Gefahr besteht hier, wenn der entfernte Zweig auf das Nicht-Erkennbare umgestaltet wurde, z. B. das Komprimieren von Commits oder das Ändern von Commit-Nachrichten.

  • Holen Sie sich und entfernen Sie alle Fernbedienungen
  • Nachricht des letzten Commits für den Funktionszweig finden
  • Prüfen Sie, ob ein Commit mit derselben Nachricht in der Master-Zweigstelle gefunden werden kann

Beispielbefehle im Master-Zweig:

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

In meiner bash .profile config

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

findCommitByMessage() {
    git log -i --grep="$1"
}
5
angularsen

Um zu überprüfen, welche Zweige zum Master zusammengeführt wurden, sollten Sie die folgenden Befehle verwenden:

  • git branch <flag[-r/-a/none]> --merged master Liste aller im Master zusammengeführten Zweige.
  • git branch <flag[-r/-a/none]> --merged master | wc -l Anzahl aller Zweige, die zum Master zusammengeführt wurden.

Flaggen sind:

  • -a flag - (all) zeigt entfernte und lokale Zweige an
  • -r flag - (remote) zeigt nur entfernte Zweige an
  • <emptyFlag> - zeigt nur local Zweige

zum Beispiel: git branch -r --merged master zeigt Ihnen alle Remote-Repositorys, die in master zusammengeführt wurden.

1
avivamg

Hier ist ein kleiner Einzeiler, der Ihnen mitteilt, ob Ihre aktuelle Niederlassung Daten von einer entfernten Origin/Master-Niederlassung enthält oder nicht:

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

Ich bin auf diese Frage gestoßen, als ich an einem Feature-Zweig gearbeitet habe und häufig sicherstellen wollte, dass ich die neuesten Arbeiten in meinem eigenen separaten Zweig habe. 

Um diesen Test zu verallgemeinern, habe ich meinem ~/.gitconfig den folgenden Alias ​​hinzugefügt:

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

Dann kann ich anrufen:

$ git current Origin/master

um zu überprüfen, ob ich aktuell bin. 

0
radke