Я пытался решить проблему, из-за которой не мог тянуть или толкать. Казалось, проблема была в одном файле. Я запустил git push -f origin master
, и теперь большинство файлов в удаленном репозитории (Bitbucket) исчезли. Как мне вернуть их с этой историей коммитов? Я попробовал git revert HEAD~1
, и это не сработало (изменил 1 файл, но не восстановил). Я запустил git log
и вижу там все свои коммиты, поэтому я думаю, что git все еще знает о них в каком-то смысле - я очень не понимаю git.
Как вернуть удаленные файлы после принудительной отправки
- git — это система управления версиями: каждый коммит по-прежнему существует, но. Когда вы толкаете силой, вы берете на себя полную ответственность и подотчетность за то, что произойдет дальше. Определите коммит, который вам нравится, и попробуйте
git checkout <sha of that commit>
04.08.2020 - @DaemonPainter
Identify a commit you like
как? Черезgit log
? 04.08.2020 - да, гит лог, или через битбакет проверяй график или список коммитов 04.08.2020
- Не могли бы вы показать пример вывода вашего журнала git? 04.08.2020
- @DaemonPainter, что мне делать после запуска
checkout
? 04.08.2020 - чтобы попытаться дать хороший отзыв, мне нужна информация. Что ты делал? Почему ты не смог толкнуть? Почему ты не смог подтянуться? Есть ли еще одна копия этого репо, которая не получила обновлений, которые вы принудительно отправили? Если это так, рассмотрите возможность принудительного нажатия на это снова :) Не забудьте как-то сделать резервную копию ваших правок. 04.08.2020
- @DaemonPainter tbh git сбивает меня с толку, и чтение документации, похоже, не помогает. Когда я вхожу в Bitbucket (через веб-интерфейс) в основной ветке репозитория, в котором я работал, 90% файлов исчезли. Они все еще у меня есть локально, но причина, по которой я использую Git, заключается в том, что я могу видеть старые версии и сообщение коммита. Я отталкивался от одного и того же удаленного репо из двух разных локальных папок с разным содержимым, и теперь я понимаю, что это не то, как Git предназначен для использования. Короче говоря, теперь, когда я не вижу файлы на bitbucket.org, как мне их вернуть? 04.08.2020
- Я знаю, что это может сбивать с толку, особенно когда вы запускаете команды, не зная, каков будет результат. Без паники :) на вашем компьютере, что вы делали на своем компьютере, когда решили сделать принудительный толчок? Где вы сливаетесь? Перебазирование? Какие именно команды вы выполняли. 04.08.2020
- stackoverflow.com/search?q=%5Bgit%5D+undo+force+push 04.08.2020
- @DaemonPainter Я хотел добавить новый файл, который я создал, в удаленное хранилище. Как-то это застрял, так что я не мог толкать или тянуть, поэтому я подумал, что опция принудительного нажатия будет полезна. Я не думаю, что я сливался. git также дает
(master|REBASE 2/3)
, и я понятия не имею, что это значит. 04.08.2020 - означает, что вы были в середине перебазирования, чтобы выйти из него, либо завершите его, либо
git rebase --abort
. Он дает это сейчас, после принудительного нажатия? За это время вы запускали что-то кромеgit log
/git status
? 04.08.2020 - @DaemonPainter да,
$ git revert HEAD~1
иgit reset --hard 8b68175
иgit checkout <hash>
04.08.2020
Ответы:
Когда вы принудительно отправляете локальную ветвь master
в источник, вы в основном заставляете удаленную ветвь быть такой же, как ваша локальная ветвь.
Если файлы отсутствуют в Bitbucket, это означает, что они отсутствуют и в вашей локальной ветке. Итак, сначала исправьте проблему в вашей локальной основной ветке, а затем снова принудительно нажмите ее.
Запуск git log
покажет вам только те коммиты, которые являются частью вашей ветки. Если отсутствуют некоторые файлы, вы можете не увидеть эти коммиты.
Запуск git reflog
даст вам полную историю, включая переключение между ветвями, слияния и перебазирования.
Используйте reflog, чтобы определить вашу «последнюю известную удачную» фиксацию. Как только вы его найдете - пометьте его (просто так будет легче найти) и создайте ветку.
Затем вы можете сравнить эту ветку с веткой master
и убедиться, что это именно та фиксация, которую вы ищете.
Обновить
Как только вы получите хэш коммита, сбросьте на него основную ветку и принудительно нажмите:
git reset --hard <hash>
git push --force origin master
log
по сравнению сreflog
? Например,commit 5e34ec6922d6021b5a4d9b02355086bd02434c18 (HEAD -> master, origin/master)
против5e23ec6 (HEAD -> master, origin/master) HEAD@{0}: rebase: updating HEAD
04.08.2020