Ich habe ein Git-Repository mit mehreren Zweigen.
Wie kann ich wissen, welche Zweige bereits in den Hauptzweig eingebunden sind?
Ich habe ein Git-Repository mit mehreren Zweigen.
Wie kann ich wissen, welche Zweige bereits in den Hauptzweig eingebunden sind?
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
}
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
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
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!
Dieser Befehl zeigt also die Zweige an, die zusammengeführt wurden origin/master
aber NICHT aus der Ferne gelöscht?
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
.
origin/integration
Zweigstellegit 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)
origin/integration
Zweigstellegit 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)
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.
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.
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
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.
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"
}
@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.
@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]"
@TheHuff Wenn Sie sich in TortoiseGit auf dem Hauptzweig befinden, sollte es alle Zusammenführungen in den Hauptzweig anzeigen.
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.