Пока что самая запутанная часть git - это переход на другую ветку. В частности, это аргументы командной строки, которые сбивают с толку.
Каждый раз, когда я хочу переместить небольшой кусок одной ветви на кончик другой, мне приходится просматривать документацию git rebase, и мне требуется около 5-10 минут, чтобы понять, каким должен быть каждый из 3 основных аргументов.
git rebase <upstream> <branch> --onto <newbase>
Какое хорошее эмпирическое правило помогает мне запомнить, какой должен быть установлен каждый из этих трех параметров, учитывая какой-либо перебаз в другую ветку?
Имейте в виду, что я перебрал документацию git-rebase снова и снова, и снова, и снова (и снова), но это всегда трудно понять (как скучный научный документ или что-то в этом роде). Поэтому на данный момент я чувствую, что мне нужно привлечь других людей, чтобы помочь мне понять это.
Моя цель состоит в том, чтобы мне никогда не приходилось просматривать документацию по этим основным параметрам. Я не смог запомнить их до сих пор, и я уже сделал тонну перебазирования. Так что немного необычно, что я до сих пор запоминал каждую другую команду и ее параметры, но не перезагружал --onto
.
Ответы:
Давайте пропустить
--onto
на данный момент.upstream
иbranch
довольно просты, и на самом деле имитируютcheckout
иbranch
- второй аргумент является необязательным:( За исключением, имена этих аргументов в
rebase
«вверх» и «ветви» не очень описательный IMO я обычно думаю о них , как peachoftree,.<start>
И<end>
, что , как я буду использовать их:git rebase <start> <end>
)Когда вторая ветвь опущена, результат почти такой же, как сначала проверить эту ветку, а затем сделать это так, как если бы вы не указали эту ветку. Исключением является то,
branch
что не меняет вашу текущую ветку:Что касается понимания того, что
rebase
происходит при вызове, я сначала начал думать об этом как об особом типе слияния. Это не совсем так, но помогло, когда впервые начал понимать ребаз. Взять пример с peachoftree:А
git merge master
результаты в этом:Хотя
git rebase master
(в то время как на веткеfeature
!) Приводит к этому:В обоих случаях
feature
теперь содержит код от обоихmaster
иfeature
. Если вы неfeature
включены, второй аргумент может быть использован для переключения на него в качестве ярлыка:git rebase master feature
будет сделано то же самое, что и выше.Теперь для спец
--onto
. Важно помнить, что по умолчанию используется значение,<start>
если оно не указано. Так что выше, если бы я указал--onto
конкретно, это привело бы к тому же:(Я не использую,
--onto
не указывая<end>
просто, потому что мысленно разобрать легче, даже если они оба одинаковые, если они уже включеныfeature
.)Чтобы понять, почему
--onto
это полезно, вот другой пример. Допустим, я был включенfeature
и заметил ошибку, которую я затем начал исправлять, ноfeature
вместо нее произошел ответвление вместоmaster
:Я хочу «переместить» эти коммиты,
bugfix
чтобы они больше не зависелиfeature
. Таким образом, любой вид слияния или перебазирования, показанный выше в этом ответе, примет триfeature
коммита вместе с двумяbugfix
коммитами.Например,
git rebase master bugfix
это неправильно. Диапазон,<start>
который<end>
случается, включает все коммитыfeature
, которые воспроизводятся поверхmaster
:То , что мы на самом деле хотим диапазон коммитов от
feature
доbugfix
быть переигран на вершинеmaster
. Вот для чего--onto
- указание цели «воспроизведения», отличной от ветви «start»:git rebase --onto master feature bugfix
источник
Просто переподготовка, перебазирование в основном для случаев, когда вы хотите, чтобы ваша история коммитов была линейной, если две ветви развивались независимо друг от друга, в основном она переписывает историю коммитов.
как мне нравится это
git rebase --onto <target branch> <start branch> <end branch>
где
<target branch>
ветка, на которую вы перебазируете,<start branch>
обычно ветвь, из которой вы делите,<end branch>
и<end branch>
ветка, на которую вы перебираете.если вы начнете с
и делать
ты получишь
еще одна полезная вещь, которую нужно знать, это то, что по
<target branch>
умолчанию<start branch>
вы можете сделать то жеесли вам нужна дополнительная помощь, проверить перебазироваться без слез руководства
источник
master
саму ветку без изменений. Вы просто получаете «особенность» , чтобы расшириться , как вG--C'--D'--E'
то времяmaster
все еще останавливаетсяG
.<target branch>
и<start branch>
разные, чтобы помочь читателям понять наиболее общий случай?