Как заставить Git pull использовать rebase по умолчанию для всех моих репозиториев?

186

Есть ли способ настроить Git-репозиторий хоста таким образом, чтобы все, что git pullсделано из его (локальных) клонов, использовали --rebaseпо умолчанию? Поиск по переполнению стека позволил мне узнать branch.autosetuprebase, но его нужно настраивать для каждого клона индивидуально.

Мой проектный поток настроен так, что мы pullвыполняем developветвление перед тем, mergeкак добавить к нему ветку. Это pullпочти всегда используется --rebase, поэтому я пытаюсь выяснить, может ли это быть по умолчанию.

Человек в маске
источник
6
Зачем тебе это? Я думаю, что более разумно учить пользователей активно думать о том, какой случай будет более уместным (исходя из величины изменений, которые они внесли или ожидают от восходящего потока) »
Jonas Schäfer
4
@JonasWielicki Да, я согласен. Просто некоторые члены моей команды являются новичками в Git, и я хотел бы знать, есть ли способ применить его, чтобы избежать проблем на начальном этапе (пока они его не изучат). Команда также работает удаленно в другом часовом поясе, что означает, что они застрянут на несколько часов, если что-то пойдет не так. Просто любопытно узнать, возможно ли это.
Человек в маске
1
Я думаю, что особенно для начальных установок, лучше пойти на слияние. Rebase делает гораздо более странные вещи, если ваш код действительно расходится. Вы должны разрешать одни и те же конфликты снова и снова, пока не нажмете. Поэтому, если член команды хочет работать над некоторым кодом, всегда использует rebase и не продвигается до тех пор, пока он не завершит (что могут делать новички, вместо того, чтобы разветвляться), они столкнутся с теми же конфликтами, которые они уже решили X раз. ,
Йонас Шефер
3
@JonasWielicki Члены команды делают создать новую ветку для каждой новой функции они работают (и это, они уже поняли , очень хорошо). Необходимость в перебазировании возникает потому, что другие разработчики взялись за «удаленную» ветку разработки к тому времени, когда он будет готов внести свои изменения. Следовательно, я хотел бы, чтобы он сделал подтягивание с пульта, прежде чем публиковать свои изменения. Сам проект достаточно зрелый, только команда новая. :) Так что это «начальная настройка» только с точки зрения людей. Что бы вы посоветовали для этого сценария?
Человек в маске
5
Отвечая на ваш первый комментарий, в большинстве случаев (почти во всех) ребаз является правильным выбором, поскольку для тщательного тестирования новой функции и т. Д. Требуется много времени. К тому времени, когда это будет сделано, наверняка будет множество коммитов от других разработчиков.
Человек в маске

Ответы:

205

В настоящее время есть 3 различных уровня конфигурации для поведения по умолчанию. От самых общих до самых мелкозернистых:

1. pull.rebase

Установка этого значения trueозначает, что git pullэто всегда эквивалентно git pull --rebase(если branch.<branchname>.rebaseявно не установлено значение false). Это также может быть установлено для репозитория или глобально.

2. branch.autosetuprebase

Установка этого значения alwaysозначает, что при создании ветви отслеживания для нее будет создаваться запись конфигурации, подобная приведенной ниже. Для более точного контроля это также может быть установлено never, localили remoteи может быть установлено для репозитория или глобально. Смотрите git config --helpдля более подробной информации.

3. branch.<branchname>.rebase

Установка этого значения trueозначает, что эта конкретная ветвь будет всегда вытягиваться из своего восходящего потока посредством перебазирования, если git pull --no-rebaseне используется явно.

Вывод

Таким образом, хотя вы не можете изменить поведение по умолчанию для всех будущих клонов хранилища, вы можете изменить значение по умолчанию для всех хранилищ текущего пользователя (существующего и будущего) через git config --global pull.rebase true.

Паркер Коутс
источник
4
Спасибо за ваш ответ. Я изучал, мог ли бы я иметь параметр, чтобы каждый, кто клонировал репозиторий, включал его по умолчанию. Вышеуказанная настройка будет сохранена в ~/.gitconfig, что означает, что каждый разработчик, который клонирует репозиторий хоста, должен будет запустить команду. Не жалуюсь на ваше решение. Это хорошо, я просто хочу подтвердить, что я правильно понял вашу точку зрения.
Человек в маске
Спасибо за ответ. Это действительно выглядит так, как будто это так близко, как только можно.
Человек в маске
139

Как насчет

git config --global pull.rebase true

Это скажет git всегда тянуть с rebase.

mackuntu
источник
3
Спасибо, это прекрасно работает для существующих веток отслеживания.
Fls'Zen
1
Пожалуйста, удалите --bool, это не нужно
diralik
38

Ответ - нет.

Невозможно настроить удаленный репозиторий, чтобы у всех, кто его клонировал, поведение по умолчанию git pullизменялось.

Вы можете, однако, установить серверную ловушку, которая проверяет, что никто не нажимает коммиты слияния (возможно, что-то вроде этого ).

Есть также некоторые параметры конфигурации, которые могут вас заинтересовать. Все разработчики, которые клонируют из удаленного репозитория, должны будут установить его самостоятельно.

1. Вариант branch.<name>.rebase

Вы можете настроить локальную ветку так, чтобы она всегда использовалась --rebase, заменяя <name>ее именем на ветку:

git config branch.<name>.rebase true

После запуска этого на master, в masterразделе .git/configвыглядит следующим образом :

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Вариант branch.autosetuprebase

Выполнение этой предыдущей команды config для каждой ветви Git может быть проблематичным, поэтому вы можете настроить Git для автоматической настройки ее для каждой новой ветви:

git config branch.autosetuprebase always

(Вы также можете указать never, remoteи local, смотрите man git-configдетали.)

Без этой --globalопции конфигурация сохраняется .git/configи затрагивается только текущий репозиторий. При --globalэтом конфигурация сохраняется в ~/.gitconfig, и это затрагивает каждый ненастроенный репозиторий.

Эта опция не влияет на уже существующие ветки.

3. Вариант pull.rebase

git config --bool pull.rebase true

(Вы также можете дать ему --globalвозможность.)

Если этот параметр имеет значение true, выполнение git pullэквивалентно git pull --rebase, если branch.<name>.rebaseне было установлено значение false.

Флимм
источник
3

Это делает --rebaseопцию по умолчанию при выдаче git pull в данной ветви.

@Flimm, мне нужно было добавить, trueчтобы ваш первый вариант работал.

Итак, правильный синтаксис:

git config branch.<branch>.rebase true

Чтобы запустить эту команду в developветке:

git config branch.develop.rebase true

И теперь developраздел .git/configвыглядит так:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Дайси
источник
Спасибо, я отредактировал свой ответ, в будущем не стесняйтесь редактировать ответ самостоятельно.
Flimm
2
Donwvoter, кто бы вы ни были, пожалуйста, объясните свои причины. Понижение рейтинга без комментариев мне кажется совершенно произвольным и неконструктивным.
Daishi
1

В настоящее время нет способа установить политику по умолчанию для хранилища.

Если вы хотите это для себя и используете хотя бы git 1.7.9, вы можете глобально настроить pull.rebaseконфигурацию следующим образом:

git config --global pull.rebase true

Но вам придется делать на каждой машине. Одним из вариантов может быть настройка стандартного шаблона / скелета пользователя по умолчанию с этим параметром. Однако пользователи могут изменить эту опцию.

Если вы не хотите слияния, вы можете определить ловушку на стороне сервера, чтобы отклонять толчки с слияниями.

Для справки: его исходная документация для pull.rebase:

Если задано значение true, перебазировать ветви поверх выбранной ветви вместо объединения ветви по умолчанию с удаленного по умолчанию при запуске «git pull». Смотрите "branch..rebase" для установки этого для каждой ветви.

При слиянии передайте параметр --rebase-merges для git rebase, чтобы локальные коммиты слияния были включены в rebase (подробности см. В git-rebase ).

При сохранении также передайте --preserve-merges вместе с git rebase, чтобы локально зафиксированные коммиты слияния не сгладили при запуске git pull.

Когда значение является интерактивным, перебазирование выполняется в интерактивном режиме.

ПРИМЕЧАНИЕ: это возможно опасная операция; не используйте его, если вы не понимаете его последствий (подробности см. в git-rebase ).

Дэвид
источник