За всем этим стоит лот (много всего).
Как axia c отмечено в комментарии , |
символ является частью оболочки программирования . Стандартные оболочки Unix / Linux или интерпретаторы командной строки читают и выполняют команды либо из интерактивного сеанса, либо из сценария. Точные детали варьируются от одной оболочки к другой, но все они поддерживают концепцию трубопровода . Конвейер соединяет одну команду с другой командой, и команды Unix / Linux имеют понятия стандартный ввод и стандартный вывод . Итак:
prog1 | prog2 | prog3
запускает три программы: prog1
читает свой стандартный ввод с клавиатуры или там, где прямо сейчас установлен стандартный ввод оболочки. Вывод prog1
направляется в prog2
, поэтому, когда prog2
читает свой стандартный ввод, он видит все, что напечатано prog2
. Между тем вывод prog2
направляется в prog3
, поэтому, когда prog3
читает свой стандартный ввод, он видит то, что напечатал prog2
. Так как стандартный вывод prog3
не перенаправлен, он идет туда, где прямо сейчас установлен стандартный ввод оболочки: вероятно, ваше окно терминала.
Команда wc
считает символ, слова и строки. Аргумент -l
для wc
говорит ему о том, что он должен подавлять количество символов и слов и печатать только количество строк.
Команда git ls-files
несколько сложна. Он может:
- перечислять файлы, которые находятся в Git index (это значение по умолчанию), или
- перечислять файлы, которые aren 't в индексе Git (это то, что
--others
выбирает).
Когда он делает эти списки, он может включать или исключать файлы на основе различных критериев. В этом конкретном случае флаг --others
указывает списку файлов, которые имеют в рабочем дереве и не в индексе. Флаг -m
в этом конкретном режиме не имеет значения и игнорируется. Аргумент --exclude-standard
делает именно то, что вы процитировали: исключите из вывода списка имена файлов, которые были бы напечатаны, но которые соответствуют стандартным критериям исключения.
Стандартные критерии исключения несколько сложны, как и понятия index и work-tree в первую очередь. Однако, чтобы значительно упростить индекс - в некоторых интересных случаях он может быть неверным - индекс Git равен , где вы строите следующий коммит, который вы сделаете . Следовательно, git ls-files --others
перечисляет файлы, которые Git не будет фиксировать: он перечисляет файлы, которые не в индексе, и Git собирается фиксировать файлы, которые являются в индексе.
git ls-files
, который вы цитировали, добавляет .
к концу, что потенциально меняет каталоги, которые рассматриваются для печати. Тем не менее, git ls-files
по умолчанию работает с .
, так что в этом случае .
бесполезен, хотя и безвреден.
Имейте в виду, что git stash
, о котором мы поговорим далее, обычно работает на всем рабочем дереве, даже если вы находитесь в каком-либо подкаталоге в рабочем дереве. Команда git ls-files
работает по-другому: она запускается на любом уровне, а не сверху.
Команда git stash push
довольно сложна, особенно при использовании с аргументами. В частности:
git stash push -k -u -- $files_to_stash
пишет три Git коммитов вместо обычных двух. Обычный git stash
будет тогда запускать эквивалент git reset --hard
, но один с -k
делает что-то другое: он проверяет индексные копии файлов. При -u
третий коммит содержит несколько неотслеживаемых файлов. Эти опции могут использоваться независимо (хотя здесь их нет).
Не отслеживаемые файлы - это те, которые находятся в рабочем дереве, но не в индексе, о чем мы говорили Примерно мгновение go с git ls-files --others
. Однако Git различает неотслеживаемые файлы, которые не игнорируются - в частности, команда git status
будет жаловаться на такие файлы - и неотслеживаемые файлы, которые являются игнорируется, где git status
подавляет жалобу. К типу неотслеживаемых файлов, которые хранит -u
, относятся те, чьи жалобы не должны подавляться, поэтому эта операция git stash -u
применяется к тем же файлам, которые мы можем увидеть в git ls-files --others --exclude-standard
.
После сохранения неотслеживаемых файлов в при третьем коммите git stash
удаляет эти файлы из рабочего дерева.
При добавлении указанных c путей к git stash
его операции ограничиваются этими конкретными путями, кроме что фиксации индекса и рабочего дерева все еще содержат все файлы. На самом деле вопрос скорее в том, какая версия из каких файлов go в индекс и в коммиты рабочего дерева, которые были сделаны, и впоследствии сбрасывается на совпадение HEAD
(нормальная работа) или индекса (* 1128) * mode).
Первое перенаправление в конце, >/dev/null
, является конструктом оболочки - оно не является частью самого Git. Он говорит оболочке отправить стандартный вывод команды в файл /dev/null
. Этот файл сам по себе особенный: данные, записанные в файл, немедленно удаляются, а файл остается нулевой длины. (Вы также можете читать данные из /dev/null
: кажется, что при чтении они содержат бесконечное число нулевых байтов, даже если его длина равна нулю.)
Команда git checkout
чрезвычайно сложна - настолько что начиная с Git 2.23, оно было разделено на две отдельные команды, git switch
и git restore
. Существующая команда git checkout
по-прежнему работает как обычно. Просто объясняет и управляет различными операциями здесь, когда они разделены на две команды. (Это также дает git restore
возможность делать то, что раньше было невозможно, с помощью одной команды Git.) Конкретная, о которой вы спрашивали, используя --theirs
, вызывает режим извлечения, который полезен только тогда, когда индекс хранит конфликт слияния . В этом режиме индекс не предлагаемый следующий коммит: он был расширен, и фиксация запрещена до разрешения конфликтов слияния. Это слишком большая топика c, чтобы указывать здесь.
Последняя команда, git stash drop
, направляет Git на сброс a sta sh (тайники являются двумя или -три кластеров фиксации, сделанных git stash push
или его старшим синонимом, git stash save
). Эта команда немного опасна тем, что после сброса sta sh может быть очень трудно найти. Все Git 'обычные' упс, я не хотел забывать, что трюки восстановления после всех 'хитрости восстановления с напрасным sta sh напрасны, так что будьте уверены, что все оставленные * * sh * * действительно больше не нужен.