git warning: журнал для «master» восходит только к дате?Как сослаться на удаленную ветку вместо локальной? - PullRequest
0 голосов
/ 20 сентября 2019

Когда я выполняю приведенную ниже команду в рабочей ветке (проверено сегодня на пульте дистанционного управления / origin / master):

git checkout master
git diff --name-status "@{2 days ago}" "@{now}"

Это говорит:

warning: Log for 'HEAD' only goes back to Thu, 19 Sep 2019 16:01:05 -0700.

Еще когда я проверяюgit log master, он явно возвращается еще дальше:

commit a2d1acfe855899e7e9562a16b692aa5d1f44d5dd (HEAD -> master, origin/master)
Merge: 1cfee7bc5 14583d879
Author: ABC
Date:   Wed Sep 18 14:05:51 2019 -0700

    Merge-Request: 2457 from 'CXSFA-44175' into 'master'

commit 1cfee7bc5c292c09a108e0319ddcec8ab3608887
Merge: 8ab7bc71e 80464ea73
Author: DEF
Date:   Wed Sep 18 10:03:04 2019 -0700

Комментарий Эндрю в этом вопросе ( git: Журнал «только для мастера» восходит к дате ошибки? ) говорит: «Мастер @ использует reflog, который соответствует вашему локальному созданию репозитория, а не датам фиксации "

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

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

TL; DR

Эта строка:

commit a2d1acfe855899e7e9562a16b692aa5d1f44d5dd (HEAD -> master, origin/master)

означает, что ваш master уже синхронизирован с вашим origin/master, поэтому вына том же коммите.Единственное предостережение в том, что это из памяти вашего Git 1011 * их Git, последний раз, когда ваш Git говорил со своим Git.Запускайте git fetch origin в любое время, чтобы ваш собственный Git получал что-то новое от их (origin) Git и обновлял ваши origin/* имена: теперь память вашего Git обновлена.(Конечно, это может устареть через несколько секунд.)

Long

Git может быть довольно запутанным.Терминология не очень последовательна, и слова снова и снова используются в совершенно разных значениях.

В этом случае предупреждающее сообщение - это то, что вы заметили: master@{...} использует то, что Git называет reflogs .Reflogs - это журналы (не связанные с git log) из refs или ссылок .Имя master - это имя ветви , которое представляет собой конкретную форму reference .Так что это относится к reflog для ref refs/heads/master, а refs/heads/master - это длинный путь написания master.

Итак, мы только что увидели одну проблему: слово log может означать git log, но это может означать что-то еще.Это ничто, однако, по сравнению со словом ответвление! См., Например, Что именно мы подразумеваем под «ответвлением»?

Чтобы помочь устранить всю путаницуДавайте начнем с чего-то более простого.Когда вы используете Git, задействовано более одного хранилища.У вас есть ваша копия, у меня есть моя , у Фреда его , у Алисы ее и так далее.В каждом из этих репозиториев Git есть ветки, коммиты и тому подобное.Как мы можем держать их всех прямо?

В Гите есть только несколько абсолютов.Основным из них являются те хеш-идентификаторы, которые вы видите в своих git log выходных данных:

commit 1cfee7bc5c292c09a108e0319ddcec8ab3608887

и:

commit a2d1acfe855899e7e9562a16b692aa5d1f44d5dd

Эти хэшиИдентификаторы действительно универсальны.Если у вас есть коммит a2d1acfe855899e7e9562a16b692aa5d1f44d5dd, ваш Git называет его a2d1acfe855899e7e9562a16b692aa5d1f44d5dd.Если у Алисы есть это, ее Git также называет это a2d1acfe855899e7e9562a16b692aa5d1f44d5dd. Каждый , у которого есть , который фиксирует, называет его тем же большим уродливым хеш-идентификатором.У них либо есть это, либо у них нет ничего с таким большим уродливым хэш-идентификатором.

Простые люди, конечно, ужасно работают с этими хэш-идентификаторами.Но у нас нет , чтобы иметь с ними дело в большинстве случаев: у нас есть компьютер .Почему бы не это запомнить хэш-идентификаторы?Таким образом, Git делает это - вот где приходят имена веток, - но каждый репозиторий Git имеет своих имен ветвей.Ваш master не должен совпадать с master Боба.У вашего имени master будет большой некрасивый хеш-идентификатор, но он может отличаться от имени другого.

Чтобы справиться с этим, наши Гиты помнят ветви друг друга.Когда ваш Git вызывает другой Git, который вы называете origin, у вашего Git есть список Git с именами ветвей и хэш-идентификаторами.Их Git может сказать , мой master равен a2d1acfe855899e7e9562a16b692aa5d1f44d5dd.Если это так, ваш Git удостоверится, что у вас есть этот коммит (по хеш-идентификатору), если он получен из Git, а ваш Git устанавливает ваше refs/remotes/origin/master имя на a2d1acfe855899e7e9562a16b692aa5d1f44d5dd.

В конце концов, это означает, что вы можете сказать, что было у их Git master, когда в последний раз ваш Git разговаривал со своим Git, проверив, что ваш Gitorigin/master сейчас.Вы можете изменить идентификатор хеша, которым является master;ваш Git оставит ваш origin/master - полное имя refs/remotes/origin/master - один, пока ваш Git не вызовет их Git снова и не узнает, где находится их master.

Your reflogs помните, что ваш Git добавил в ваши ссылки.Каждый раз, когда ваш Git обновляет ваш master, ваш Git сохраняет новую запись в рефлоге вашего Git refs/heads/master.Это работает и для ваших имен для удаленного слежения: каждый раз, когда ваш Git обновляет ваш refs/remotes/origin/master, память о мастере origin, ваш Git сохраняет новую запись в журнале refs/remotes/origin/master вашего Git.Таким образом, вы можете посмотреть в своих журналах, но это посмотреть, что у вас было в ваших собственных ссылках.Это не смотрит ни на какие фактические коммиты , по крайней мере, не сразу;эти записи reflog содержат по одному хеш-идентификатору, и вы можете использовать его для поиска коммитов.

Записи Reflog являются частными для каждого Git.Ваш Git не получит записи reflog от своего Git.Вы не можете видеть, что они сделали со своими рефери с течением времени, но никак не так.Вы можете видеть только то, что ваш Git сделал с вашими ссылками с течением времени.

1 голос
/ 20 сентября 2019

Синтаксис @{xyz} проверяет reflogs, это журналы того, на что ссылались refs.Все ссылки местные.@{2.days.ago} - это «то, что я проверил в этом репо 2 дня назад».Если вместо этого вы хотите, чтобы «последняя вещь, переданная мастеру origin, как минимум 2 дня назад», git rev-list -1 origin/master --before 2.days.ago - это хороший стартовый набор, в зависимости от того, что вы ищете, вам также могут потребоваться --first-parent и / или --author-date-order.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...