Git, как сбросить источник/мастер до фиксации?

Я сбрасываю свой локальный мастер на фиксацию с помощью этой команды:

git reset --hard e3f1e37

когда я ввожу команду $ git status, терминал говорит:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Поскольку я также хочу сбросить источник/заголовок, я оформляю заказ на источник/мастер:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

и сбросьте заголовок этой командой:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Затем я попытался добавить фиксацию в источник/заголовок, но мне это не удалось.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Наконец, я оформляю заказ у своего местного мастера.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

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

Как я могу решить эту проблему? Вещи, которые я ищу, это Head of local/master и origin/master указывают на один и тот же коммит. Следующее изображение показывает, что я сделал. Спасибо.

введите здесь описание изображения


person Hesam    schedule 16.07.2013    source источник
comment
Прежде всего, убедитесь, что вам разрешено принудительно отправлять код в защищенную ветку вашего проекта, иначе вы не сможете...   -  person DarmVillegas    schedule 27.12.2018


Ответы (4)


origin/xxx ветки всегда указывают на удаленный. Вы не можете проверить их, поскольку они не являются указателем на ваш локальный репозиторий (вы только проверяете фиксацию. Вот почему вы не увидите имя, написанное в маркере ветки интерфейса командной строки, только хэш фиксации).

Что вам нужно сделать, чтобы обновить удаленный компьютер, так это принудительно отправить ваши локальные изменения в мастер:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master
person Simon Boudrias    schedule 16.07.2013
comment
который выполняет запрошенную операцию, но имейте в виду, что это сделает несчастными тех людей, которые уже вытащили коммиты из мастера. - person mnagel; 16.07.2013
comment
Я выполнил эти шаги, и он откатился. Но источник/HEAD теперь указывает на ветку, отличную от master. Что я могу сделать, чтобы исправить это? - person Daniil Shevelev; 21.12.2013
comment
Вы не должны заботиться о происхождении/HEAD, просто нажмите хорошую ссылку на источник/ссылку - person Simon Boudrias; 21.12.2013
comment
Согласен, пришлось сделать это сегодня после случайного объединения неправильных веток, а затем нажать на источник. Это работает хорошо, но может быть очень разрушительным, если другие люди проверяли затронутые ветки из источника. Используйте с осторожностью. - person Nick W.; 09.05.2014
comment
Не работает. remote: error: denying non-fast-forward refs/heads/master (you should pull first) - person m0skit0; 16.01.2015
comment
@ m0skit0 Это работает. Это ваш сервер git творит магию с помощью git-хуков. Это означает, что вы не сможете сбросить настройки origin/master. Единственный вариант — отменить изменения в новом коммите. - person Simon Boudrias; 17.01.2015
comment
Эм... Нет, это не работает. Я не могу отменить все изменения, потому что тогда он говорит, что произошло слияние. И если я использую -m, я получаю сообщение. git push origin :master, вернувшись к коммиту, который я хочу, чтобы происхождение имело, и нажав его, все же сработало. - person m0skit0; 17.01.2015
comment
@ m0skit0 возврат в словах git означает создание новой фиксации поверх ветки, возвращающей шансы, представленные в более старой фиксации. Так что это не меняет историю ветки. Вы также можете просто попросить человека, ответственного за ваш сервер git, повторно разрешить коммиты без быстрой перемотки вперед. - person Simon Boudrias; 19.01.2015
comment
Да, я знаю. В этом случае я не возражаю против потери истории, потому что все коммиты на самом деле являются слиянием из другой ветки. Я отвечаю за сервер git и не хочу разрешать коммиты без быстрой перемотки вперед. - person m0skit0; 19.01.2015
comment
После этого у меня есть два помеченных коммита перед тем, где я сбрасываю мастер, который не исчез. Как удалить эти записи? - person BadHorsie; 22.10.2015
comment
На моей машине это, кажется, сдувает фактические предыдущие нажатия, которые вы отменяли. Например, после принудительного нажатия всех будущих записей в журнале git больше нет, поэтому я не вижу возможности восстановить отмененные изменения кода. - person entpnerd; 16.08.2016
comment
@entpnerd проверьте git reflog, чтобы найти удаленные вами коммиты. - person Simon Boudrias; 16.08.2016
comment
@SimonBoudrias, когда я выполняю git reflog, я вижу только коммиты до точки сброса в дополнение к сбросу и переустановкам, которые были выполнены командой git reset. Кроме того, когда я проверяю SourceTree, я не вижу идентификатор фиксации отправок в источник, которые произошли после точки сброса. Как будто их и не было. При этом ваше решение правильно сбрасывает источник. С моей точки зрения, я просто не сохраняю сброшенные коммиты, но это сработало. :-) - person entpnerd; 16.08.2016
comment
ПРИМЕЧАНИЕ: вы теряете свои локальные коммиты - person Sean Malter; 30.07.2019
comment
Коммиты @SeanMalter никогда не теряются. Хотя может быть, что они уже не в иерархии предков. - person Max MacLeod; 09.03.2020

Решение, найденное здесь, помогло нам обновить master до предыдущий коммит, который уже был отправлен:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Ключевым отличием от принятого ответа является хэш фиксации «e3f1e37:» перед мастером в команде push.

person jkovacs    schedule 19.08.2014
comment
Не работает: remote: error: denying non-fast-forward refs/heads/master (you should pull first) - person m0skit0; 16.01.2015
comment
@ m0skit0, как говорится в сообщении, you should pull first :) - person intuitivepixel; 16.03.2015
comment
Ответ на этот вопрос находится на stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards false но на самом деле я установил это вручную в своем локальном репозиторий git, который у меня есть в /opt/git, который я создал, чтобы поиграть с идеями здесь. Я не уверен, как и можно ли это сделать для битбакета, github и т. д. И @intuitivepixel это бессмысленно, поскольку оно полностью меняет то, что вы пытались достичь с помощью жесткого сброса. - person HankCa; 18.07.2015
comment
Привет @jkovacs, я не хочу, чтобы новые изменения в мастере удалялись. Я просто хочу отправить этот хэш коммита e3f1e37 в исходный мастер. Возможно ли, пропустив 2-ю команду git reset --hard e3f1e37? - person KarenAnne; 17.08.2015
comment
Привет @jkovacs, я только что подтвердил, что могу пропустить 2-й шаг. :) - person KarenAnne; 17.08.2015

Предполагая, что ваша ветка называется master как здесь, так и удаленно, а ваш удаленный называется origin, вы можете сделать:

git reset --hard <commit-hash>
git push -f origin master

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

person Mahmoud Zaher    schedule 26.08.2019

Поскольку у меня была похожая ситуация, я подумал, что поделюсь своей ситуацией и тем, как эти ответы мне помогли (всем спасибо).

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

Однажды поздней ночью, в параноидальном страхе потерять свой прогресс из-за аппаратного сбоя или чего-то еще, я решил отправить master в источник. Позже я продолжал исправлять свою локальную основную ветку, и когда я решил, что пришло время снова нажать, я столкнулся с другими основными ветками и обнаружил, что не могу изменить источник/восходящий поток (да!), как я могу местные отделения развития.

Поэтому я не проверял мастер локально, потому что я уже был после коммита. Мастер не изменился. Мне даже не нужно было сбрасывать --hard, моя текущая фиксация была в порядке.

Я просто принудительно отправил в источник, даже не указав, какую фиксацию я хотел принудительно выполнить на мастере, поскольку в этом случае это то, на чем находится HEAD. Проверил git diff master..origin/master отличий не было и все. Все исправлено. Спасибо! (Я знаю, я новичок в git, пожалуйста, простите!).

Итак, если вы уже в порядке с вашей основной веткой локально, просто:

git push --force origin master
git diff master..origin/master
person Paul-Sebastian Manole    schedule 23.09.2018