Options
- <object>
-
Объект,с которым нужно обращаться как с главой недоступного следа.
Если объекты не указаны, по умолчанию использует индексный файл, все ссылки SHA-1 в пространстве имен и все рефлоги (если не указан —no-reflogs) в качестве заголовков.
- —unreachable
-
Распечатайте объекты, которые существуют, но недоступны ни для одного из ссылочных узлов.
- —dangling
-
Печатать объекты, которые существуют, но никогда не используются (по умолчанию). можно использовать для исключения этой информации из вывода.
- —root
-
Сообщить о корневых узлах.
- —tags
-
Тэги отчетов.
- —cache
-
Рассмотрим любой объект,записанный в индексе,также как головной узел для недостижимой трассы.
- —no-reflogs
-
Не считайте коммиты, на которые ссылается только запись в журнале ссылок, достижимыми. Эта опция предназначена только для поиска коммитов, которые раньше были в справочнике, но теперь нет, но все еще находятся в соответствующем рефлоге.
- —full
-
Проверяйте не только объекты в GIT_OBJECT_DIRECTORY ($GIT_DIR/объекты),но и объекты из альтернативных пулов объектов,перечисленных в GIT_ALTERNATE_OBJECT_DIRECTORIES или $GIT_DIR/объекты/инфо/альтернативы,а также упакованные Git-архивы,находящиеся в $GIT_DIR/объектах/пакетах и соответствующих подкаталогах пакетов в альтернативных объектных пулах.Теперь это значение установлено по умолчанию;вы можете отключить его с помощью —no-full.
- —connectivity-only
-
Проверяйте только связность достижимых объектов,убедившись,что все объекты,на которые ссылается тег,коммит или дерево,присутствуют.Это ускоряет операцию,полностью избегая чтения блоков (хотя все же проверяет наличие блоков,на которые есть ссылки).Это позволит обнаружить повреждения в коммитах и деревьях,но не делать никаких семантических проверок (например,на наличие ошибок форматирования).Повреждения в объектах блобов не будут обнаружены вообще.
Недостижимые теги, коммиты и деревья также будут доступны для поиска подсказок висящих сегментов истории. Используйте , если вас не волнует этот вывод и вы хотите его еще больше ускорить.
- —strict
-
Включить более строгую проверку,а именно перехват файлового режима,записанного с набором битов g+w,который был создан старыми версиями Git’а.Существующие репозитории,включая ядро Linux,сам Git и разрежённый репозиторий,имеют старые объекты,которые запускают эту проверку,но рекомендуется проверять новые проекты с помощью этого флага.
- —verbose
-
Будь болтлив.
- —lost-found
-
Запишите висячие объекты в .git/lost-found/commit/или .git/lost-found/other/,в зависимости от типа.Если объект является блобом,то в файл записывается его содержимое,а не имя объекта.
- —name-objects
-
При отображении имен доступных объектов в дополнение к SHA-1 также отображается имя, описывающее, как они достижимы, совместимые с git-rev-parse , например .
- —progress
-
Состояние прогресса сообщается в стандартном потоке ошибок по умолчанию,когда он подключен к терминалу,если только не указано —no-progress или —verbose.—progress принуждает к отображению состояния прогресса,даже если стандартный поток ошибок не направлен на терминал.
How to undo all uncommitted changes
So you have not yet committed and you want to undo everything.
Well, best
practice is for you to stash the changes in case you were mistaken
and later decide that you really wanted them after
all. . You can revisit those stashes
later and decide whether
to them after some time has
past. Please note that untracked and ignored files are not stashed by
default. See «—include-untracked» and «—all» for stash options to
handle those two cases.
However, perhaps you are confident (or arrogant) enough to know for
sure that you will never ever want the uncommitted changes. If so,
you can run , however
please be quite aware that this is almost certainly a completely
unrecoverable operation. Any changes which are removed here cannot be
restored later. This will not delete untracked or ignored files.
Those can be deleted with respectively,
or for both at once. Well,
actually those command do not delete the files. They show what files
will be deleted. Replace the «n» in «-nd…» with «f» to actually
delete the
files. Best
practice is to ensure you are not deleting what you should not by
looking at the moribund filenames first.
I have lost some commits I know I made
First make sure that it was not on a different branch.
Try where «foo» is
replaced with something unique in the commits you made. You can also
search with to see
if anything looks likely.
Check your stashes, , to
see if you might have stashed instead of committing. You can also
visualize what the stashes might be associated with via:
Next, you should probably look in other repositories you have lying
around including ones on other hosts and in testing environments, and
in your backups.
Once you are fully convinced that it is well and truly lost, you
can start looking elsewhere in git. Specifically, you should first
look at the reflog which contains the history of what happened to the
tip of your branches for the past two weeks or so. You can of course
say or to view it, but it may be best visualized with:
Next you can look in git’s lost and found. Dangling commits get
generated for many good reasons including resets and rebases. Still
those activities might have mislaid the commits you were interested
in. These might be best visualized with
The last place you can look is in dangling blobs. These are files
which have been ed but not attached
to a commit for some (usually innocuous) reason. To look at the
files, one at a time, run:
Once you find the changes you are interested in, there are several
ways you can proceed. You can your current branch to the history and current state of
that SHA (probably not recommended for stashes), you
can to link the
old history to a new branch name (also not recommended for stashes),
you can (for the
non-index commit in a git-stash), you can or (for either part of a stash or non-stashes), etc.
8 ответов
Лучший ответ
Все, что вы можете сделать с файлом, вы можете сделать и с папкой.
Также обратите внимание на Поиск и восстановление удаленного файла в репозитории Git
Файлы удаляются из рабочего дерева, но еще не зафиксированы:
Если вы еще не проиндексировали () свои изменения, вы можете отменить содержимое каталога:
Если удаление уже проиндексировано, вы должны сначала сбросить его:
Когда файлы удаляются в каком-то коммите в прошлом:
Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файла нет в фиксации HEAD, эта фиксация должна была удалить его.
Затем проверьте версию перед фиксацией, используя символ каретки ():
Восстановить полное рабочее дерево из удаленной фиксации
266
Nick Volynkin
5 Янв 2020 в 03:40
Для незавершенных удалений, это так просто:
Git reset HEAD rel / путь / к / удаленному / каталогу / *
-1
justadev
12 Авг 2016 в 21:03
Если вы просто хотите восстановить удаленную папку и у вас есть другие коммиты после удаления, вы также можете просто перейти к своему проекту на github.com.
На github.com перейдите к последней фиксации, в которой есть ваша папка. Вы должны увидеть сообщение о фиксации, а справа есть кнопка с надписью «Обзор файлов». Щелкнув по нему, вы перейдете ко всем файлам с этого этапа фиксации.
Оттуда вы можете клонировать код или просто загрузить его в виде zip-архива.
stldoug
29 Сен 2020 в 22:04
Если вы не укажете конкретный файл, вы сможете извлечь все содержимое конкретной фиксации. Например: (при условии, что у хеша все ваши файлы находятся в правильном состоянии).
Причина, по которой не восстанавливает файлы, заключается в том, что git видит ваши удаления как самые последние изменения, применяя их поверх всего, что вы извлекаете.
(Я бы порекомендовал поэкспериментировать в новой ветке.)
lostphilosopher
16 Июн 2015 в 18:21
Начиная с git 2.24.0 есть экспериментальная новая команда git: git restore
3
iethree
2 Янв 2020 в 20:14
Единственное, что у меня сработало, — это проверить репо в другой папке. Предположим, что текущее репо находится в .
Я тогда сделал
Это сделает отдельный клон репо в
Теперь я могу перейти в и делать все, что захочу. Например
Теперь я могу скопировать удаленную папку с файлами обратно
И удалите временную папку
Примеры
НЕ РАБОТАЙТЕ
Другие примеры, такие как
Деструктивны не только для удаленных файлов. Любые другие изменения также будут потеряны.
По аналогии
Потеряет все коммиты после
4
gman
6 Дек 2016 в 05:17
Если вы еще не зафиксировали свои изменения, вы можете вернуть содержимое или каталог:
Если вы хотите отменить все изменения, сделайте:
5
Ivan Mushketyk
16 Июн 2015 в 18:22
Rewriting an old branch with a new branch with a new commit
If the state of a branch is contaminated beyond repair and you have
pushed that branch or otherwise do not want to rewrite the existing
history, then you can make a new commit which overwrites the original
branch with the new one and pretends this was due to a merge. The
command is a bit complicated, and will get rid of all ignored or
untracked files in your working directory, so please be sure you have
properly backed up everything.
In the following example please replace $destination with the name
of the branch whose contents you want to overwrite. $source should be
replaced with the name of the branch whose contents are good.
You actually are being provided with two methods. The first set is
more portable but generates two commits. The second knows about the
current internal files git uses to do the necessary work in one
commit. Only one command is different and a second command runs at a
different time.
or
2 ответа
Лучший ответ
Чтобы восстановить: используйте , чтобы найти SHA1, затем используйте .
suuuzi
6 Дек 2014 в 12:56
Метод в этот вопрос о том, как это сделать для одной ветки, может быть здесь недостаточно, потому что с несколько удаленных веток могут возникнуть вопросы, которые фиксируются с какими ветвями. Но если ответ окажется легким, вероятно, будет быстрее всего сделать это так:
Если продукт Stash не хранит достаточное количество журналов, то, если он действительно использует git или что-то, что реализует под капотом рефлоги git, вы можете использовать их, по крайней мере, для восстановления удаленных ссылок.
Git удаляет рефлоги для явно удаленных ветвей, включая принудительное явное удаление; теперь они исчезли из вашего поврежденного репо и из репо того, кто явно подтолкнул удаление.
Но пульты дистанционного управления, выполняющие простые выборки из вашего репо, не интерпретируют это как запрос на удаление своих веток, отслеживающих ваши ссылки — выборка без явного запроса на удаление не является явным запросом на удаление, как и push без явного запроса на удаление является. Для этого необходимо явно запросить выборку (с помощью ), чтобы удалить ветки, которых больше нет на удаленном компьютере.
Таким образом, репозитории, в которых не проводилась явная очистка, наверняка все еще будут иметь ветки удаленного отслеживания для отсутствующих, и вы можете просмотреть самые последние транзакции в их журналах. Самый простой способ автоматизировать это
Ветви в этом выводе, у которых нет рефлогов, не изменились с момента первоначальной выборки.
Теперь вы можете вернуться к своему поврежденному репо, и если есть какие-либо вопросы, какие из коммитов другие репозитории помнят для ветки самым последним, выполните
Чтобы помочь вам его найти.
, чтобы восстановить его.
Может быть, кто-то знает более простой способ сделать это с помощью Stash (или git, если на то пошло), если нет, возможно, стоит попробовать.
1
Community
23 Май 2017 в 12:22
Copyright
Copyright ⓒ 2012 Seth Robertson
This document is licensed and distributed to you through the use of
two licenses. You may pick the license you prefer.
Creative Commons Attribution-ShareAlike 3.0 Generic (CC BY-SA 3.0)
https://creativecommons.org/licenses/by-sa/3.0/
OR
GNU Free Documentation v1.3 with no Invariant, Front, or Back Cover texts.
https://www.gnu.org/licenses/fdl.html
I would appreciate changes being sent back to me, being notified if
this is used or highlighted in some special way, and links being
maintained back to the authoritative source. Thanks.
Not affiliated with Chooseco, LLC’s «Choose Your Own Adventure»ⓡ.
Good books, but a little light on the details of recovering from git
merge errors to my taste.
Извлеченная диагностика
- unreachable <тип> <объект>
-
Объект <type> <object> на самом деле не упоминается прямо или косвенно ни в одном из наблюдаемых деревьев или коммитов. Это может означать, что есть еще один корневой узел, который вы не указываете, или что дерево повреждено. Если вы не пропустили корневой узел, вы также можете удалить недоступные узлы, поскольку они не могут быть использованы.
- отсутствует <тип> <объект>
-
На объект <type> <object> имеется ссылка, но он отсутствует в базе данных.
- dangling <тип> <объект>
-
<type> объект <object> присутствует в базе данных, но никогда не используется. Висящий коммит может быть корневым узлом.
- несоответствие хэша <объект>
-
В базе данных есть объект, хэш которого не соответствует значению базы данных объектов. Это указывает на серьезную проблему целостности данных.
Доступ к GitLab по ssh
Перейдите в домашнюю директорию и сгенерируйте ключ с помощью
ssh keygen
cd
ssh-keygen -t rsa -b 2048
Ключ проще всего назвать
gitlab_com_rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Andrei/.ssh/id_rsa): gitlab_com_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in gitlab_com_rsa
Your public key has been saved in gitlab_com_rsa.pub
The key fingerprint is:
SHA256:wAhrNr63vvUrQvhP6dbekTHlk6wtP7Y+fIJWnpLyCQN Andrei@DESKTOP-OP43ER5
The key&339;s randomart image is:
+——-+
| . . |
| 2 = + . |
|E * = = |
| . + . B . |
| … =+ S |
| .. .. =. |
| .o..*=+ |
| ..=J=*+o. |
| +PP=+*= |
+———+
Создайте файл
config
touch ~/.ssh/config
vi ~/.ssh/config
Копируем содержимое ключа в буфер.
В
Windows
GitBash
cat ~/.ssh/gitlab_com_rsa.pub | clip
В
Linux
если стоит
xclip
xclip -sel clip < ~/.ssh/gitlab_com_rsa.pub
GitLab.com
Пример
Теперь можно клонировать из GitLab по SSH
mkdir test
cd test
git init
touch .gitignore
git clone git@gitlab.com:ВАШ_АККАУНТ/ИМЯ_ПРОЕКТА.git
Исправление удалений
Когда вы удалите файлы из индекса и рабочего дерева, git заметит, что файлы, которые были у вас в текущем коммите, теперь исчезли, и поэтому покажет, что эти файлы удалены.
Однако не нужно паниковать. Это просто способ Git сказать вам, что он видит эти файлы по сравнению с предыдущим коммитом. Файлы все еще существуют в репо. Фактически, если вы выполните все удаления и зафиксируете их прямо сейчас, у вас просто будет новый коммит без файлов, но ваш текущий коммит все равно будет существовать со всеми файлами в репо. Вы можете проверить это в любое время, и он восстановит эти файлы обратно в рабочий каталог.
Информация о том, как восстановить файлы из , доступна в этом ответе.
Configuration
- fsck.<msg-id>
-
Во время fsck git может обнаружить проблемы с устаревшими данными, которые не будут генерироваться текущими версиями git и которые не будут отправлены по сети, если был установлен . Эта функция предназначена для поддержки работы с устаревшими репозиториями, содержащими такие данные.
Установка будет подхвачена git-fsck , но вместо этого принимать таким набором данных receive.fsck. <msg-id> или клонировать или его, установив fetch.fsck. <msg-id> .
В остальной части документации для краткости обсуждается , Но то же самое относится и к соответствующим И . переменные.
В отличие от таких переменных , как и и переменные не будут падать обратно на конфигурации , если они не являются устанавливать. Чтобы единообразно настроить одни и те же параметры fsck в различных обстоятельствах, все три из них должны иметь одинаковые значения.
В общем, лучше перечислить существующие объекты с проблемами с помощью , вместо того, чтобы перечислять виды поломок, которые разделяются этими проблемными объектами, которые следует игнорировать, поскольку выполнение последнего позволит новым экземплярам тех же поломок остаться незамеченными.
Установка неизвестного значения приведет к fsck, но то же самое для receive.fsck. <msg-id> и вызовет только предупреждение git.
- fsck.skipList
-
Путь к списку имен объектов (т. Е. По одному несокращенному SHA-1 на строку), которые, как известно, нарушаются нефатальным образом и должны игнорироваться. В версиях Git 2.20 и более поздних версиях комментарии ( ), пустые строки и любые начальные и конечные пробелы игнорируются. Все, кроме SHA-1 на строку, будет ошибкой в более старых версиях.
Эта возможность полезна,когда созданный проект должен быть принят,несмотря на ранние коммиты,содержащие ошибки,которые можно безопасно проигнорировать,такие как недействительные адреса электронной почты коммиттера.Замечание:повреждённые объекты нельзя пропустить с помощью этой настройки.
Как и ,у этой переменной есть соответствующие и .
В отличие от таких переменных , как и и переменные не будут падать обратно на конфигурации , если они не установлены. Чтобы единообразно настроить одни и те же параметры fsck в различных обстоятельствах, все три из них должны иметь одинаковые значения.
В более старых версиях Git (до 2.20) указывалось, что список имен объектов должен быть отсортирован. Это никогда не было обязательным требованием, имена объектов могли появляться в любом порядке, но при чтении списка мы отслеживали, был ли список отсортирован для целей реализации внутреннего двоичного поиска, что могло сэкономить некоторую работу с уже отсортированным списком. Если у вас не было огромного списка, не было причин стараться изо всех сил, чтобы предварительно отсортировать список. После Git версии 2.20 вместо него используется хеш-реализация, поэтому теперь нет причин для предварительной сортировки списка.
Updating the last commit’s contents or commit message
To update the last commit’s contents, author, or commit message for
a commit which you have not pushed or otherwise published, first you
need to get the index into the correct state you wish the commit to
reflect. If you are changing the commit message only, you need do
nothing. If you are changing the file contents, typically you would
modify the working directory and use as normal.
Note if you wish to restore a file to a known good state, you can
use: .
Once the index is in the correct state, then you can
run to update the last
commit. Yes, you can use «-a» if you want to avoid
the suggested in the previous
paragraph. You can also use —author to change the author
information.
If you want to do something more sophisticated that what «—amend»
allows, please investigate the
last commit.
First step
Strongly consider taking a
of your current working directory and .git to avoid any possibility of
losing data as a result of the use or misuse of these instructions. We
promise to laugh at you if you fail to take a backup and regret it
later.
Answer the questions posed by clicking the link for that section.
A section with no links is a terminal node and you should have solved
your problem by completing the suggestions posed by that node (if not,
then report the chain of answers you made on #git or some other git
resource and explain further why the proposed answer doesn’t help).
This is not a document to read linearly.
Changing a single commit involving only simple commits
You must first identify the SHA of the commit you wish to remove.
You can do this using or
using
You are looking for the 40 character SHA-1 hash ID (or the 7 character
abbreviation). Yes, if you know the «^» or «~» shortcuts you may
use those.
Obviously replace «SHA» with the reference you want to get rid of.
The «^» in that command is literal.
You will be dumped in an editor with a bunch of lines starting with
pick. The oldest commit, the one you are probably interested in
changing, is first. You will want to change the «pick» to «reword» or
«edit», or perhaps even «squash» depending on what your goal is.
Please read the manual page
for more information. A document
on Post-Production
Editing using Git goes through much of the major uses of git
rebase is some detail. The use case is a little different, but the
fundamental techniques are not.
When using «edit», to change contents or author, when you are
dumped into the shell to make your change, well make your
change, as normal, and then
run (including changing
the author information with —author). When you are satisfied, you
should run
Undoing the last few git operations affecting HEAD/my branch’s tip
Practically every git operation which affects the repository is
recorded in the git reflog. You may then use the reflog to look at
the state of the branches at previous times or even go back to the
state of the local branch at the time.
While this happens for every git command affecting HEAD, it is
usually most interesting when attempting to recover from a bad rebase
or reset or an —amend’ed commit. There are better ways (listed by
the rest of this document) from recovering from the more mundane
reflog updates.
The first thing you need to do is identify the SHA of the good
state of your branch. You can do this by looking at the output
of or, my preference, you can
look graphically at
Once you have found the correct state of your branch, you can get
back to that state by running
You could also link that old state to a new branch name using
Obviously replace «SHA» in both commands with the reference you
want to get back to.
Note that any other commits you have performed since you did that
«bad» operation will then be lost. You could or
those other commits over.
Changing a single commit involving a merge
Note, that this only applies if you have a merge commit. If a
fast-forward (ff) merge occurred you only have simple commits, so
should use
Oh dear. This is going to get a little complicated. It should all
work out, though. You will need to use
a nonce branch as a
placeholder. I will call the nonce branch «nonce» in the following
example. However, you may use any branch name that is not currently
in use. You can delete it immediately after you are done.
-
Identify the SHA of the commit you wish to modify.
You can do this using
or using You are looking for the 40 character SHA-1 hash ID
(or the 7 character abbreviation). Yes, if you know the «^» or
«~» shortcuts you may use those. -
Remember the name of the branch you are currently on
The line with a star on it in the output is the branch you are currently on. I will use
«$master» in this example, but substitute your branch name for
«$master» in the following commands. -
Create and checkout a nonce branch pointing at that commit.
Obviously replace «SHA» with the reference you want to modify.
-
Modify the commit
You need to get the index into the correct state you wish the
commit to reflect. If you are changing the commit message only, you
need do nothing. If you are changing the file contents, typically you
would modify the working directory and use as normal.Note if you wish to restore a file to a known good state, you can
use .Once the index is in the correct state, then you can
run to update the last
commit. Yes, you can use «-a» if you want to avoid
the suggested in the previous
paragraph.If the commit you are updating is a merge commit, ensure that the log
message reflects that. -
Put the remaining commits after the new one you just created
Remembering to substitute the correct branch name for $master
-
Validate that the topology is still good
If some of the commits after the commit you changed are merge
commits, please be warned. It is possible
that will be unable to
properly recreate them. Please inspect the resulting merge
topology
to ensure that git did want you wanted. If it did not, there is not
really any automated recourse. You can reset back to the commit
before the SHA you want to get rid of, and then cherry-pick the normal
commits and manually re-merge the «bad» merges. Or you can just
suffer with the inappropriate topology (perhaps creating fake
merges so
that subsequent development work on those branches will be properly
merged in with the correct merge-base). -
Delete the nonce branch
You don’t need it. It was just there to communicate an SHA between
two steps in the above process.