Перезапись моего локального филиала удаленным

153

Я полностью fubar'd мой местный филиал, и хотел бы начать все сначала. Версия на сервере правильная.

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

git fetch branchnameи git pull branchnameне работает. Сообщение, которое я получаю, « обновлено », однако моя локальная версия не совпадает с версией сервера.

git pull origin/branchnameвыдает ошибку " not found "

Сара Чиппс
источник

Ответы:

248

во-первых, создайте новую ветку в текущей позиции (на случай, если вам нужна старая «испорченная» история):

git branch fubar-pin

обновите список удаленных веток и синхронизируйте новые коммиты:

git fetch --all

затем сбросьте вашу ветку до точки, где источник / ветвь указывает на:

git reset --hard origin/branch

будьте осторожны , это удалит все изменения из вашего рабочего дерева !

knittl
источник
2
+1, но вы можете добавить напоминание, чтобы сделать git fetch originперед сбросом
Марк Longair
Я сделал это с одним небольшим изменением, и оно не сработало: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (некоторые другие вещи), git reset --hard origin / branch. Конечным результатом было то, что я все еще был на старом коммите. Таким образом, этот подход может работать в некоторых случаях, но я думаю, что он не работает во всех.
greggles
@greggles: есть ошибки? После последней команды HEAD должен указывать на источник / ветвь.
knittl
1
@Gavin: нет, это ни при каких условиях не повлияет на другие отрасли, кроме origin/branch. Никогда.
knittl
1
@greggles Я знаю, что это очень поздно, но для других людей, задающихся вопросом, почему это может произойти, этот подход будет работать, только если у вас есть проверенная ветка. Это не сработало для вас, потому что вы находились в отключенном состоянии HEAD (HEAD указывает на коммит, а не на ветвь), и эти команды работают, только если HEAD указывает на ветвь. Когда вы делаете, git resetкогда HEAD указывает на ветку, эта ветка будет следовать.
Майкл Дорст
60

Что я делаю, когда путаюсь с локальной веткой, я просто переименовываю сломанную ветку и снова проверяю / разветвляю ветку upstream:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Тогда, если вы уверены, что ничего не хотите от своей старой ветки, удалите это:

git branch -D branch-old

Но обычно я оставляю старую ветку на месте, на случай, если у меня там что-то есть.

Кейси Маршалл
источник
4
Это кажется лучшим ответом. Это помогает создать резервную копию на всякий случай и, скорее всего, приведет к тому, что локальная ветвь будет точной копией удаленной.
Greggles
Отличный ответ, полезный для меня. Один вопрос: Официальная документация по git-checkout, кажется, говорит, что ваша третья команда должна быть: git checkout -b <branch> --track <remote>/<branch>Ваша команда работает одинаково хорошо, без --track?
Starman
1
Я думаю, что config Var branch.autoSetupMerge(который я думаю, по умолчанию true) делает --trackнеявным. И да, во всех моих настройках git мне не нужно явно --trackделать это checkout -b, кроме YMMV.
Кейси Маршалл
5

В вашем местном отделении, вероятно, есть изменения, от которых вы хотите отказаться. Чтобы сделать это, вам нужно будет использовать git resetдля сброса заголовка ветки до последней точки, которую вы отклонили от ветки вышестоящего репо. Используйте, git branch -vчтобы найти идентификатор sha1 ветки upstream и сбросить его, используя его git reset SHA1ID. После этого вы сможете git checkoutотменить изменения, оставленные в вашем каталоге.

Примечание: всегда делайте это на резервном хранилище. Таким образом, вы можете быть уверены, что вы работаете правильно. Или, если это не так, у вас есть резервная копия, к которой можно вернуться.

Уэс Хардакер
источник
Такое ощущение, что это, вероятно, сработает, но, учитывая простоту и надежность подхода «сделай копию своей работы в другом месте, сделай новую копию удаленной ветви», я не вижу, как это лучше.
greggles
2
git reset --hard

Это чтобы отменить все ваши локальные изменения в исходной голове

Картикеян Варадараджан
источник