web-dev-qa-db-fra.com

Passer un argument à une commande d'alias Git

Puis-je passer des arguments à l'alias d'une commande Git?

J'ai quelques alias dans Git config, comme ceci:

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

Est-il possible de créer un alias rb afin que git rb <x> fonctionne pour tout <x>?

J'ai essayé cet alias:

rb = rebase -i HEAD~

mais alors par exemple git rb 8 ne fonctionne pas.

64
HaveF

Si vous considérez la section Git Faq "Alias ​​Git avec argument" , vous pouvez le faire, mais en appelant git via un shell:

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

Je ne l'ai pas encore testé, mais si vous pouviez passer un argument, ce serait la meilleure façon de le faire. 

Une solution similaire consisterait à utiliser une fonction Shell :

[alias]
        rb = "!f() { git rebase -i HEAD~$1; }; f"
89
VonC

Réinitialiser tous les commits depuis le branchement

Si vous voulez simplement redéfinir tous les commits qui sont nouveaux dans votre branche, depuis le moment où vous avez créé une branche depuis la branche parente, il serait plus facile d'avoir simplement l'alias suivant dans votre configuration:

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

Ensuite, si vous souhaitez modifier toutes les commits que vous avez ajoutés à votre branche actuelle, vous pouvez simplement exécuter:

git rbi parentBranch

Cette approche utilise un argument, mais au lieu de devoir savoir combien de commits doivent être retournés, vous fournissez simplement le nom de la branche, et elle détermine la dernière validation partagée entre la branche actuelle et la branche parente via git merge-base.

Pourquoi cela plutôt que git rebase -i parentBranch

La raison pour laquelle vous feriez ceci plutôt qu'un git rebase -i parentBranch direct est que vous pourriez ne pas vouloir gérer les conflits de fusion jusqu'à un point ultérieur, ou même traiter un conflit de fusion dans un commit, puis le même conflit sur la même ligne dans un autre commit. Voir https://stackoverflow.com/a/31036645/444610

4
seth flowers

@Droogans a souligné dans un commentaire sur la réponse acceptée que, du moins sur macOS (j'imagine que la même chose vaut pour tout système d'exploitation de type Unix, et peut-être même Windows), vous pouvez simplement utiliser $1 comme valeur de marque représentant l'argument dans l'alias. Donc, pour créer un alias afin que git rb 8 devienne git rebase -i HEAD~8:

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

Vous pouvez également l'utiliser plusieurs fois dans un alias. Ainsi, si, par exemple, vous vouliez un alias qui traduirait git f my-branch en git fetch Origin my-branch:my-branch, vous pouvez procéder comme suit:

    f = "!git fetch Origin $1:$1"
1
Andrew Patton

J'ai écrit cette fonction "grb" pour faire la rebase interactive de Git sur un Mac, donc je peux dire grb 5 pour afficher mes 5 derniers commits:

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

La réponse principale sur cette page ne fonctionne pas pour moi . Pour voir mon .bash_profile et tous les autres alias Git que j'utilise sur mon Mac:

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

0
Raymond Gan