Übergeben Sie ein Argument an einen Git-Alias-Befehl

71

Kann ich Argumente an den Alias ​​eines Git-Befehls übergeben?

Ich habe einen Alias ​​in der Git-Konfiguration, wie folgt:

rb1 = rebase -i HEAD~1
rb2 = rebase -i HEAD~2
rb3 = rebase -i HEAD~3
rb4 = rebase -i HEAD~4
....

Ist es möglich, einen rbAlias ​​zu erstellen, git rb <x>der für jeden funktioniert <x>?

Ich habe diesen Alias ​​ausprobiert:

rb = rebase -i HEAD~

aber dann git rb 8funktioniert das zum beispiel nicht.

Ist f
quelle
4
Warum machst du das so oft, dass du denkst, du brauchst diese Aliase?
Meagar
4
Die Frage kommt wirklich von der Abkürzung "Rebase", obwohl es für diese nicht so häufigen Befehle eine bedeutungslose Frage zu sein scheint . Diese Frage kann jedoch eine allgemeine Frage sein. Also ...
HaveF
Einverstanden mit @meagar. Wenn der springende Punkt dabei ist, alle Commits neu zu gründen, da Ihr Zweig von seinem übergeordneten Zweig abweicht, ohne direkt von diesem Zweig neu starten zu müssen, was zu Zusammenführungskonflikten führen kann, mit denen Sie sich im Moment möglicherweise nicht unbedingt befassen möchten Siehe meine Antwort.
Seth Flowers

Antworten:

97

Wenn Sie den Git-FAQ-Abschnitt "Git-Aliase mit Argument" betrachten , können Sie dies tun, indem Sie git über eine Shell aufrufen:

[alias]
        rb = "!sh -c \"git rebase -i HEAD~$1\" -"

Ich habe es noch nicht getestet, aber wenn Sie ein Argument übergeben können, wäre dies der richtige Weg.

Eine ähnliche Lösung wäre die Verwendung einer Shell-Funktion :

[alias]
        rb = "!f() { git rebase -i HEAD~$1; }; f"
VonC
quelle
Vielen Dank! Ich habe einen Alias ​​hinzugefügt, um Dateien in einem Commit anzuzeigen ($ 1 == Commit-Hash). shf = "! shf () {git diff-tree --no-commit-id --name-only -r $ 1;}; shf"
pymarco
5
Ich verwende 1.7.12.4 auf einem Mac und verwende das sh -cTeil nie ... "!git rebase -i HEAD~$1;"funktioniert gut für mich.
Droogans
2
Ich musste ein #Ende setzen: [config] rbi = "! Git rebase -i HEAD ~ $ 1 #"
Juan Antonio Tubío
"! f () {git rebase -i HEAD ~ $ 1;}; f" -Syntax funktioniert wie ein Zauber!
MartinJH
Sind die Anführungszeichen im ersten Alias ​​wirklich "..."..."..."und nicht "...'...'..."?
Nick Volynkin
4

Wiederherstellen aller Commits seit der Verzweigung

Wenn Sie nur alle Commits neu erstellen möchten, die in Ihrem Zweig neu sind, ist es seit der Verzweigung vom übergeordneten Zweig einfacher, nur den folgenden Alias ​​in Ihrer Konfiguration zu haben:

rbi = !sh -c \"git rebase -i `git merge-base $1 HEAD`\" -

Wenn Sie dann alle Commits, die Sie Ihrem aktuellen Zweig hinzugefügt haben, neu festlegen möchten, können Sie einfach Folgendes ausführen:

git rbi parentBranch

Bei diesem Ansatz wird ein Argument verwendet. Anstatt jedoch wissen zu müssen, wie viele Commits zurückgehen müssen, geben Sie einfach den Filialnamen an und ermitteln das letzte Commit, das zwischen dem aktuellen Zweig und dem übergeordneten Zweig über geteilt wird git merge-base

Warum das, anstatt Git Rebase -i ParentBranch

Der Grund, warum Sie dies eher als eine Straße tun würden, git rebase -i parentBranchist, dass Sie sich möglicherweise erst zu einem späteren Zeitpunkt mit den Zusammenführungskonflikten oder sogar mit einem Zusammenführungskonflikt in einem Commit und dann mit demselben Konflikt in derselben Zeile befassen möchten ein weiteres Commit. Siehe https://stackoverflow.com/a/31036645/444610

Seth Blumen
quelle
1
Interessante Variation. +1. Genauer als meine Antwort für den von Ihnen erwähnten Anwendungsfall.
VonC
1

@Droogans wies in einem Kommentar zu der akzeptierten Antwort darauf hin, dass Sie zumindest unter macOS (ich würde mir vorstellen, dass dies auch für jedes Unix-ähnliche Betriebssystem und möglicherweise sogar für Windows gilt) nur $1den Platzhalterwert verwenden können, der das Argument darstellt im Alias. So richten Sie einen Alias ​​ein, der Folgendes git rb 8ergibt git rebase -i HEAD~8:

    rb = "!git rebase -i HEAD~$1;"

Sie können es auch mehrmals in einem Alias ​​verwenden. Wenn Sie beispielsweise einen Alias ​​wünschen, in den übersetzt werden git f my-branchsoll git fetch origin my-branch:my-branch, können Sie Folgendes tun:

    f = "!git fetch origin $1:$1"
Andrew Patton
quelle
0

Ich habe diese Funktion "grb" geschrieben, um eine interaktive Git-Rebase auf einem Mac durchzuführen. Daher kann ich sagen, dass ich grb 5meine letzten 5 Commits anzeigen möchte :

function grb {
  git rebase -i HEAD~$1
}

Die Top-Antwort auf dieser Seite funktioniert bei mir nicht. So zeigen Sie meine .bash_profileund alle anderen Git-Aliase an, die ich auf meinem Mac verwende:

https://github.com/rayning0/bash_profile/blob/master/.bash_profile#L146

Raymond Gan
quelle
1
Zitieren Tilde sollte nicht notwendig sein
D. Ben Knoble