Передайте аргумент команде псевдонима Git

Могу ли я передать аргументы псевдониму команды Git?

У меня есть псевдоним в конфиге Git, например:

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

Можно ли сделать rb так что git rb <x> работает для любого <x>?

Я попробовал этот псевдоним:

rb = rebase -i HEAD~

но тогда, например, git rb 8 не работает.

3 ответа

Решение

Если вы рассматриваете раздел Git Faq "Git Aliases with аргумент", вы можете сделать это, но вызывая git через оболочку:

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

Я еще не проверял это, но если вы можете передать аргумент, это был бы способ сделать это.

Аналогичное решение будет использовать функцию оболочки:

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

Перебазирование всех коммитов с момента ветвления

Если вы просто хотите перебазировать все коммиты, которые являются новыми в вашей ветке, со времени, когда вы разветвлялись от родительской ветки, было бы проще просто иметь следующий псевдоним в вашей конфигурации:

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

Затем, если вы хотите перебазировать все коммиты, которые вы добавили в вашу текущую ветку, вы можете просто запустить:

git rbi parentBranch

В этом подходе используется аргумент, но вместо того, чтобы знать, сколько коммитов нужно вернуть, вы просто указываете имя ветви, и он вычисляет самый последний коммит, общий для текущей ветви и родительской ветви, через git merge-base

Почему это, а не git rebase -i parentBranch

Причина, по которой вы бы это сделали, а не прямая git rebase -i parentBranch в том, что вы можете не захотеть иметь дело с конфликтами слияния до более поздней точки или даже иметь дело с конфликтом слияния в одном коммите, а затем с тем же конфликтом на той же строке в другом коммите. См. /questions/8355960/kak-mne-ispolzovat-git-rebase-i-chtobyi-otmenit-vse-izmeneniya-v-vetke/8355973#8355973

Я написал эту функцию "grb", чтобы сделать Git интерактивной перебазировки на Mac, так что я могу сказать, grb 5 чтобы показать мои последние 5 коммитов:

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

Верхний ответ на этой странице не работает для меня. Чтобы увидеть мой .bash_profile и все другие псевдонимы Git, которые я использую на своем Mac:

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

@Droogans указал в комментарии на принятый ответ, что, по крайней мере, на macOS (я думаю, то же самое будет справедливо для любой Unix-подобной ОС, и, возможно, даже для Windows), вы можете просто использовать $1 в качестве значения заполнителя, представляющего аргумент в псевдониме. Итак, настроить псевдоним так, чтобы git rb 8 становится git rebase -i HEAD~8:

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

Вы также можете использовать его несколько раз в псевдониме, поэтому, если, например, вы хотели псевдоним, который будет переводить git f my-branch в git fetch origin my-branch:my-branch, ты можешь сделать:

    f = "!git fetch origin $1:$1"
Другие вопросы по тегам