Можно ли увидеть, был ли удален коммит из удаленной ветки?
Причина, по которой я задаю этот вопрос, заключается в том, что я подозреваю, что иногда, когда я работаю, коммит, кажется, просто "исчезает" из удаленной ветви безо всякой причины. Я видел в другом посте здесь, что это действительно возможно сделать с помощью:
git push origin HEAD --force
Я ненавижу чувствовать себя параноиком, но я бы успокоился, если бы мог проверить это. Я где-то читал о команде:
git reflog
Это выглядело как справочная страница для этого говорит, что эта команда также может быть использована для удаления записей из журнала, что отчасти отстой. Могу ли я в любом случае проверить это и успокоить свой разум?
2 ответа
Вы действительно можете использовать git reflog
проверить, есть ли отсутствующий коммит в удаленной ветке, но он будет работать, только если у вас есть актуальная копия этой удаленной ветки в вашем локальном репо (вашей ветке удаленного отслеживания).
Вы можете регулярно обновлять локальную ветку удаленного отслеживания, часто выполняя git fetch
, Однако, если кто-то отправляет коммит, который вы не получили, а затем удаляет его перед следующей выборкой, вы не узнаете, что был удален коммит. Вы обнаружите, что история удаленной ветви была изменена только в том случае, если у вас есть копия оригинальной истории, которая была изменена, и в этом случае Git сообщит вам, что произошло принудительное обновление:
$ git fetch origin
From c:/Users/Keoki/Documents/GitHub/bare
+ 02f0d6e...5c7b77b master -> origin/master (forced update)
Если кто-то принудительно нажимает на ваш пульт, это должно быть очевидно очевидно, как только вы извлекаете или извлекаете, потому что оно будет отображаться как принудительное обновление (как я уже указывал), если только вы не извлекаете или не извлекаете часто вынимайте из пульта. Если у вас есть прямой доступ к вашему удаленному репо, вы также можете проверить его на этом.
Использование Reflog
Вы упоминаете,
Это выглядело как справочная страница для этого говорит, что эта команда также может быть использована для удаления записей из журнала, что отчасти отстой.
git reflog
удаляет только записи из reflog (не того журнала, который вы получаете с git log
) если вы передадите любой из следующих дополнительных параметров (из официальной документации):
--expire=<time>
--expire-unreachable=<time>
--all
Иначе, git reflog
только для чтения и просто перечислит историю ваших ссылок. Для вашего конкретного примера вы можете просмотреть историю рефлогов вашей ветки удаленного отслеживания, используя:
git reflog <remote>/<branch>
Например,
$ git reflog origin/master
5c7b77b refs/remotes/origin/master@{0}: fetch origin: forced-update
02f0d6e refs/remotes/origin/master@{0}: fetch origin: fast-forward
fc32eac refs/remotes/origin/master@{1}: pull origin master: fast-forward
b6a06e1 refs/remotes/origin/master@{5}: fetch origin: fast-forward
35a91e4 refs/remotes/origin/master@{6}: update by push
019ea3a
В приведенном выше примере вы увидите origin/master
был принудительно обновлен в самой последней (верхней) записи reflog, что указывает на то, что исходная история удаленной ветви была изменена, что, возможно, указывает на то, что фиксация была удалена (хотя переписанная фиксация также приведет к принудительному обновлению).
Существует несколько способов эффективного удаления или иного изменения журналов Git, в том числе (из документации Git): amend
, rebase
, squash
, а также filter-branch
, Просмотрите параметры по адресу:
http://git-scm.com/book/en/Git-Tools-Rewriting-History
Что касается функции reflog
(из архива ядра Linux):
https://www.kernel.org/pub/software/scm/git/docs/git-reflog.html
Reflog - это механизм для записи, когда верхушка веток обновляется. Эта команда предназначена для управления записанной в ней информацией.
Reflog полезен в различных командах git для указания старого значения ссылки. Например, HEAD@{2} означает "где HEAD раньше был два шага назад", master@ enjone.week.ago} означает "где мастер указывал на неделю назад" и так далее. Смотрите gitrevisions(7) для более подробной информации.
По сути, Git хранит два журнала: тот, который нам всем известен, и журнал reflog, последний из которых существует только в вашем локальном репо. Git обновляет reflog при каждом перемещении HEAD (из-за новых коммитов, проверки веток или сброса). К нему обычно обращаются при восстановлении коммитов после полного сброса.
Для просмотра журнала введите:
git reflog
Чтобы просмотреть более подробно, введите:
git log --walk-reflogs
Что касается вашего вопроса, я полагаю, вы могли бы бежать git log
а также git reflog
(или же git log
а также git log --walk-reflogs
) и сравните результаты (помня, что reflog
только записи локальных действий).