1495 Stimmen

Wie kann ich wissen, ob ein Zweig bereits in Master zusammengeführt wurde?

Ich habe ein Git-Repository mit mehreren Zweigen.

Wie kann ich wissen, welche Zweige bereits in den Hauptzweig eingebunden sind?

33voto

Carl G Punkte 15555

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
}

5 Stimmen

Das funktioniert nicht. Wenn die Quellverzweigung bereits in die Zielverzweigung zusammengeführt wurde und die Zielverzweigung dann ein paar weitere Übertragungen erhält, funktioniert es nicht mehr, aber ich weiß nicht, warum

1 Stimmen

1 Stimmen

@AlexanderMills Bei mir funktioniert es auch, wenn der Zielzweig nach dem Zusammenführen des Quellzweigs ein paar weitere Commits erhält

22voto

xxjjnn Punkte 13550

Zum Thema Bereinigung von Zweigstellen

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

Hier wird jeder entfernte Zweig aufgelistet, gefolgt davon, in welchen entfernten Zweigen sich die neuesten 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 verfallen sind.

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

tig origin/feature/someones-decaying-feature

um den Verlauf der Übertragungen eines Zweigs zu sehen, ohne dass ein Git-Checkout erforderlich ist

3 Stimmen

Gut gemacht, Mann! Sehr nützlich, wenn man erst einmal kapiert hat, was da eigentlich angezeigt wird! Die GitHub-App muss dies in eine visuelle Anzeige Ihrer Zweige einbinden, anstatt eine alphabetische Liste ohne Hierarchie!

0 Stimmen

Dieser Befehl zeigt also die Zweige an, die zusammengeführt wurden origin/master aber NICHT aus der Ferne gelöscht?

0 Stimmen

Ich denke schon... Sie müssen vielleicht die git remote prune origin um Ihren lokalen Rechner darüber zu informieren, was gelöscht wird und was nicht

14voto

customcommander Punkte 14199

Ich benutze git for-each-ref um eine Liste der Zweige zu erhalten, die entweder mit einem bestimmten entfernten Zweig zusammengeführt wurden oder nicht (z. B. origin/integration )

Iteriert über alle Referenzen, die mit <Muster> übereinstimmen, und zeigt sie entsprechend dem angegebenen <Format> an, nachdem sie nach dem angegebenen Satz von <Schlüssel> sortiert wurden.

Hinweis: ersetzen origin/integration avec integration wenn Sie dazu neigen git pull im Gegensatz zu git fetch .

Liste der lokalen Zweige, die mit dem entfernten Zweig zusammengeführt wurden origin/integration Zweigstelle

git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/
#                ^                           ^                           ^
#                A                           B                           C
branch1
branch2
branch3
branch4

A: Nehmen Sie nur die Zweige, die in den entfernten origin/integration Zweigstelle
B: Drucken des Zweigniederlassungsnamens
C: Schauen Sie sich nur heads Verweise (d. h. Verzweigungen)

Liste der lokalen Zweige, die NICHT mit dem entfernten Zweig zusammengeführt wurden origin/integration Zweigstelle

git for-each-ref --no-merged=origin/integration --format="%(committerdate:short) %(refname:short)" --sort=committerdate refs/heads
#                ^                              ^                                                  ^                    ^
#                A                              B                                                  C                    D
2020-01-14 branch10
2020-01-16 branch11
2020-01-17 branch12
2020-01-30 branch13

A: Nehmen Sie nur die Zweige, die NICHT in den entfernten Zweig zusammengeführt wurden origin/integration Zweigstelle
B: Drucken des Zweignamens zusammen mit dem Datum der letzten Übergabe
C: Ausgabe nach Übergabedatum sortieren
D: Schauen Sie sich nur heads Verweise (d. h. Verzweigungen)

0 Stimmen

Dieser Befehl funktioniert bei mir nicht -- Liste der lokalen Zweige, die NICHT in den entfernten Ursprungs-/Integrationszweig zusammengeführt wurden

11voto

Harish Ambady Punkte 10887

Um zu überprüfen, ob ein Quellzweig in den Masterzweig zusammengeführt wurde, kann der folgende Bash-Befehl verwendet werden:

git merge-base --is-ancestor <source branch name> master && echo "merged" || echo "not merged"

7voto

angularsen Punkte 7545

Hier sind meine Techniken, wenn ich herausfinden muss, ob ein Zweig zusammengeführt wurde, auch wenn er möglicherweise neu erstellt wurde, um mit unserem Hauptzweig auf dem neuesten Stand zu sein, was bei Feature-Zweigen häufig der Fall ist.

Keiner dieser Ansätze ist absolut sicher, aber ich habe sie schon oft als nützlich empfunden.

1 Protokoll für alle Zweige anzeigen

Verwenden Sie ein visuelles Werkzeug wie gitk oder TortoiseGit oder einfach git log mit --all, um die Historie aller Zusammenführungen zum Hauptzweig zu sehen. Sie sollten in der Lage sein, zu erkennen, ob dieser bestimmte Funktionszweig zusammengeführt wurde oder nicht.

2 Entfernen Sie immer den entfernten Zweig, wenn Sie einen Feature-Zweig einbinden

Wenn Sie sich angewöhnt haben, immer sowohl den lokalen als auch den entfernten Zweig zu entfernen, wenn Sie einen Funktionszweig zusammenführen, dann können Sie einfach die entfernten Zweige auf Ihrem anderen Computer aktualisieren und beschneiden und die Funktionszweige verschwinden.

Als Gedächtnisstütze verwende ich bereits git flow extensions (AVH-Ausgabe) um meine Feature-Zweige lokal zu erstellen und zusammenzuführen, also habe ich den folgenden Git-Flow-Hook hinzugefügt, der mich fragt, ob ich den entfernten Zweig auch automatisch entfernen möchte.

Beispiel für die Erstellung/Fertigstellung eines Merkmalszweigs

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 Übergabemeldung

Wenn Sie den entfernten Zweig nicht immer entfernen, können Sie trotzdem nach ähnlichen Commits suchen, um festzustellen, ob der Zweig zusammengeführt wurde oder nicht. Der Fallstrick dabei ist, dass der entfernte Zweig bis zur Unkenntlichkeit umgestaltet wurde, z. B. durch Zerquetschen von Commits oder Ändern von Commit-Meldungen.

  • Abrufen und Beschneiden aller Fernbedienungen
  • Nachricht der letzten Übergabe im Funktionszweig finden
  • Prüfen Sie, ob eine Übergabe mit derselben Nachricht im Master-Zweig 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"
}

0 Stimmen

@anjdeas - Schritt 1 - woher wissen Sie, welche Zweige mit dem Hauptzweig zusammengeführt wurden. Ich habe mir die Logs und Gui-Tools angesehen - und kann nirgends finden, wo dies explizit angezeigt wird.

0 Stimmen

@TheHuff Versuchen Sie dies: 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]"

0 Stimmen

@TheHuff Wenn Sie sich in TortoiseGit auf dem Hauptzweig befinden, sollte es alle Zusammenführungen in den Hauptzweig anzeigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X