Это 10-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.
В этой статье показаны наиболее распространенные команды Git. Если вы немного понимаете, как работает Git, эта статья даст вам лучшее понимание.
Основное использование
Четыре приведенные выше команды копируют файлы между рабочим каталогом, промежуточным каталогом (также называемым индексом) и репозиторием.
- git add files помещает текущий файл в промежуточную область.
- Git Commit Commit, чтобы генерировать площадь постановки снимков и отправить.
- git reset -files используется для отмены последних файлов git add, вы также можете использовать git reset для отмены всех файлов промежуточной области.
- git checkout - files копирует файлы из промежуточной области в рабочий каталог, отбрасывая локальные модификации.
Вы можете войти в интерактивный режим с помощью git reset -p, git checkout -p или git add -p.
Вы также можете пропустить область подготовки и напрямую получить файлы из репозитория или напрямую отправить код.
- git commit -a эквивалентен запуску git add для добавления всех файлов в текущем каталоге в промежуточную область и последующего запуска.
- Git Commit Files делает отправку моментальных снимков файлов последней отправкой. И файл добавляется во временную область.
- Git Checkout Head — файлы откатываются до последней отправки репликации.
соглашение
Изображения используются в следующем виде в следующем тексте.
Зеленые 5 символов представляют собой идентификатор фиксации, соответственно указывая на родительский узел. Ветки показаны оранжевым цветом, и каждая указывает на конкретную фиксацию. Текущая ветвь идентифицируется прикрепленным к ней HEAD. На этом изображении показаны последние 5 коммитов, где ed489 является последним коммитом. Ветка master указывает на этот коммит, а другая ветка maint указывает на узел коммита-прародителя.
Подробная команда
Diff
Есть много способов просмотреть изменения между фиксациями, вот несколько примеров.
Commit
При отправке Git создает новый документ, представленный площадью постановки, и в это время узла на родительский узел. Затем ветвь точка для отправки нового текущего узла. Ниже текущая ветвь - это мастер. Перед запуском команды Master Point ED489, после отправки, основная точка на новый узел в ED489 F0Cec и в качестве родительского узла.
Даже если текущая ветка является прародителем коммита, git сделает то же самое. На рисунке ниже сделана фиксация на ветке maint прародительского узла ветки master, и генерируется 1800b. Таким образом, ветвь maint больше не является прародителем основной ветки. В этом случае необходимо выполнить merge[1] (или rebase[2]).
Если вы хотите изменить коммит, используйте git commit --amend. Git сделает новую фиксацию с тем же родителем, что и текущая фиксация, а старая фиксация будет отменена.
Другой пример — отсоединение фиксации HEAD [3], описанное ниже.
Checkout
Команда Checkout используется для копирования файлов из исторических коммитов (или промежуточной области) в рабочий каталог, а также может использоваться для переключения ветвей.
Когда задано имя файла (либо с включенной опцией -p, либо с включенной опцией -p в обоих случаях), Git копирует файл из указанной фиксации в промежуточную область и рабочий каталог. Например, git checkout HEAD~ foo.c скопирует foo.c из узла фиксации HEAD~ (родительского узла текущего узла фиксации) в рабочий каталог и добавит его в область подготовки. (Если в команде не указан узел фиксации, содержимое будет скопировано из промежуточной области.) Обратите внимание, что текущая ветвь не изменится.
Когда вместо того, чтобы указывать имя файла, предоставляется (локальная) ветвь, то флаг головки перемещается к этой ветви (то есть мы «переключили» на эту ветку), и содержимое зоны постановки и рабочего каталога - тогда это будет такой же, как узел фиксации, соответствующий руководителю. Все файлы в новом узере Commit (A47C3 на рисунке ниже) копируются (в зону постановки и рабочего каталога); файлы, которые существуют только в старом узле фиксации (ED489); ни один из вышеуказанных файлов не игнорируется и не затрагивается Отказ
Если не указано ни имя файла, ни имя ветки, а указан тег, удаленная ветка, значение SHA-1 или что-то вроде master~3, вы получите анонимную ветку, называемую detached HEAD (идентификация detached HEAD). Это позволяет легко переключаться между историческими версиями. Допустим, вы хотите скомпилировать Git версии 1.6.6.1, вы можете запустить git checkout v1.6.6.1 (это тег, а не название ветки), скомпилировать, установить, а затем переключиться обратно на другую ветку, скажем, git checkout master. Однако, когда операция фиксации включает «отсоединенный HEAD», поведение немного отличается, как подробно описано ниже.
Зафиксировать операцию, когда флаг HEAD находится в отсоединенном состоянии
Когда HEAD отсоединен (не подключен ни к одной из веток), коммиты работают нормально, но именованные ветки не обновляются. (Вы можете думать об этом как об обновлении анонимной ветки.)
Как только вы затем переключитесь на другую ветку, скажем, master, узел фиксации (вероятно) больше никогда не будет упоминаться и будет отброшен. Обратите внимание, что после этой команды ничто не будет ссылаться на 2eecb.
Однако, если вы хотите сохранить это состояние, вы можете создать новую ветку с помощью команды git checkout -b name.
Reset
Команда Reset указывает текущую ветвь на другое место и при необходимости изменяет рабочий каталог и индекс. Также используется для копирования файлов из хранилища истории в индекс без изменения рабочего каталога.
Если опция не указана, текущая ветвь указывает на эту фиксацию. При использовании параметра --hard рабочий каталог также обновляется, а при использовании параметра --soft он остается неизменным.
Если номер версии точки фиксации не указан, по умолчанию используется HEAD. Таким образом, точки ветвления не изменяются, но индекс откатывается к последнему коммиту, и то же самое верно для рабочего каталога, если используется опция --hard.
Если задано имя файла (или параметр -p), он работает так же, как и проверка с именем файла, за исключением того, что индекс обновляется.
Merge
Команда Merge объединяет разные ветки. Перед слиянием индекс должен совпадать с текущим коммитом. Если другая ветвь является прародителем текущего коммита, команда слияния ничего не сделает. Другой случай, если текущий коммит является прародителем другой ветки, что приводит к ускоренному слиянию. Указание на — это простое движение, и создается новая фиксация.
В противном случае это настоящее слияние. По умолчанию текущий коммит (ed489, показанный ниже) выполняет трехстороннее слияние с другим коммитом (33104) и их общим предком (b325c) [4]. В результате сначала нужно сохранить текущий каталог и индекс, а затем сделать новую фиксацию с родительским узлом 33104.
Cherry Pick
Команда вишневого выбора «дублирует» узел фиксации и делает точную новую фиксацию в текущей ветке.
Rebase
Черчение — еще один вариант команды слияния. Объедините две родительские ветки, отправьте, и история отправки не будет линейной. История повторения другой ветки повторяется на текущей ветке, и история является линейной. По сути, это линейный автоматический выбор вишни.
Вышеупомянутые команды выполняются в ветке Topic, а не в ветке master, повторяются в ветке Master и указывают ветке на новый узел. Обратите внимание, что старая заявка не упоминается и будет переработана.
Чтобы ограничить область отката, используйте параметр --onto. Следующая команда воспроизводит несколько последних коммитов текущей ветки, начиная с 169a6, то есть 2c33a, в ветке master.
Существует также git rebase --interactive, упрощающий выполнение некоторых сложных операций, таких как отбрасывание, переупорядочивание, изменение и слияние коммитов.
Содержимое файла на самом деле не хранится в индексе (.git/index) или объекте фиксации, а хранится в базе данных (.git/objects) в виде больших двоичных объектов и проверяется значениями SHA-1. В индексном файле перечислены связанные файлы больших двоичных объектов и другие данные с идентификаторами. Для коммитов он хранится в виде дерева, которое также идентифицируется его хеш-значением. Дерево соответствует папкам в рабочем каталоге, а дерево или объекты больших двоичных объектов, содержащиеся в дереве, соответствуют соответствующим подкаталогам и файлам. Каждый коммит хранит идентификатор своего предыдущего уровня дерева.
При фиксации с отсоединенным HEAD последняя фиксация будет указана в журнале ссылок для HEAD. Но через некоторое время он терпит неудачу и в конечном итоге перерабатывается, так же как git commit --amend или git rebase.