Здесь есть две части:
Это не объединение файла, это перезапись файла.
Синтаксис, который вы хотите: git checkout <em>tree-ish</em> -- <em>path</em>
, или, в Git начиная с 2.23, git restore --source <em>tree-ish</em> --staged --worktree -- <em>path</em>
.
(будьте осторожны, чтобы не использовать git checkout -- <em>path</em>
, который очень отличается.)
tree-ish
часть может быть именем ветви, как master
, но помните, что когда вы используете master
, вы имеете в виду ваше имя филиала master
, а не чье-либо имя филиала master
. Чтобы сослаться на кого-то чужого master
, например, master
, который ваш Git запоминает (и получает от) другого Git, который ваш Git запоминает под именем origin
, вы хотели бы использовать origin/master
, а не master
. Вы также можете использовать необработанный коммит ha sh. Например, после запуска git log
, если вы заметили конкретный коммит a123456...
или что-то еще и хотите скопировать этот файл из этого коммита, вы можете просто использовать га sh ID фиксации. 1
Обычно --
не является обязательным, но я рекомендую использовать его всегда. 2 Это гарантирует , что неважно имя file означает, что Git не будет случайным образом рассматривать его как имя ветви, как опцию, или как угодно. (Например, предположим, что файл называется master
, или -f
, или что-то похожее. Они выглядят как имена и параметры ветвей. --
говорит Git: Это не имя ветви и не опция, или что-то в этом роде: это имя файла. )
путь часть - это просто путь к файлу, который появляется в коммите.
Опять же, к go обратно к точке # 1, здесь нет слияния . Чтобы объединить , вам нужно три версии файла; он выбирает одну версию - версию, сохраненную в выбранном вами коммите, и говорит записать эту версию файла в индекс и в мое рабочее дерево . 4
1 Причина, по которой в документации говорится, что этот аргумент является tree-i sh, а не commit или commit-i sh - это то, что вы можете использовать все, что разрешено для одного из Git внутренних деревьев объектов. Коммит делает это, поэтому коммит работает; и здесь никогда не будет 3 никаких причин использовать что-либо, кроме коммита, здесь есть sh ID.
2 Я сам не в такой привычке, но обычно Я заметил в случае, когда пропуск --
вызвал бы проблему. Для меня все еще было бы хорошо иметь это как привычку, если я не замечу!
3 Вставьте сюда процедуру Гилберта и Салливана.
4 Индекс , который Git также называет областью подготовки , - это место, где вы строите свой следующий коммит. 5 Ваше рабочее дерево - это место, где вы можете просматривать и работать со своими файлами. Файлы, хранящиеся внутри коммитов, хранятся в специальном, только для чтения, Git -только, замороженном на все время формате. Это делает их отличными для архивирования - что является огромной частью того, что система контроля версий о , в конце концов, - но совершенно бесполезно для выполнения любой работы . Следовательно, рабочее дерево или рабочее дерево , где у вас есть полезные версии файлов, извлеченные из коммитов.
5 Это упрощенная картина: у индекса есть несколько дополнительных ролей, особенно во время слияния. Если вы просто думаете, что в нем содержится копия каждого файла из текущего коммита, возможно, обновленного, так что следующий коммит будет другим, вы обычно достаточно близки. Когда вы запускаете git commit
, Git не использует то, что находится в вашем рабочем дереве , а скорее то, что находится в index . Вот почему вы должны продолжать повторять операции git add
: git add
означает скопировать файл рабочего дерева обратно в индекс, чтобы новая версия была размещена , вместо того, чтобы ставить старую версию .