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


216

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

git checkout origin/master
git branch -D master
git branch master
git checkout master

Иногда это можно сделать, не касаясь рабочего дерева: 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 является необязательным.


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

94

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

git checkout -B master origin/master

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


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?
Джим Ахо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.