GIT checkout - дважды - PullRequest
       7

GIT checkout - дважды

0 голосов
/ 04 июля 2018

Когда я хочу отменить изменения файла, который я использую git checkout -- path/to/file.ext. Но почему-то мне нужно выполнить команду дважды.
После первой проверки git diff ничего не показывает, но файл все еще указан как измененный на моем этапе. Только после второй проверки файл удаляется со сцены.
Это предполагаемое поведение?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Команда:

git checkout -- path/to/file.ext

копирует содержимое path/to/file.ext из промежуточной области в рабочее дерево. Он не изменяет содержимое, хранящееся в промежуточной области, и его повторное выполнение должно не иметь никакого значения: копирование из промежуточной области в рабочее дерево, а затем повторное копирование из промежуточной области в рабочую область. дерево, должно привести к тому же содержанию рабочего дерева на второй копии, что и на первой.


Обратите внимание, что существует третья версия файла - ну, на самом деле, мы должны назвать ее first , - это копия, которая находится в текущем коммите . Когда вы проверяете коммит, Git:

  • копирует содержимое каждого файла, сохраненного в этом коммите, в вашу промежуточную область и (одновременно)
  • копирует содержимое каждого такого файла в ваше рабочее дерево.

Это означает, что существует три активных версии файла постоянно:

  • HEAD:path/to/file.ext: этот файл доступен только для чтения, постоянно хранится в коммите, в специальной сжатой форме только для Git. Например, используйте git show HEAD:path/to/file.ext.

  • :path/to/file.ext: это чтение / запись, а не постоянное. Он хранится в промежуточной области (также называемой index или иногда cache ), также в специальной сжатой форме только для Git. Разница между этим и первым файлом заключается в том, что этот файл можно перезаписать, и все, что находится в копии индексной / промежуточной области, - это то, что войдет в следующий сделанный вами коммит. Используйте git show :path/to/file.ext, чтобы увидеть эту копию.

    • Использование git add path/to/file.ext копирует версию рабочего дерева в область index / staging.

    • Использование git checkout -- path/to/file.ext копирует версию индексной / промежуточной области в рабочее дерево.

    • Использование git reset path/to/file.ext копирует версию HEAD:path/to/file.ext из коммита в область index / staging, не затрагивая версию рабочего дерева.

  • Последнее, есть версия рабочего дерева, path/to/file.ext. Этот файл хранится в обычном формате вашего компьютера, чтобы вы и ваш компьютер могли работать с ним.

(Если вы хотите скопировать HEAD версию файла в и индексную / промежуточную область и рабочее дерево, вы можете сделать это с помощью git checkout HEAD path/to/file.ext.)


Обратите внимание, что когда вы запускаете git status, фактически запускаются две разницы:

  1. HEAD против индекса: все, что здесь отличается, «подготовлено для фиксации».
  2. Индекс по сравнению с рабочим деревом: все, что здесь отличается, «не подготовлено для фиксации».

Вы никогда не увидите индекс / промежуточную область напрямую: вы видите его только по сравнению с коммитом HEAD или по сравнению с рабочим деревом. Это имеет смысл, поскольку в большом проекте в области index / staging-области постоянно находятся тысячи файлов, но обычно только несколько из них отличаются от текущего коммита, рабочего дерева или обоих.

0 голосов
/ 04 июля 2018

Вы должны git сбросить файл.

git reset path/to/file.ext

Это приведет к удалению файла. git checkout отменит изменения в рабочем каталоге. В вашем случае, если он установлен, вы можете сначала сделать сброс, чтобы удалить его, а затем выполнить git checkout файл.

Это не предназначенное для кассового поведения поведение - делать это дважды, чтобы удалить сцену.

...