Передайте аргумент команде Git alias

Могу ли я передать аргументы в псевдоним команды 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 не работает.

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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, состоит в том, что вам может не понадобиться бороться с конфликтами слияния до более поздней точки или даже иметь дело с конфликтом слияния в одном коммите, а затем тот же конфликт в одной строке в другой фиксации. См. fooobar.com/questions/4096/...

Ответ 3

@Droogans указал в комментарии на принятый ответ, что, по крайней мере в macOS (я думаю, то же самое будет справедливо для любой Unix-подобной ОС, и, возможно, даже для окон), вы можете просто использовать $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"

Ответ 4

Я написал эту функцию "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#L146