Frage Wie kann ich in git wissen, wenn ein Zweig bereits in den Master eingebunden wurde?


Ich habe ein Git-Repository mit mehreren Zweigen.

Woher weiß ich, welche Zweige bereits in den Masterzweig eingebunden sind?


853
2017-10-22 18:23


Ursprung


Antworten:


git branch --merged master listet Zweige auf, die in Meister

git branch --merged listet Zweige auf, die in KOPF (d. h. Spitze des aktuellen Zweiges)

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 Remote - Zweige an, und der -r Flag zeigt nur die entfernten Zweige an.


1387
2017-10-22 18:33



Du kannst den ... benutzen git merge-base Befehl, um das letzte gemeinsame Commit zwischen den beiden Zweigen zu finden. Wenn das Commit dasselbe wie Ihr Zweig ist, wurde der Zweig vollständig zusammengeführt.

Beachten Sie, dass git branch -d tut so etwas schon, weil es sich weigern wird, einen Zweig zu löschen hat nicht wurde bereits vollständig zusammengeführt.


78
2017-10-22 18:25



Es gibt auch eine grafische Schnittstellenlösung. Schreib einfach

gitk --all

Ein neues Anwendungsfenster wird mit einer grafischen Darstellung Ihres gesamten Repos angezeigt, wo es sehr einfach zu erkennen ist, ob ein Zweig bereits zusammengeführt wurde oder nicht


22
2017-10-23 10:19



Zum Thema Remote-Filialen aufräumen

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

Dies listet jeden Remote-Zweig auf, gefolgt von den Remote-Verzweigungen, in denen sich die letzten SHAs befinden.

Dies ist nützlich, um zu erkennen, welche entfernten Zweige zusammengeführt, aber nicht gelöscht wurden und welche nicht zusammengeführt wurden und daher abfallen.

Wenn Sie 'tig' (wie gitk, aber terminalbasiert) verwenden, können Sie das tun

tig origin/feature/someones-decaying-feature

um den Commit-Verlauf einer Filiale zu sehen, ohne die Checkout-Funktion zu testen


12
2017-10-23 10:09



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

Dieser Befehl findet die besten gemeinsamen Vorfahren zwischen zwei Commits. Und wenn der gemeinsame Vorgänger identisch mit dem letzten Commit eines "Zweigs" ist, können wir mit Sicherheit annehmen, dass ein "Zweig" bereits in den Master eingebunden wurde.

Hier sind die Schritte

  1. Finde den letzten Commit-Hash in der Master-Verzweigung
  2. Finden Sie den letzten Commit-Hash in einer "Verzweigung"
  3. Führen Sie den Befehl aus git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Wenn die Ausgabe von Schritt 3 dieselbe ist wie die Ausgabe von Schritt 2, dann wurde bereits eine "Verzweigung" in den Master integriert.

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


7
2017-10-13 02:05



Hier sind meine Techniken, wenn ich herausfinden muss, ob eine Zweigstelle zusammengeführt wurde, auch wenn sie möglicherweise reformiert wurde, um mit unserer Hauptzweigstelle auf dem neuesten Stand zu sein, was ein häufiges Szenario für Zweigstellen ist.

Keine dieser Methoden ist narrensicher, aber ich habe sie oft nützlich gefunden.

1 Protokoll für alle Zweige anzeigen

Verwenden Sie ein visuelles Werkzeug wie gitk oder TortoiseGit oder einfach git log mit --all, durchlaufen Sie den Verlauf, um alle Zusammenführungen zum Hauptzweig zu sehen. Sie sollten in der Lage sein zu erkennen, ob dieser bestimmte Feature-Zweig zusammengeführt wurde oder nicht.

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

Wenn Sie eine gute Angewohnheit haben, sowohl den lokalen Zweig als auch den Remote-Zweig zu entfernen, wenn Sie in einem Feature-Zweig zusammenführen, können Sie die Remote-Objekte auf Ihrem anderen Computer einfach aktualisieren und entfernen.

Um sich daran erinnern zu können, benutze ich bereits Git-Flow-Erweiterungen (AVH Edition) um meine Feature-Zweige lokal zu erstellen und zusammenzuführen, habe ich den folgenden Git-Flow-Hook hinzugefügt, um mich zu fragen, ob ich den Remote-Zweig auch automatisch entfernen möchte.

Beispiel erstellen / beenden Feature-Zweig

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 Remote-Zweig nicht immer entfernen, können Sie immer noch nach ähnlichen Commits suchen, um festzustellen, ob der Zweig zusammengeführt wurde oder nicht. Der Haken hier ist, wenn die Remote-Zweigstelle auf das Unkenntliche umgestuft wurde, wie zum Beispiel das Quetschen von Commits oder das Ändern von Commit-Nachrichten.

  • Holen Sie alle Fernbedienungen ab und beschneiden Sie sie
  • Finden Sie die Nachricht des letzten Commits im Feature-Zweig
  • Prüfen Sie, ob ein Commit mit derselben Nachricht in der Master-Verzweigung gefunden werden kann

Beispielbefehle für den Master-Zweig:

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

In meiner Bash. Profil-Konfiguration

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

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

5
2018-05-29 08:45



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
}

2
2018-03-22 16:49