Как мне сбросить «мастер» на «источник / мастер»?

216

Могу ли я сделать следующее проще?

git checkout origin/master
git branch -D master
git branch master
git checkout master
Xiè Jìléi
источник
Иногда это можно сделать, не касаясь рабочего дерева: stackoverflow.com/a/12343727/586086
Эндрю Мао
6
Пожалуйста, обновите ваш принятый ответ: @ Ответ KindDragon корректнее и короче.
Роберт Симер

Ответы:

310

Как KindDragon «s ответ упоминает, вы можете воссоздать masterнепосредственно origin/masterс:

git checkout -B master origin/master

git checkoutСтраница людей упоминает:

Если -Bзадано, <new_branch>создается, если его не существует; в противном случае он сбрасывается . Это транзакционный эквивалент

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Первоначально предложено:

Что-то вроде:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

с шагом 2 является необязательным.

VonC
источник
1
Вы можете сделать это одной строкой.
Роберт Симер
94

Git поддерживает эту команду:

git checkout -B master origin/master

Проверьте origin/masterветку и затем сбросьте masterветку там.

KindDragon
источник
4
Единственный верный ответ.
Роберт Симер
3
сохранить четыре нажатия клавиш - вам не нужны кавычки. Просто: git checkout -B мастер происхождения / мастер
zumalifeguard
скажем, я совершил 2 вещи, первая - это слияние с веткой, а вторая - регулярная. Что произойдет с слиянием, если я вернусь к источнику / мастеру?
Утдев
1
не нужно ли git fetch origin masterраньше, чтобы быть уверенным origin/masterв обновлении?
Педрозат
Да, конечно, со всеми решениями, которые вы должны сделать в git fetchпервую очередь
KindDragon
29

Я думаю, что даже ответ VonC имеет сложность по сравнению с этим вариантом:

git update-ref refs/heads/master origin/master
git reset --hard master

git автоматически регистрирует каждое значение ref (через reflog). Таким образом, после того, как вы запустите эту команду, тогда master@{1}будет указано предыдущее значение master.

Ответ VonC правильный, но он тратит время на извлечение старого значения master в файловой системе.

Если вам небезразличны осиротевшие объекты в репо, то вы можете запустить git gc

Александр Берд
источник
1
Звучит интересная альтернатива. +1
VonC
Я все еще получаюAlready on 'master'
yourfriendzak
@yourfriendzak, я забыл о том, что вы, возможно, уже проверили мастер до его обновления. Я обновил ответ, чтобы он мог работать даже в этом случае.
Александр Берд
Это работает, даже если вы не находитесь на ведущем устройстве (например, в состоянии отсоединенного HEAD, которое фактически указывает на источник / основание наконечника). Затем вы можете оформить заказ мастера, не переворачивая старые файлы через репозиторий. Большой!
Андрей Мао
20

Если вы уже включены, masterвы можете сделать следующее:

git reset --hard origin/master

Он укажет локальную masterветку на удаленный origin/masterи откажется от любых изменений в рабочем каталоге.

Фуад сауд
источник
И удалит файлы! Если вы создали / отредактировали файлы и запустили «git add», эта команда удалит их. Имейте в виду.
Cheeso
Этот подход лучше чем git checkout -B master origin/master?
Джим Ахо