Проверка старого коммита стирает новый в git - почему? - PullRequest
1 голос
/ 14 апреля 2011

Я только что сделал новый репозиторий. Я создал пару файлов, добавил их в репозиторий, и они зафиксировали его. Затем я добавил пару новых файлов, добавил их в git и снова зафиксировал.

К моему удивлению, если я попытаюсь оформить первоначальный коммит, он сотрет новый (по крайней мере, так он выглядит). В окне egit, которое появляется во время выполнения операции, оно что-то говорит о «выполнении перехода к нулю».

Я пробовал это 3 раза, и это всегда происходит, поэтому я предполагаю, что это действительно предполагаемое поведение. Может ли кто-нибудь объяснить, почему это происходит? Что за этим стоит?

Спасибо

1 Ответ

4 голосов
/ 14 апреля 2011

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

Refs:              v-- master <-- HEAD   
Commits:    1      2 
          --*------* 
Files:      |      |
            +- foo + foo
            +- bar + bar
                   + baz

Это означает, что у вас есть два коммита, 1 и 2 (конечно, они будут длинными шестнадцатеричными строками, но мы назовем их 1 и 2, чтобы было проще). В коммите 1 у вас есть файлы foo и bar. В коммите 2 вы добавляете файл baz. Теперь, если вы проверяете коммит 1, это означает, что вы хотите переключить ваше рабочее дерево, чтобы оно выглядело точно так же, как в коммите 1, обновив свой HEAD ref, чтобы указать на него:

Refs:       v-- HEAD v-- master                       
Commits:    1        2  
          --*--------* 
Files:      |        |
            +- foo   + foo
            +- bar   + bar
                     + baz

Так что теперь ваше рабочее дерево выглядит так же, как в коммите 1; у вас есть только foo и bar. Если вы проверяете master или фиксируете 2 снова, вы должны увидеть baz вновь.

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

Обратите внимание, что при проверке коммита 1 вы можете получить предупреждение о том, что у вас будет оторванная голова. Отделенная голова - это ссылка HEAD, которая не указывает на ветку. Если у вас отдельная голова, то на любые новые созданные вами коммиты не будет ссылаться конкретная ветка; на них будет ссылаться только ваша HEAD, а это значит, что если вы позже извлечете master или другую ветку, на них ничего не будет ссылаться (кроме reflog).

Кроме того, когда вы проверяете коммит 1, если вы затем делаете git log, чтобы посмотреть историю, он по умолчанию покажет вам историю текущей HEAD ревизии (то есть версии, которая у вас есть на данный момент). проверено). Так как это указывает на ревизию 1, которая больше не имеет ничего в своей истории, вы увидите только ревизию 1 в истории. Вы по-прежнему можете просматривать историю других ревизий, обращаясь к ним напрямую или через ссылки, указывающие на них, например master. В моем примере выше, если вы сделали git log master, вы увидите историю, содержащую коммиты 1 и 2.

Чтобы увидеть полную историю вашего репо, я обычно использую gitk --all, чтобы показать мне все ветви, теги и другие ссылки в моем репозитории, а также их историю. Вы упомянули, что используете EGit, с которым я не знаком, но у него может быть похожая опция «показать всю историю».

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