Git, Как сбросить origin / master для коммита?


245

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

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

Так как я также хочу сбросить origin / header, я извлекаю их в origin / master:

$ 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.

Затем я попытался добавить коммит в origin / header, который мне не удался.

$ 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)

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

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

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


Прежде всего, убедитесь, что вам разрешено принудительно использовать push-код в защищенной ветви вашего проекта, иначе вы не сможете ...
DarmVillegas

Ответы:


564

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

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

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

9
это делает запрошенную операцию, но имейте в виду, что это сделает несчастными тех людей, которые уже извлекли коммиты из master.
Мнагель

Я следовал за этими шагами, и это откатилось. Но origin / HEAD теперь указывает на ветку, отличную от master. Что я могу сделать, чтобы это исправить?
Даниил Шевелев

1
Вы не должны заботиться о происхождении / HEAD, просто подтолкните хорошего рефери к origin / ref
Simon Boudrias

Согласились, пришлось сделать это сегодня после того, как случайно слились не те ветки, а потом подтолкнули к началу. Это работает хорошо, но это может быть очень разрушительным, если другие люди проверяют зараженные ветки от происхождения. Используйте с осторожностью.
Ник В.

1
Не работает remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

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

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

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


1
Не работает:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 как говорится в сообщении you should pull first:)
intuitivepixel

Ответ на это находится на stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseно на самом деле я установил это вручную в своем локальном репозитории Git, /opt/gitкоторый я создал, чтобы поиграть с идеями здесь. Я не уверен, как или если можно сделать это для bitbucket, github и т. Д. И @intuitivepixel, который не имеет смысла, поскольку он полностью изменяет то, что вы пытались достичь с помощью аппаратного сброса.
HankCa

Привет @jkovacs, я не хочу, чтобы новые изменения в master были удалены. Я просто хочу передать этот хеш коммита "e3f1e37" на мастер-источник. Возможно ли пропустить 2-ю команду git reset --hard "e3f1e37"?
КаренАнн

Привет @jkovacs, я только что подтвердил, что могу пропустить 2-й шаг. :)
КаренАнн

2

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

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

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


1

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

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

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

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

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

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

git push --force origin master
git diff master..origin/master
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.