Git add: Saving changes | Atlassian Git Tutorial
9. Изменения, а не файлы
Цели
- Понять, что git работает с изменениями, а не файлами.
Большинство систем версионного контроля работают с файлами. Вы добавляете файл в версионный контроль, а система отслеживает изменения файла с этого момента.
Git фокусируется на изменениях в файле, а не самом файле. Когда вы осуществляете команду git add file
, вы не говорите git добавить файл в репозиторий. Скорее вы говорите, что git надо отметить текущее состояние файла, коммит которого будет произведен позже.
Мы попытаемся исследовать эту разницу в данном уроке.
01 Первое изменение: Добавьте стандартные теги страницы
Измените страницу «Hello, World», чтобы она содержала стандартные теги <html>
и <body>
.
Файл:
hello.html
<html> <body> <h2>Hello, World!</h2> </body> </html>
02 Добавьте это изменение
Теперь добавьте это изменение в индекс git.
Выполните:
git add hello.html
03 Второе изменение: Добавьте заголовки HTML
Теперь добавьте заголовки HTML (секцию <head>
) к странице «Hello, World».
Файл:
hello.html
<html> <head> </head> <body> <h2>Hello, World!</h2> </body> </html>
04 Проверьте текущий статус
Выполните:
git status
Вы увидите…
Результат:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.html # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: hello.html #
Обратите внимание на то, что hello.html
указан дважды в состоянии. Первое изменение (добавление стандартных тегов) проиндексировано и готово к коммиту. Второе изменение (добавление заголовков HTML) является непроиндексированным. Если бы вы делали коммит сейчас, заголовки не были бы сохранены в репозиторий.
Давайте проверим.
05 Коммит
Произведите коммит проиндексированного изменения (значение по умолчанию), а затем еще раз проверьте состояние.
Выполните:
git commit -m "Added standard HTML page tags" git status
Вы увидите…
Результат:
$ git commit -m "Added standard HTML page tags" [master 8c32287] Added standard HTML page tags 1 files changed, 3 insertions(+), 1 deletions(-) $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: hello.html # no changes added to commit (use "git add" and/or "git commit -a")
Состояние команды говорит о том, что hello.html
имеет незафиксированные изменения, но уже не в буферной зоне.
06 Добавьте второе изменение
Теперь добавьте второе изменение в индекс, а затем проверьте состояние с помощью команды git status
.
Выполните:
git add . git status
Примечание: В качестве файла для добавления, мы использовали текущий каталог («.»). Это самый краткий и удобный способ добавления всех изменений в файлы текущего каталога и его подкаталоги. Но поскольку он добавляет все, не лишним будет проверить состояние перед запуском add
, просто чтобы убедиться, что вы не добавили какой-то файл, который добавлять было не нужно.
Я хотел показать вам трюк с add
, далее мы будем на всякий случай продолжать добавлять явные файлы.
Вы увидите…
Результат:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.html #
Второе изменение было проиндексировано и готово к коммиту.
07 Сделайте коммит второго изменения
Выполните:
git commit -m "Added HTML header"
Основы Git за 5 минут
По мере своего становления в роли разработчика приходит понимание того, что большая часть работы ведется в команде. И при работе в команде нужна система контроля версий, которая поможет управлять изменениями в коде, сделанными разными разработчиками.
Git — это одна из самых популярных систем контроля версий. И, тем не менее, она повергает новичков-разработчиков в шок — поверьте на слово, сам прошел через это. К слову сказать, я побаивался Git на протяжении нескольких лет.
Если вы опытный разработчик и не дрожите от одного упоминания Git, то смело закрывайте эту статью и выбирайте что-то потруднее. Но если вы новичок в Git или не уверены в своих знаниях, то посвятите пару минут своего времени изучению основных, но весьма важных, аспектов Git.
Вот о чем поговорим:
- Git clone.
- Git checkout.
- Git pull.
- Git add и commit.
- Git stash и merge.
- Git push.
Git clone
Всегда клонируйте новые репозитории, над которыми работаете. То есть, закачивайте копии файлов репозитория на свой локальный компьютер. Существует множество способов клонирования репозитория. Однако я объясню технологию на примере командной строки.
Допустим, вы захотели клонировать репозиторий со скриншота, представленного выше. Для начала скопируйте ссылку клонирования (см. выше). Затем откройте терминал и через cd
перейдите в область на компьютере, куда будут копироваться файлы. Если вы хотите клонировать ветку master
, то напечатайте git clone
и вставьте ссылку, как это показано ниже:
git clone https://github.com/JamesOkunlade/old-apple.git
Для клонирования определенной ветки репозитория сделайте следующее:
git clone https://github.com/JamesOkunlade/old-apple.git -b branch-name
Git checkout
Лучше всего не работать напрямую в master
, а создавать отдельные ветки под разные опции. Как только вы решите, что все фичи соответствуют требованиям и готовы к тестированию, смело сливайте их с веткой master
.
В процессе работы возникает необходимость перехода в отдельную ветку репозитория. Это можно сделать следующей командой.
Если ветка уже создана:
git checkout branch-name
Если вы создаете новую ветку опций:
git checkout -b branch-name
Git pull
Ваша команда или коллега-разработчик могут изменять ветки репозитория. И каждый раз перед написанием кода вы должны вливать эти изменения в ветку, с которой будете работать. Перейдите в ветку через checkout
и выполните команду git pull
. Последние изменения будут влиты в локальный репозиторий.
Git add и commit
Команды add
и commit
почти всегда неразлучны. Это как захват и сохранение данных. Вы не сможете ничего сохранить, пока не захватите нужные данные. Таким образом, команда add
всегда предшествуетcommit
. С командой add
вы указываете определенный файл, который требуется захватить в текущем состоянии, а commit
сохраняет его копию.
Для захвата всех файлов (кроме исключений изgit ignore
) понадобится git add.
Захват текущего состояния отдельно взятого файла (к примеру, index.html
) делается через git add index.html
.
После создания снимков репозитория их нужно закоммитить и сохранить в локальный репозиторий. Это делается через следующую команду:
git commit -m ‘commit message’
Сообщение в коммите должно пояснить специфику сохраняемых снимков. Например:
git add index.html
git commit -m ‘создание кнопки формы опции’
Две команды можно объединить через оператор&&
:
git add index.html && git commit -m ‘создание html структуры футера’
Git stash и merge
git stash
сохранит все изменения ветки, которые вы не хотите коммитить. Это значит, что вы можете ждать, пока другой разработчик закоммитит и вольет копию своих изменений в ветку, и параллельно экспериментировать с той же веткой. Git всячески это приветствует. Если вы хотите просто влить новые изменения в локальный репозиторий, но не выполнять слияния с веткой, то просто сохраните эти изменения черезstash
. git stash
сохранит копию этих изменений. Их можно будет просмотреть через список git stash
.
git merge
– это команда, которая сливает два разных снимка репозитория. Вы можете сливать разные снимки изменений одной и той же ветви, сделанные разными разработчиками. Либо же можно сливать разные снимки разных веток.
При переходе в ветку master
команда git merge
сливает ветку dev
с master
и наоборот.
Git push
По аналогии с тем, как вы сохраняете снимки в Google Фото, и их видят другие люди, имеющие доступ, git push
отправляет локальный репозиторий на сервер, доступный другим пользователям.
git push -u origin branch-name
Перевод статьи James Okunlade: The essentials of Git explained in five minutes
Запись изменений в репозиторий. Подготовка к коммиту.
Основы Git
Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.
Рекомендуем перейти в курс Введение в Git
Мы обновили этот курс — добавили новые темы, самостоятельные задания и практические упражнения. Посмотрите этот урок по ссылке: https://ru.hexlet.io/courses/intro_to_git/lessons/workflow/theory_unit
Здравствуйте!
Сегодня мы поговорим про фиксирование ваших изменений в репозитории. Вероятнее всего вы уже догадались, что это одна из самых важны операций в стандартном work-flow. На самом деле, так и есть 🙂
Идеологическое отличее git от других систем контроля версий — это то, что при работе с git — вы только добавляете изменения в репозиторий. Не важно, что вы сделали — написали новую строчку кода, отредактировали существующую, или же, удалили файл — при фиксировании изменений, вы всегда добавляете изменения.
Для того, чтобы зафиксировать изменения — необходимо выбрать то, что нужно сохранить и выполнить коммит. Для выбора нужных изменений из совершенных используется команда git add
. На начальном этапе знакомства многие считают, что это команда означает нечто вроде добавить указанный файл или директорию в репозиторий. Это утверждение отчасти верно. Примерно на 10%. Предназначение этой команды не ограничивается этой функциональностью. Возможности команды git add
настолько обширны, что знакомство с ними мы разобьем на несколько уроков.
Я рекомендую сразу пересмотреть ваше восприятие воздействия этой команды. Выполняя ее, вы подготавливаете конкретные изменения к фиксированию в репозитории. Или, можно сказать, что вы говорите о завершенности каких-либо изменений в репозитории на текущий момент времени.
Все файлы в рабочей директории могут находиться в 2-х состояниях:
- Под контролем системы управления версиями
- Не под контролем системы управления версиями
В случае с новыми файлами — добавление файла под версионный контроль осуществляется командой git add
.
SYNOPSIS
git add [-n] [-v]
[--force | -f]
[--interactive | -i]
[--patch | -p]
[--edit | -e]
[--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N]
[--refresh]
[--ignore-errors]
[--ignore-missing]
[--]
[<pathspec>...]
Описание
Если говорить кратко, то основная задача этой команды — фиксирование состояния рабочей директории для последующего коммита. Коммит выполняется на основании индекса, «индекс» — это снимок содержания рабочей директории, и именно этот snapshot, будет использован при выполнения коммита.
Чтобы было проще понять — можно представить, что при выполнении команды git add
git, как будто, копирует все ваши файлы (по определенным правилам) в рабочем каталоге в какое-то секретное место и, при выполнении команды git commit
будет использовать эту копию данных для вычисления выполненных изменений и создания коммита.
Таким образом, после внесения каких-либо изменений в рабочем каталоге, и перед запуском команды git commit
, вы должны использовать команду git add
, чтобы добавить какие-либо новые или измененные файлы в индекс.
Команда git add
может быть использована многократно перед тем, как будет создан коммит.
Для того, чтобы посмотреть на синтаксис команды git add
выполним команду git --help add
. Результатом выполнения этой команды будет страница помощи.
Хочу обратить внимание на формат команды: git add [some_options] [--] path's
Практически все команды git имеют такой формат.
Рассмотрим поподробнее некоторые опции команды git add
. Я умышленно не буду рассказывать про некоторые особенности этих опций. Вы сможете прочесть о них на странице справки по этой команде.
Опции
<pathspec>
Путь к файлу, файлам или директории с файлами. Поддрерживает glob-шаблоны. В некоторых случаях может опускаться, что означает, что pathspec будет равен текущей директории, из которой была вызвана команда git add
. Однако в последующих версиях эта возможность опускать указание pathspec будет удалена, поэтому лучше взять за привычку всегда указывать pathspec
.
—
Данная опция используется для разделения опций команды и списка файлов. Полезна в случаях, когда названия файлов могут быть ошибочно восприняты, как опция команды.
-u, —update
Команда git add может взаимодействовать с файлами, которые находятся под версионным контролем, и теми, которые не находятся под таковым. Если вы не хотите случайно добавит новый файл под версионный контроль, а просто хотите обновить индекс данными, которые относятся только к файлам, которые на текущий момент уже под версионным контролем — то стоит использовать опцию -u
. При ее использовании все файлы, которые не были ранее добавлены в git репозиторий — будут игнорироваться.
-A, —all, —no-ignore-removal
Если вы хотите добавить в индекс информацию об измененных/новых/удаленных файлах одновременно — вы можете воспользоваться опцией -A
. В будущем эта опция будет использоваться ‘по умолчанию’ при вызове команды git add ...
—no-all, —ignore-removal
В индекс будут добавлены только измененные и новые файлы. Информация об удаленных файлах добавлена не будет. Эта опция используется сейчас по-умолчанию при вызове команды git add
. В будущем, использование данной опции, как опции по-умолчанию будет упразднено в пользу опции -A
Таким образом, если посмотреть на сводную таблицу, становится сразу понятно, когда какую опцию стоит использовать:
Content type | -u | -A | -no-all |
---|---|---|---|
Новый файл | — | + | + |
Измененный файл | + | + | + |
Удаленный файл | + | + | — |
-N, —intent-to-add
Очень полезная в работе опция, которую на практике применяют очень мало пользователей. Суть ее сводится к тому, что вы сообщаете git о намерениях в будущем добавить новый файл под версионный контроль. Если быть честным — то git добавляет этот новый файл под версионный контроль, но с пустым контентом. Таким образом, когда вы выполняете команду git diff
— вы видите изменения, которые могут быть добавлены в индекс. Если файл не отслеживается — у вас такой возможности нет.
-f, —force
Иногда бывает такая ситуация, что файл, который вы хотите добавит в индекс попадает под шаблоны игнорирования, определенные в gitignore файле. Если вы уверены, что вам необходимо добавить файл в индекс, можно либо отредактировать файл gitignore, или воcпользоваться опцией -f.
Следующие опции:
- -n, —dry-run
- -v, —verbose
- —refresh
- —ignore-errors
- —ignore-missing
Я не буду рассматривать в рамках этой лекции. В повседневной работе они вам не пригодятся, если вы не пишете скрипты с использованием git.
А про
git add -p ...
git add -i ...
git add -e ...
мы поговорим в отдельной лекции.
Последнее, что хотелось бы сказать — всегда контролируйте то, что вы добавляете в репозиторий 🙂
На этом мы закончим этот урок. Спасибо за внимание!
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты.
Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?
Выделите текст, нажмите
ctrl + enter
и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Что-то не получается или материал кажется сложным?
Загляните в раздел «Обсуждение»:
- задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
- расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
- изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете
Добавление исходного кода из git-репозиториев / Сборка образов с помощью Stapel / Документация продвинутого уровня / Документация
git:
- add: <absolute path in git repository>
to: <absolute path inside image>
owner: <owner>
group: <group>
includePaths:
- <path or glob relative to path in add>
excludePaths:
- <path or glob relative to path in add>
stageDependencies:
install:
- <path or glob relative to path in add>
beforeSetup:
- <path or glob relative to path in add>
setup:
- <path or glob relative to path in add>
git:
- url: <git repo url>
branch: <branch name>
commit: <commit>
tag: <tag>
add: <absolute path in git repository>
to: <absolute path inside image>
owner: <owner>
group: <group>
includePaths:
- <path or glob relative to path in add>
excludePaths:
- <path or glob relative to path in add>
stageDependencies:
install:
- <path or glob relative to path in add>
beforeSetup:
- <path or glob relative to path in add>
setup:
- <path or glob relative to path in add>
Что такое git mapping?
Git mapping определяет, какой файл или папка из git-репозитория должны быть добавлены в конкретное место образа.
Git-репозиторий может быть как локальным репозиторием, в котором находится файл конфигурации сборки (werf.yaml
), так и удаленным репозиторием.
В этом случае указывается адрес репозитория и версия кода — ветка, тег или конкретный коммит.
werf добавляет файлы из git-репозитория в образ, копируя их с помощью git archive, либо накладывая git-патч.
При повторных сборках и появлении изменений в git-репозитории werf добавляет patch к собранному ранее образу, чтобы в конечном образе отразить изменения файлов и папок. Более подробно механизм переноса файлов и накладывания патчей рассматриваются в следующей секции.
Конфигурация git mapping поддерживает фильтры, что позволяет сформировать практически любую файловую структуру в образе, используя произвольное количество git mappings.
Также вы можете указать группу и владельца конечных файлов в образе, что освобождает от необходимости делать это отдельной командой (chown
).
В werf реализована поддержка сабмодулей git (git submodules) и если werf определяет, что какая-то часть git mapping является сабмодулем, то принимаются соответствующие меры, чтобы обрабатывать изменения в сабмодулях корректно.
Все git-сабмодули проекта связаны с конкретным коммитом, поэтому все разработчики, работающие с репозиторием с сабмодулями, получают одинаковое содержимое
werf не инициализирует и не обновляет сабмодули, а использует соответствующие связанные коммиты
Пример добавления файлов из папки /src
локального git-репозитория в папку /app
собираемого образа и добавления кода PhantomJS из удаленного репозитория в папку /src/phantomjs
собираемого образа:
git:
- add: /src
to: /app
- url: https://github.com/ariya/phantomjs
add: /
to: /src/phantomjs
Зачем использовать git mapping?
Основная идея использования git mapping — добавление истории git к сборочному процессу.
Наложение патчей вместо копирования
Большинство коммитов в репозитории реального приложения относятся к обновлению кода самого приложения. В этом случае, если компиляция приложения не требуется, то для получения нового образа достаточно применить изменения к файлам предыдущего образа.
Удаленные репозитории
Сборка конечного образа может зависеть от файлов в других репозиториях. werf позволяет добавлять файлы из удаленных репозиториев, а также отслеживать изменения в них.
Синтаксис
Для добавления кода из локального git-репозитория используется следующий синтаксис:
add
— (не обязательный параметр) путь к директории или файлу, содержимое которого (которой) нужно добавить в образ. Указывается абсолютный путь относительно корня репозитория, т.е. он должен начинаться с/
. По умолчанию копируется все содержимое репозитория, отсутствие параметраadd
равносильно указаниюadd: /
;to
— путь внутри образа, куда будет скопировано соответствующее содержимое;owner
— имя или id пользователя-владельца файлов в образе;group
— имя или id группы-владельца файлов в образе;excludePaths
— список исключений (маска) при рекурсивном копировании файлов и папок. Указывается относительно пути, указанного вadd
;includePaths
— список масок файлов и папок для рекурсивного копирования. Указывается относительно пути, указанного вadd
;stageDependencies
— список масок файлов и папок для указания зависимости пересборки стадии от их изменений. Позволяет указать, при изменении каких файлов и папок необходимо принудительно пересобирать конкретную пользовательскую стадию. Более подробно рассматривается здесь.
При использовании удаленных репозиториев дополнительно используются следующие параметры:
url
— адрес удаленного репозитория;branch
,tag
,commit
— имя ветки, тега или коммита соответственно. По умолчанию — ветка master.
По умолчанию, использование директивы
branch
запрещено гитерминизмом (подробнее об этом в статье)
We do not recommend using the remote git mapping such way. Use a particular unchangeable reference, tag, or commit to provide controllable and predictable lifecycle of software
Использование git mapping
Копирование директорий
Параметр add
определяет источник, путь в git-репозитории, откуда файлы рекурсивно копируются в образ и помещаются по адресу, указанному в параметре to
. Если параметр не определен, то по умолчанию используется значение /
, т.е. копируется весь репозиторий.
Пример простейшей конфигурации, добавляющей содержимое всего локального git-репозитория в образ в папку /app
.
Также можно указать несколько git mappings:
git:
- add: /src
to: /app/src
- add: /assets
to: /static
Следует отметить, что конфигурация git mapping не похожа, например, на копирование типа cp -r /src /app
.
Параметр add
указывает на содержимое каталога, которое будет рекурсивно копироваться из репозитория.
Поэтому, если папка /assets
со всем содержимым из репозитория должна быть скопирована в папку /app/assets
образа, то имя assets вы должны указать два раза.
Либо, как вариант, вы можете использовать фильтр (например, параметр includePaths
).
Примеры обоих вариантов, которые вы можете использовать для достижения одинакового результата:
git:
- add: /assets
to: /app/assets
либо
git:
- add: /
to: /app
includePaths: assets
В werf нет ограничения или соглашения насчет использования
/
в конце, как, например, в rsync. Т.о.add: /src
иadd: /src/
— одно и тоже
Изменение владельца
При добавлении файла из git-репозитория вы можете указать имя и/или группу владельца файлов в образе.
Добавляемым файлам и папкам в образе при копировании будут установлены соответствующие права.
Пользователь и группа могут быть указаны как именем, так и числовым id (userid, groupid).
Пример использования:
git:
- add: /src/index.php
to: /app/index.php
owner: www-data
Если указан только параметр owner
, как в приведенном примере, то группой-владельцем устанавливается основная группа указанного пользователя в системе.
В результате в папку /app
образа будет добавлен файл index.php
и ему будут установлены следующие права:
Если значения параметра owner
или group
не числовые id, а текстовые (т.е. названия соответственно пользователя и группы), то соответствующие пользователь и группа должны существовать в системе. Их нужно добавить заранее при необходимости (к примеру, на стадии beforeInstall), иначе при сборке возникнет ошибка.
git:
- add: /src/index.php
to: /app/index.php
owner: wwwdata
Использование фильтров
Парамеры фильтров, includePaths
и excludePaths
, используются при составлении списка файлов для добавления.
Эти параметры содержат набор путей или масок, применяемых соответственно для включения и исключения файлов и папок при добавлении в образ.
Фильтр excludePaths
работает следующим образом: каждая маска списка применяется к каждому файлу, найденному по пути add
.
Если файл удовлетворяет хотя бы одной маске, то он исключается из списка файлов на добавление.
Если файл не удовлетворяет ни одной маске, то он добавляется в образ.
Фильтр includePaths
работает наоборот — если файл удовлетворяет хотя бы одной маске, то он добавляется в образ.
Конфигурация git mapping может содержать оба фильтра.
В этом случае файл добавляется в образ, если его путь удовлетворяет хотя бы одной маске includePaths
и не удовлетворяет ни одной маске excludePaths
.
Пример:
git:
- add: /src
to: /app
includePaths:
- '**/*.php'
- '**/*.js'
excludePaths:
- '**/*-dev.*'
- '**/*-test.*'
В приведенном примере добавляются .php
и .js
файлы из папки /src
исключая файлы с суффиксом -dev.
или -test.
в имени файла.
При определении соответствия файла маске применяется следующий алгоритм:
- Определяется абсолютный путь к очередному файлу в репозитории.
- Путь сравнивается с масками, определенными в
includePaths
иexcludePaths
, либо с конкретным указанным путем:- путь в параметре
add
объединяется с маской или указанным путем из параметровincludePaths
иexcludePaths
; - оба варианта проверяются с учетом правил применения глобальных шаблонов: если файл удовлетворяет маске, то он включается, в случае
includePaths
, либо исключается, в случаеexcludePaths
.
- путь в параметре
- Путь сравнивается с масками, определенными в
includePaths
иexcludePaths
, либо с конкретным указанным путем с учетом дополнительных условий:- путь в параметре
add
объединяется с маской или указанным путем из параметровincludePaths
иexcludePaths
и объединяется с суффиксом**/*
к шаблону; - оба варианта проверяются с учетом правил применения глобальных шаблонов: если файл удовлетворяет маске, то он включается, в случае
includePaths
, либо исключается, в случаеexcludePaths
.a-z]. \
— Экранирует следующий символ.
Маска, которая начинается с шаблона
*
или**
, должна быть взята в одинарные или двойные кавычки вwerf.yaml
:"*.rb"
— двойные кавычки'**/*'
— одинарные кавычки
Примеры фильтров:
add: /src to: /app includePaths: # удовлетворяет всем php файлам, расположенным конкретно в папке /src - '*.php' # удовлетворяет всем phph файлам рекурсивно, начиная с папки /src # (также удовлетворяет файлам *.php, т.к. '.' включается шаблон **) - '**/*.php' # удовлетворяет всем файлам в папке /src/module1 рекурсивно - module1
Фильтр
includePaths
может применяться для копирования одного файла без изменения имени. Пример:git: - add: /src to: /app includePaths: index.php
Наложение путей копирования
Если вы определяете несколько git mappings, вы должны учитывать, что при наложении путей в образе в параметре
to
вы можете столкнуться с невозможностью добавления файлов. Пример:git: - add: /src to: /app - add: /assets to: /app/assets
Чтобы избежать ошибок сборки, werf определяет возможные наложения касающиеся фильтров
includePaths
иexcludePaths
, и если такое наложение присутствует, то werf пытается разрешить самые простые конфликты, неявно добавляя соответствующий параметрexcludePaths
в git mapping.
Однако, такое поведение может все-таки привести к неожиданным результатам, поэтому лучше всего избегать наложения путей при определении git mappings.В примере выше, werf в итоге неявно добавит параметр
excludePaths
и итоговая конфигурация будет следующей:git: - add: /src to: /app excludePaths: # werf добавил этот фильтр, чтобы исключить конфликт наложения результирующих путей - assets # между /src/assets и /assets - add: /assets to: /app/assets
Работа с удаленными репозиториями
werf может использовать удаленные репозитории в качестве источника файлов.
Для указания адреса внешнего репозитория используется параметрurl
.
werf поддерживает работу с удаленными репозиториями по протоколамhttps
иgit+ssh
.https
Синтаксис для работы по протоколу
https
:git: - url: https://[USERNAME[:PASSWORD]@]repo_host/repo_path[.git/]
Указание логина и пароля при доступе по
https
опционально.Пример доступа к репозиторию из pipeline GitLab CI с использованием переменных окружения:
git: - url: https://{{ env "CI_REGISTRY_USER" }}:{{ env "CI_JOB_TOKEN" }}@registry.gitlab.company.name/common/helper-utils.git
В приведенном примере используется метод env библиотеки Sprig для доступа к переменным окружения.
git, ssh
Доступ к удаленному репозиторию с помощью протокола git защищается с использованием доступа поверх ssh. Это распространенная практика, используемая в частности GitHub, Bitbucket, GitLab, Gogs, Gitolite и т.д. Обычно адрес репозитория выглядит следующим образом:
git: - url: [email protected]:project_group/project.git
Для работы с удаленными репозиториями по ssh необходимо понимать, как werf находит ssh-ключи (читай далее подробнее).
Работа с ssh-ключами
Ssh-ключи для доступа предоставляются через ssh-agent. Ssh-agent — это демон, который работает через файловый сокет, путь к которому хранится в переменной окружения
SSH_AUTH_SOCK
. werf монтирует этот файловый сокет во все сборочные контейнеры и устанавливает переменную окруженияSSH_AUTH_SOCK
. Т.о. соединение с удаленным git-репозиторием устанавливается с использованием ключей, зарегистрированных в запущенном ssh-агенте.werf использует следующий алгоритм для определения запущенного ssh-агента:
- werf запущен с ключом
--ssh-key
(одним или несколькими):- Запускается временный ssh-агент, в который добавляются указанные при запуске werf ключи. Эти ключи используются при всех операциях с удаленными репозиториями.
- Уже запущенный ssh-агент игнорируется.
- werf запущен без указания ключа
--ssh-key
и есть запущенный ssh-агент:- Используется переменная окружения
SSH_AUTH_SOCK
, ключи добавляются в соответствующий ssh-агент и используются далее при всех операциях работы с удаленными репозиториями.
- Используется переменная окружения
- werf запущен без указания ключа
--ssh-key
и нет запущенного ssh-агента:- Если существует файл
~/.ssh/id_rsa
, запускается временный ssh-агент, в который добавляется ключ из файла~/.ssh/id_rsa
.
- Если существует файл
- Если ни один из вариантов не применим, то ssh-агент не запускается и при операциях с внешними git-репозиториями не используются никакие ssh-ключи. Сборка образа, с объявленными удаленными репозиториями в git mapping, завершится с ошибкой.
Подробнее про gitArchive, gitCache, gitLatestPatch
Далее будет более подробно рассмотрен процесс добавления файлов в конечный образ. Как упоминалось ранее, Docker-образ состоит из набора слоёв. Чтобы понимать, какие слои создает werf, представим последовательную сборку трех коммитов:
1
,2
и3
:- Сборка коммита 1. Исходя из конфигурации git mapping, все соответствующие файлы добавляются в один слой. Сам процесс добавления выполняется с помощью
git archive
. Получившийся слой соответствует стадии gitArchive. - Сборка коммита 2. Накладывается патч с изменениями файлов, в результате чего получается еще один слой. Получившийся слой соответствует стадии gitLatestPatch.
- Сборка коммита 3. Файлы уже добавлены, и werf накладывает патч, обновляя слой gitLatestPatch.
Сборки для этих коммитов можно представить следующим образом:
gitArchive — gitLatestPatch Сделан коммит 1, сборка в 10:00 файлы согласно коммита 1 — — Сделан коммит 2, сборка в 10:05 файлы согласно коммита 1 — файлы согласно коммита 2 Сделан коммит 3, сборка в 10:15 файлы согласно коммита 1 — файлы согласно коммита 3 Пустая колонка между стадиями
gitArchive
иgitLatestPatch
не случайна.
С увеличением числа коммитов размер патча между первым и текущим коммитом будет расти и может стать довольно большим, что увеличит размер последнего слоя и общий размер всех стадий.
Чтобы избежать роста размера стадииgitLatestPatch
, werf использует стадию gitCache.Чтобы проиллюстрировать, как werf работает с этими тремя стадиями и как изменится алгоритм по сравнению с приведенным ранее, возьмем пример работы с семью коммитами. Алгоритм будет следующий:
- Сборка коммита 1. Файлы также добавляются в единый слой исходя из конфигурации git mapping. Процесс добавления выполняется с помощью
git archive
. Получившийся слой соответствует стадии gitArchive. - Сборка коммита 2. Размер патча между коммитами
1
и2
не превышает 1 MiB, поэтому создается один слой стадии gitLatestPatch, содержащий изменения между коммитами1
и2
. - Сборка коммита 3. Размер патча между коммитами
1
и3
не превышает 1 MiB, поэтому слой, соответствующий стадии gitLatestPatch заменяется слоем, содержащим изменения между коммитами1
и3
. - Сборка коммита 4. Размер патча между коммитами
1
и4
превышает 1 MiB. Добавляется слой стадии gitCache, содержащий разность между коммитами1
и4
. - Сборка коммита 5. Размер патча между коммитами
4
и5
не превышает 1 MiB, поэтому создается один слой gitLatestPatch, содержащий разность между коммитами4
и5
.
Описанный алгоритм иллюстрирует, что как только размер патча между gitArchive (gitCache, если существует) и gitLatestPatch превышает 1 MiB, собирается или пересобирается стадия gitCache.
Таким образом, накопленные изменения сохраняются в стадии gitCache, а размер стадии gitLatestPatch никогда не превышает 1 MiB.
Такая логика позволяет сократить общий размер стадий в хранилище.gitArchive gitCache gitLatestPatch Сделан коммит 1, сборка в 12:00 1 — — Сделан коммит 2, сборка в 12:19 1 — 2 Сделан коммит 3, сборка в 12:25 1 — 3 Сделан коммит 4, сборка в 12:45 1 *4 — Сделан коммит 5, сборка в 12:57 1 4 5 * — размер патча для коммита
4
превышает 1 MiB, поэтому на основе патча создается слой для стадии gitCache.Rebase и
git-стадии
Каждая git-стадия хранит служебные лейблы с SHA коммитами, которые использовались при сборки стадии.
Эти коммиты будут использоваться при сборке следующей git-стадии при создании патчей (по сути этоgit diff COMMIT_FROM_PREVIOUS_GIT_STAGE LATEST_COMMIT
для каждого git-mapping).Если в стадии сохранён коммит, который отсутствует в git-репозитории (например, после выполнения rebase), werf пересоберёт эту стадию, используя актуальный коммит.
Ох, твою мать, git!. Осторожно! Нецензурщина | by Workafrolic (±∞)
Git Scared
Git сложный: налажать проще простого, выяснить как исправить свою ошибку практически, бл*ть, невозможно! В документации четко видна проблема курицы и яйца. Вы не можете найти решения для своей проблемы если не знаете заранее названия этой самой проблемы, которую собираетесь исправить.
Поэтому ниже я собрала несколько факапов, в которых оказывалась сама и описала простым языком, как самостоятельно из них выбраться.
Твою налево, я закоммитила и тут же поняла, что нужно внести небольшие изменения!
# внесите изменения
git add .
git commit --amend
# следуйте подсказкам, чтобы изменить или оставить прежний комментарий
# теперь последний коммит содержит наше изменение!Это обычно происходит со мной, если я сливаю в master, а потом запускаю тесты/линтер… и, черт меня побери, я не вставила пробел после знака равенства. Вы, конечно, можете внести изменения, создав новый коммит и затем запустив команду rebase -i чтобы объединить старый и новый коммиты, но мой вариант примерно в миллион раз быстрее.
Жеваный крот, мне нужно изменить комментарий к последнему коммиту!
git commit --amend
# следуйте подсказкам, чтобы изменить комментарийТупые требования к формату комментариев к коммитам.
Черт, я закоммитила что-то в master, а оно должно быть в новой ветке!
# создайте новую ветку из текущего состояния master
git checkout -b имя-новой-ветки # удаляем коммит из ветки master
git checkout master
git reset HEAD~ --hard
git checkout имя-новой-ветки
# ваш коммит теперь живет в новой ветке :)Примечание: это не сработает, если вы уже сделали push в origin. И если вы уже попробовали какие-то другие способы исправления, то может потребоваться сделать git reset HEAD@{число} (сдвигает “голову” на указанное количество коммитов). Бесконечная печаль.
Да блин, я случайно закоммитила не в ту ветку!
# откатываем последний коммит, но не удаляем изменения
git reset HEAD~ --soft
git add .
git stash # переключаемся на нужную ветку
git checkout имя-верной-ветки
git stash pop
git add .
git commit -m "тут ваш комментарий"
# теперь изменения в нужной веткеВот дерьмо, я запускаю diff, но ничего не происходит?!
git diff --staged
Чудно, но git не будет сравнивать файлы, которые были проиндексированы без этого флага. ¯\_(ツ)_/¯
cd ..
sudo rmdir fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.gitБлагодарю @viaz66 за этот пункт.
Основные GIT Команды
GIT
access_time
10 декабря, 2020
hourglass_empty
3мин. чтения
Введение
Когда дело доходит до систем контроля версий, очень немногие могут затмить GIT в актуальности, производительности и распространенности. GIT был разработан Линусом Торвальдсом в 2005 году, и сегодня, миллионы компаний используют его для эффективного управления кодом и контроля над версиями своих проектов. Программное обеспечение с открытым исходным кодом может быть загружено для различных платформ, таких как Linux, Windows, Solaris и Mac; больше информации об основах GIT можно получить здесь. В этом руководстве вы узнаете основные GIT команды.
Все тарифы хостинга от Hostinger включают интеграцию с Github, что позволяет легко публиковать сайты на хостинге непосредственно с репозитория!
К тарифам
Что вам понадобится
Перед тем, как вы начнете это руководство, вам понадобится следующее:
- GIT установленный на вашей системе
Основные GIT команды
Одна из самых часто используемых git команд. Она может быть использована для указания пользовательских настроек, таких как электронная почта, имя пользователя, формат и т.д. К примеру, данная команда используется для установки адреса электронной почты:
git config --global user.email адрес@gmail.com
Эта команда используется для создания GIT репозитория. Пример использования:
git init
Команда git add может быть использована для добавления файлов в индекс. К примеру, следующая команда добавит файл под названием temp.txt присутствующий в локальном каталоге в индекс:
git add temp.txt
Команда git clone используется для клонирования репозитория. Если репозиторий находится на удаленном сервере, используется команда такого рода:
git clone имя.пользователя@хост:/путь/до/репозитория
И наоборот, для клонирования локального репозитория используйте:
git clone /путь/до/репозитория
Команда git commit используется для коммита изменений в файлах проекта. Обратите внимание, что коммиты не сразу попадают на удаленный репозиторий. Применение:
git commit –m “Сообщение идущее вместе с коммитом”
Команда git status отображает список измененных файлов, вместе с файлами, которые еще не были добавлены в индекс или ожидают коммита. Применение:
git status
git push еще одна из часто используемых git команд. Позволяет поместить изменения в главную ветку удаленного хранилища связанного с рабочим каталогом. Например:
git push origin master
Команда git checkout может быть использована для создания веток или переключения между ними. К примеру, следующий код создаст новую ветку и переключится на нее:
command git checkout -b <имя-ветки>
Чтобы просто переключиться между ветками используйте:
git checkout <имя-ветки>
Команда позволяет пользователю подключиться к удаленному репозиторию. Данная команда отобразит список удаленных репозиториев, настроенных в данный момент:
git remote –v
Эта команда позволит пользователю подключить локальный репозиторий к удаленному серверу:
git remote add origin <адрес.удаленного.сервера>
Команда git branch может быть использована для отображения, создания или удаления веток. Для отображения всех существующих веток в репозитории введите:
git branch
Для удаления ветки:
git branch –d <имя-ветки>
Команда pull используется для объединения изменений, присутствующих в удаленном репозитории, в локальный рабочий каталог. Применение:
git pull
Команда git merge используется для объединения ветки в активную ветвь. Применение:
git merge <имя-ветки>
Команда git diff используется для выявления различий между ветками. Для выявления различий с базовыми файлами, используйте
git diff --base <имя-файла>
Следующая команда используется для просмотра различий между ветками, которые должны быть объединены, до их объединения:
git diff <ветвь-источник> <ветвь-цель>
Для простого отображения существующих различий, используйте:
git diff
Используется для маркировки определенных коммитов с помощью простых меток. Примером может быть эта команда:
git tag 1.1.0 <вставьте-commitID-здесь>
Запуск команды git log отобразит список всех коммитов в ветке вместе с соответствующими сведениями. Пример результата:
commit 15f4b6c44b3c8344caasdac9e4be13246e21sadw Author: Alex Hunter <[email protected]> Date: Mon Oct 1 12:56:29 2016 -0600
Команда git reset используется для сброса индекса и рабочего каталога до последнего состояния коммита. Применение:
git reset --hard HEAD
git rm используется для удаления файлов из индекса и рабочего каталога. Применение:
git rm имяфайла.txt
Возможно одна из самых малоизвестных команд git. Она помогает в сохранении изменений на временной основе, эти изменения не попадут в коммит сразу. Применение:
git stash
Для просмотра информации о любом git объекте используйте команду git show. Для примера:
git show
git fetch позволяет пользователю доставить все объекты из удаленного репозитория, которые не присутствуют в локальном рабочем каталоге. Пример применения:
git fetch origin
Команда git ls-tree используется для просмотра дерева объекта вместе с названием, режимом каждого предмета и значением SHA-1. К примеру:
git ls-tree HEAD
Используйте команду git cat-file, чтобы просмотреть тип объекта с помощью SHA-1 значения. Например:
git cat-file –p d670460b4b4aece5915caf5c68d12f560a9fe3e4
git grep позволяет пользователю проводить поиск фраз и слов в содержимом деревьев. К примеру, для поиска www.hostinger.ru во всех файлах используйте эту команду:
git grep "www.hostinger.ru"
gitk — это графический интерфейс локального репозитория. Вызвать его можно выполнив данную команду:
gitk
С помощью команды git instaweb можно запустить веб-сервер, связанный с локальным репозиторием. Браузер также автоматически будет перенаправляться на него. Например:
git instaweb –httpd=webrick
Для оптимизации репозитория используйте команду git gc. Она поможет удалить и оптимизировать ненужные файлы:
git gc
Команда git archive позволяет пользователю создать .zip или .tar файл содержащий компоненты одного из деревьев репозитория. Например:
git archive --format=tar master
С помощью команды git prune удаляются объекты, не имеющие никаких входящих указателей. Применение:
git prune
Чтобы выполнить проверку целостности файловой системы git, используйте команду git fsck, при этом будут идентифицированы все поврежденные объекты:
git fsck
Команда git rebase используется для применения коммитов в другой ветке. Например:
git rebase master
Заключение
В данном руководстве вы узнали основные GIT команды и познакомились с примерами их использования. Обязательно посетите наше руководство об основах GIT для ознакомления с его настройкой и использованием.
#2 — Добавление файлов в репозиторий
В ходе урока вы познакомитесь с добавлением файлов в локальный репозиторий проекта. Вы изучите такие команды, как: git add, git commit, git status, а также познакомитесь с игнорированием файлов при помощи .gitignore файла.
Для добавления файлов в локальное хранилище в Git используется несколько команд:
git add
— добавление файлов в стадию ожидания;git commit
— добавление файлов в локальное хранилище;git rm
— отмена действий.
Получение статуса
Для отслеживания статуса всех файлов необходимо использовать команду
git status
.Это одна из важнейших команд, так как система отслеживает изменения, а с ее помощью мы узнаем о результатах этого отслеживания. Если мы наберем git status в терминале, то система должна выдать следующее:
$ git status On branch master Initial commit Untracked files: (use "git add ..." to include in what will be committed) hello.txt
Добавление файлов
Перед добавлением файлов в локальное хранилище их необходимо подготовить. Для этого используется команда
git add
.Через команду можно указать какие файлы необходимо добавить. Можно добавить всё, прописав
git add .
илиgit add -A
, а также можно добавлять лишь некоторые файлы. Для их выбора можно воспользоваться различными командами:Коммит
После подготовки файлов их необходимо отправить в локальное хранилище (выполнить коммит). Для этого используется команда
git commit -m "Комментари"
.При коммите данных их необходимо комментировать, чтобы в дальнейшем каждое изменение в проекте было с комментарием (описанием действий).
Отмена действий
Если вы добавили файлы в стадию ожидания, но передумали и не хотите добавлять некоторые из них, то вам пригодиться команда
git rm -cached "file"
.В ней укажите какой файл необходимо «выкинуть» из стадии ожидания на коммит.
Игнорирование файлов
Git имеет встроенную функцию .gitignore, с помощью которой мы можем предотвратить случайное попадание в git add ненужных файлов, папок и директорий. Очень часто в такой перечень попадают следующие данные:
- Логи;
- Артефакты систем сборки;
- Папки node_modules в проектах node.js;
- Папки, созданные IDE, например, Netbeans или IntelliJ;
- Разнообразные заметки разработчика.
Работает функция
.gitignore
очень просто:- Создаем вручную файл под названием .gitignore и сохраняем его в директорию проекта.
- Внутри файла перечисляем названия файлов/папок, которые нужно игнорировать, каждое с новой строки.
- Файл .gitignore добавляем, коммитим и отправляем на сервер, как любой другой файл в проекте. Пример исключения перечисленных выше файлов выглядит так:
*.log build/ node_modules/ .idea/ my_notes.txt
Слэш обозначает игнорирование директорий и всего их содержимого, звездочка – шаблон.
Сохранение изменений | Учебник Atlassian Git
При работе в Git или других системах контроля версий концепция «сохранения» представляет собой более тонкий процесс, чем сохранение в текстовом процессоре или других традиционных приложениях для редактирования файлов. Традиционное программное выражение «сохранение» является синонимом термина Git «фиксация». Коммит — это Git-эквивалент «сохранения». Традиционное сохранение следует рассматривать как операцию файловой системы, которая используется для перезаписи существующего файла или записи нового файла.В качестве альтернативы фиксация Git — это операция, которая воздействует на набор файлов и каталогов.
Сохранение изменений в Git и SVN — это тоже другой процесс. SVN Commits или «check-ins» — это операции, которые осуществляют удаленную отправку на централизованный сервер. Это означает, что для фиксации SVN требуется доступ в Интернет, чтобы полностью «сохранить» изменения проекта. Коммиты Git могут быть захвачены и созданы локально, а затем при необходимости отправлены на удаленный сервер с помощью команды
git push -u origin master
.Разница между этими двумя методами заключается в фундаментальном различии архитектурных проектов. Git — это модель распределенного приложения, тогда как SVN — это централизованная модель. Распределенные приложения обычно более надежны, поскольку у них нет единой точки отказа, как у централизованного сервера.Команды:
git add
,git status
иgit commit
используются в комбинации для сохранения снимка текущего состояния проекта Git.Git имеет дополнительный механизм сохранения, называемый «тайник».Тайник — это временное хранилище изменений, которые еще не готовы к фиксации. Тайник работает с рабочим каталогом, первым из трех деревьев, и имеет обширные возможности использования. Чтобы узнать больше, посетите страницу
git stash
.Репозиторий Git можно настроить так, чтобы он игнорировал определенные файлы или каталоги. Это предотвратит сохранение Git изменений в любом игнорируемом содержимом. В Git есть несколько методов настройки, которые управляют списком игнорирования. Настройка игнорирования Git обсуждается более подробно на странице
git ignore
.git добавить
Команда
git add
добавляет изменение рабочего каталога в промежуточную область. Он сообщает Git, что вы хотите включить обновления определенного файла в следующую фиксацию. Однакоgit add
на самом деле никак не влияет на репозиторий — изменения фактически не записываются, пока вы не запуститеgit commit
.В сочетании с этими командами вам также понадобится
git status
для просмотра состояния рабочего каталога и промежуточной области.Как это работает
Команды
git add
иgit commit
составляют основной рабочий процесс Git. Это две команды, которые должен понимать каждый пользователь Git, независимо от модели совместной работы его команды. Они являются средством записи версий проекта в историю репозитория.Разработка проекта вращается вокруг базового шаблона редактирования / стадии / фиксации. Сначала вы редактируете свои файлы в рабочем каталоге. Когда вы готовы сохранить копию текущего состояния проекта, вы вносите изменения с помощью
git add
.После того, как вы довольны поэтапным снимком, вы фиксируете его в истории проекта с помощьюgit commit
. Командаgit reset
используется для отмены фиксации или поэтапного снимка.Помимо
git add
иgit commit
, для полноценного совместного рабочего процесса Git необходима третья командаgit push
.git push
используется для отправки зафиксированных изменений в удаленные репозитории для совместной работы. Это позволяет другим членам команды получить доступ к набору сохраненных изменений.Команду
git add
не следует путать с командойsvn add
, которая добавляет файл в репозиторий. Вместо этогоgit add
работает на более абстрактном уровне изменений. Это означает, чтоgit add
нужно вызывать каждый раз, когда вы изменяете файл, тогда какsvn add
нужно вызывать только один раз для каждого файла. Это может показаться излишним, но такой рабочий процесс значительно упрощает организацию проекта.плацдарм
Основная функция команды
git add
— продвигать ожидающие изменения в рабочем каталоге в областьgit staging
.Промежуточная область — одна из наиболее уникальных функций Git, и может потребоваться некоторое время, чтобы осмыслить ее, если вы работаете с SVN (или даже Mercurial) фоном. Это помогает думать об этом как о буфере между рабочим каталогом и историей проекта. Промежуточная область считается одним из «трех деревьев» Git, наряду с рабочим каталогом и историей фиксации.Вместо того, чтобы фиксировать все изменения, которые вы внесли с момента последней фиксации, этап позволяет вам сгруппировать связанные изменения в сфокусированные моментальные снимки перед фактической фиксацией их в истории проекта.Это означает, что вы можете вносить всевозможные изменения в несвязанные файлы, а затем возвращаться и разбивать их на логические коммиты, добавляя связанные изменения на сцену и фиксируя их по частям. Как и в любой системе контроля версий, важно создавать атомарные коммиты, чтобы было легко отслеживать ошибки и отменять изменения с минимальным влиянием на остальную часть проекта.
Общие опции
git добавить
Поместите все изменения в
файл>
для следующей фиксации.git добавить
Поместите все изменения в каталог
>
для следующей фиксации.git add -p
Начните интерактивный промежуточный сеанс, который позволяет вам выбирать части файла для добавления в следующую фиксацию. Это представит вам фрагмент изменений и предложит вам ввести команду. Используйте
y
для обработки фрагмента,n
для игнорирования фрагмента,s
для разделения его на более мелкие фрагменты,e
для редактирования фрагмента вручную иq
для выхода.Примеры
Когда вы начинаете новый проект,
git add
выполняет ту же функцию, что иsvn import
. Чтобы создать начальную фиксацию текущего каталога, используйте следующие две команды:git add. git совершить
После того, как ваш проект будет запущен, можно добавить новые файлы, указав путь к
git add
:git добавить hello.py git commit
Вышеупомянутые команды также могут использоваться для записи изменений в существующие файлы.Опять же, Git не делает различий между промежуточными изменениями в новых файлах и изменениями в файлах, которые уже были добавлены в репозиторий.
Сводка
Итак,
git add
— первая команда в цепочке операций, которая предписывает Git «сохранить» моментальный снимок текущего состояния проекта в истории коммитов. При самостоятельном использованииgit add
будет продвигать ожидающие изменения из рабочего каталога в промежуточную область. Командаgit status
используется для проверки текущего состояния репозитория и может использоваться для подтверждения продвиженияgit add
.Командаgit reset
используется для отмены действияgit add
. Затем используется командаgit commit
для фиксации снимка промежуточного каталога в истории фиксации репозиториев.git add — Добавление изменений в область подготовки
Команда «добавить» отмечает изменения, которые будут включены в следующую фиксацию.
Он добавляет изменения в «Промежуточную область» Git, содержимое которой затем может быть заключено в новую ревизию с помощью команды «git commit».
Важные параметры
<путь к файлу>
Задает файлы, которые нужно добавить в промежуточную область. Обратите внимание, что вы можете ввести , несколько путей к файлам , а также пути к каталогам (последний затем добавит все изменения в этом каталоге в промежуточную область).
— все
Добавляет все изменения в Staging Area. Сюда входят измененные файлы, удаленные файлы и новые файлы — в любом месте каталога проекта.
-u
Добавляет все изменения в существующие файлы в область подготовки. Сюда входят измененные файлы и удаленные файлы, но не новые файлы, которые в настоящее время не отслеживаются Git.
Шпаргалка по Git
Не нужно запоминать все эти команды и параметры: получите нашу популярную «Шпаргалку по Git» — бесплатно!
Примеры использования
Вы можете указать один или несколько путей и, таким образом, добавить изменения в эти файлы в область подготовки:
git добавить index.html error.html
Эти изменения будут частью следующего коммита.
Если вы хотите, чтобы все текущие модификации в вашем проекте были добавлены в область подготовки (включая удаления и новые файлы), вы можете просто использовать «—all» или «-A»:
git add - все
Наконечник
Промежуточные фрагменты или строки ваших изменений
Используя клиент Tower Git, вы можете легко выбрать точные фрагменты и строки , которые вы хотите добавить в следующую фиксацию.
Попробуйте бесплатно в течение 30 дней и узнайте, почему 100 000 разработчиков по всему миру используют Tower , чтобы работать с Git более продуктивно!
Узнать больше
git add — разница между git add -A и git add.
Этот ответ применим только к Git версии 1.x . Для Git версии 2.x см. Другие ответы.
Резюме:
git add -A
stage все измененияgit add.
размещает новые файлы и модификации, — без удалений, (в текущем каталоге и его подкаталогах).git add -u
этапов модификации и удаления, без новых файлов
Деталь:
git add -A
эквивалентноgit add .; git add -u
.Важный момент про
git add.
заключается в том, что он смотрит на рабочее дерево и добавляет все эти пути к поэтапным изменениям, если они либо изменены, либо являются новыми и не игнорируются, он не выполняет никаких действий «rm».git add -u
просматривает все уже отслеженных файлов и вносит изменения в эти файлы, если они отличаются или были удалены. Он не добавляет никаких новых файлов, он только вносит изменения в уже отслеженные файлы.git add -A
— удобный ярлык для выполнения обоих этих действий.Вы можете проверить различия с помощью чего-то вроде этого (обратите внимание, что для Git версии 2.x ваш результат для
git add.
git status
будет отличаться от ):git init эхо Измени меня> измени меня эхо Удалить меня> удалить меня git добавить изменить меня удалить меня git commit -m начальный эхо ОК >> измени меня rm delete-me echo Добавить меня> добавить меня git статус # Изменено, но не обновлено: # изменено: измени-меня # удалено: delete-me # Не отслеживаемые файлы: # Добавь меня git add.git статус # Изменения, которые необходимо зафиксировать: # новый файл: add-me # изменено: измени-меня # Изменено, но не обновлено: # удалено: delete-me git сбросить git add -u git статус # Изменения, которые необходимо зафиксировать: # изменено: измени-меня # удалено: delete-me # Не отслеживаемые файлы: # Добавь меня git сбросить git add -A git статус # Изменения, которые необходимо зафиксировать: # новый файл: add-me # изменено: измени-меня # удалено: delete-me
Git Добавить | W3Docs Online Git Tutorial
- Принципы работы
- Промежуточная область
- Общие параметры
- Примеры git add
- Интерактивный режим
- Редактирование патчей
Описание¶
- команда git добавляет изменения в рабочий каталог в область подготовки.С помощью этой команды вы сообщаете Git, что хотите добавить обновления к определенному файлу в следующем коммите. Но для того, чтобы записывать изменения, вам также нужно запустить git commit. В сочетании с командами, упомянутыми выше, команда git status также необходима, чтобы увидеть, в каком состоянии находятся рабочий каталог и промежуточная область.
Принципы работы
git add вместе с git commit используются для записи версии проекта в историю репозитория.Их необходимо знать каждому пользователю Git, поскольку они составляют основу рабочего процесса Git.
При разработке проекта вы сначала редактируете файлы в рабочем каталоге, а затем, когда копия текущего состояния готова к сохранению, вам необходимо выполнить изменения, что делается с помощью команды git add . Команду git add следует вызывать каждый раз при изменении файла.
Промежуточная область
Основная роль команды git add заключается в продвижении изменений в рабочем каталоге в промежуточную область git.Промежуточная область Git - одна из его самых особых характеристик, которая позволяет собирать все связанные изменения в сфокусированные снимки. Только после этого вы можете зафиксировать эти изменения в истории вашего проекта.
Общие параметры
- Помещение изменений в <файл> для следующей фиксации:
- Размещение всех изменений в <каталог> для следующей фиксации.
Примеры
git add
Команды git add и git commit используются для создания начальной фиксации текущего каталога, а также для записи изменений в существующие файлы.
После запуска проекта вы можете добавлять новые файлы, передав путь к git add .
Интерактивный режим
Интерактивный промежуточный сеанс позволяет вам выбирать части файла для добавления в следующую фиксацию. Вам будет предложен фрагмент изменений и предложено ввести команду. Доступны следующие варианты:
- y - постановка фрагмента
- n - не постановка фрагмента
- q - выйти; не размещать фрагмент или любой оставшийся
- a - размещать фрагмент со всеми последующими фрагментами в файле
- d - не размещать фрагмент или любой более поздний фрагмент в файле
- g - выбор фрагмента для перехода к
- / - поиск фрагмента, который соответствует заданному регулярному выражению
- j - оставление фрагмента нерешенным, проверка следующего фрагмента не определившегося
- J - оставление фрагмента нерешенным, проверка следующего фрагмента
- k - оставление нерешенного фрагмента, проверка предыдущего нерешенного фрагмента
- K - оставление фрагмента нерешенным, проверка предыдущего фрагмента
- s - разделение текущего фрагмента на более мелкие
- e - вручную редактировать текущий кусок
- ? - справка по печати
Редактирование патчей
Вызов git add -e или выбор e в интерактивном селекторе фрагментов открывает патч в редакторе; после выхода из редактора вывод применяется к индексу.В патч вносятся произвольные изменения, но некоторые изменения могут иметь сложный вывод или даже вывод в патче, который неприменим. Если вы хотите полностью отказаться от операции, просто удалите все строки патча. Вот некоторые общие вещи, которые вы можете увидеть в патче, и какие операции редактирования имеют для них смысл.
Строки, начинающиеся с «+», представляют добавленного содержимого . Вы можете удалить их, чтобы предотвратить добавление дополнительных строк.
Строки, начинающиеся с «-», представляют удаленного содержимого .Чтобы предотвратить их поэтапное удаление, вы можете преобразовать «-» в «» (пробел).
Измененное содержимое показано строками «-» (удаление старого содержимого), за которыми следуют строки «+» (добавление содержимого замены). Чтобы предотвратить постановку модификации, вы можете преобразовать строки «-» в «» и удалить строки «+». Обратите внимание, что изменение только половины пары может вызвать запутанные изменения индекса.
Как отменить Git Add
Чтобы отменить
git add
перед фиксацией, запуститеgit reset
илиgit reset
, чтобы отключить все изменения.В более старых версиях Git команды были
git reset HEAD <файл>
иgit reset HEAD
соответственно. Это было изменено в Git 1.8.2Вы можете узнать больше о других часто используемых действиях Git в этих полезных статьях:
Вот немного дополнительной справочной информации о Git
Понимание трех частей проекта Git
A Проект Git будет иметь следующие три основных раздела:
- Каталог Git
- Рабочий каталог (или рабочее дерево)
- Промежуточная область
Каталог Git (находится в
YOUR-PROJECT-PATH /.git /
) - это место, где Git хранит все необходимое для точного отслеживания проекта. Сюда входят метаданные и база данных объектов, которая включает сжатые версии файлов проекта.Рабочий каталог - это место, где пользователь вносит локальные изменения в проект. Рабочий каталог извлекает файлы проекта из объектной базы данных каталога Git и помещает их на локальный компьютер пользователя.
Промежуточная область - это файл (также называемый «индексом», «этапом» или «кешем»), в котором хранится информация о том, что войдет в вашу следующую фиксацию.Фиксация - это когда вы говорите Git сохранить эти поэтапные изменения. Git делает снимок файлов в том виде, в каком они есть, и постоянно сохраняет этот снимок в каталоге Git.
При наличии трех разделов существует три основных состояния, в которых файл может находиться в любой момент времени: зафиксирован, изменен или размещен. Вы модифицируете файл каждый раз, когда вносите в него изменения в своем рабочем каталоге. Затем это , , когда вы перемещаете его в промежуточную область. Наконец, совершено после коммита.
Установить Git
Настроить среду Git
Git имеет инструмент
git config
, который позволяет настраивать среду Git. Вы можете изменить внешний вид и функции Git, установив определенные переменные конфигурации. Запустите эти команды из интерфейса командной строки на вашем компьютере (терминал в Mac, командная строка или Powershell в Windows).Существует три уровня хранения этих переменных конфигурации:
- Система: находится в
/ etc / gitconfig
, применяет настройки по умолчанию к каждому пользователю компьютера.Чтобы внести изменения в этот файл, используйте параметр--system
с командойgit config
. - Пользователь: расположен в
~ / .gitconfig
или~ / .config / git / config
, применяет настройки к одному пользователю. Чтобы внести изменения в этот файл, используйте параметр--global
с командойgit config
. - Проект: расположен в
YOUR-PROJECT-PATH / .git / config
, применяет настройки только к проекту. Чтобы внести изменения в этот файл, используйте командуgit config
.
Если есть настройки, которые конфликтуют друг с другом, конфигурации уровня проекта переопределят конфигурации уровня пользователя, а конфигурации уровня пользователя переопределят конфигурации уровня системы.
Примечание для пользователей Windows: Git ищет файл конфигурации на уровне пользователя (
.gitconfig
) в вашем каталоге$ HOME
(C: \ Users \ $ USER
). Git также ищет/ etc / gitconfig
, хотя он относится к корневому каталогу MSys, который находится там, где вы решите установить Git в своей системе Windows при запуске установщика.Если вы используете версию 2.x или более позднюю версию Git для Windows, существует также файл конфигурации на уровне системы вC: \ Documents and Settings \ All Users \ Application Data \ Git \ config
в Windows XP и в. C: \ ProgramData \ Git \ config
в Windows Vista и новее. Этот файл конфигурации может быть изменен толькоgit config -f FILE
в качестве администратора.Добавьте свое имя и адрес электронной почты
Git включает имя пользователя и адрес электронной почты как часть информации в коммите. Вам нужно настроить это в файле конфигурации на уровне пользователя с помощью следующих команд:
git config --global user.имя "Мое имя" git config --global user.email "[email protected]"
Изменить текстовый редактор
Git автоматически использует текстовый редактор по умолчанию, но вы можете это изменить. Вот пример использования вместо этого редактора Atom (параметр
--wait
указывает оболочке дождаться текстового редактора, чтобы вы могли выполнять свою работу в нем до того, как программа продолжит работу):git config --global core .editor "atom --wait"
Добавить цвет в вывод Git
Вы можете настроить оболочку для добавления цвета в вывод Git с помощью этой команды:
git config --global color.ui true
Чтобы просмотреть все параметры конфигурации, используйте команду
git config --list
.Инициализировать Git в проекте
После того, как Git установлен и настроен на вашем компьютере, вам необходимо инициализировать его в своем проекте, чтобы начать использовать его возможности контроля версий. В командной строке используйте команду
cd
, чтобы перейти к папке верхнего уровня (или корневой) для вашего проекта. Затем запустите командуgit init
. В результате будет установлена папка каталога Git со всеми файлами и объектами, которые необходимы Git для отслеживания вашего проекта.Важно, чтобы каталог Git был установлен в корневой папке проекта. Git может отслеживать файлы во вложенных папках, но не отслеживает файлы, расположенные в родительской папке относительно каталога Git.
Получить справку в Git
Если вы забыли, как работает какая-либо команда в Git, вы можете получить доступ к справке Git из командной строки несколькими способами:
git help КОМАНДА git КОМАНДА --help man git-COMMAND
Отображает страницу руководства для команды в окне оболочки.Для навигации используйте клавиши со стрелками вверх и вниз или используйте следующие сочетания клавиш:
- f или пробел для перехода на следующую страницу
- b для перехода на предыдущую страницу
- q для выхода
Добавить все файлы в репозиторий
Если вы хотите, чтобы Git отслеживал файл в репозитории, вы должны явно добавить его в репозиторий, что может стать немного громоздким, если у вас много файлов. Другой вариант - добавить / разместить все файлы в репо, что намного быстрее. В общем, - это , лучше всего вручную добавлять каждый, чтобы избежать промежуточных файлов, которые вам не нужны, но если вы знаете, что делаете, это может сэкономить время.
Как и все в Git, это можно сделать несколькими способами. Доступное поведение и параметры также меняются в зависимости от версии Git, которую вы используете, поэтому в этой статье мы сосредоточимся на Git 2.x, который должен быть установлен на большинстве компьютеров.
Сгруппировать все файлы
С помощью этой команды будут размещены все файлы в вашем репозитории, включая все новых , измененных и удаленных файлов. Команда выглядит следующим образом:
$ git add -A
Параметр
-A
является сокращением для- все
.Другой способ сделать это - опустить опцию
-A
и просто указать период для обозначения всех файлов в текущем рабочем каталоге:$ git add.
Примечание : команда
git add.
размещает файлы только в текущем каталоге , а - не в подкаталогах , тогда какgit add -A
также помещает файлы в подкаталоги.Сгруппировать все новые и измененные файлы
Предыдущие команды также удаляют файл из вашего репозитория, если он больше не существует в проекте.Если в вашем случае это нежелательное поведение, вам следует использовать параметр
--ignore-remove
, который будет обрабатывать только новые и измененные файлы:$ git add --ignore-remove.
Поместить все измененные и удаленные файлы
Другой вариант этой команды будет заключаться в том, чтобы обрабатывать только измененные и удаленные файлы, но не новые файлы. Для многих существующих проектов это на самом деле более безопасная команда, чем другие, поскольку она влияет только на файлы, уже отслеживаемые репозиторием, и не будет добавлять другие, если вы специально не укажете это.
Это поведение достигается с помощью флага
-u
, который является сокращением для параметра--update
:$ git add -u
Добавление файлов по шаблону
Хотя технически это не добавляет всех файлов , это еще один способ добавить пакет файлов. Git позволяет добавлять сразу несколько файлов с помощью шаблонов подстановки.
Так, например, если вы хотите добавить все файлы Python из текущего каталога в репозиторий, вы должны использовать такую команду:
$ git add *.ру
Хотя у большинства проектов есть подкаталоги, и в этом случае вам придется запускать эту команду для каждого из них, чтобы добавить все ваши файлы Python. Но есть способ быстрее. Вместо этого вы можете использовать синтаксис
**
, который соответствует всем подкаталогам.Итак, в другом примере, эта команда добавит все файлы JavaScript, включая те, что находятся в подкаталогах:
$ git add ** / *. Js
git add --patch и --interactive
Одна из вещей, которая в значительной степени уникальна для Git, - это индекс (также известный как кеш или промежуточная область).
Индекс - это место, где вы готовите следующую фиксацию. В других системах всякий раз, когда вы делаете фиксацию, все изменения, которые вы внесли в свою рабочую копию, фиксируются.
Примечание. В зависимости от вашей версии git вывод может немного отличаться. Сейчас я использую Git 1.6.0.4.766.g6fc4a.
git add - патч
С другой стороны, с помощью Git вы сначала добавляете все изменения, которые хотите внести в следующую фиксацию, в индекс с помощью
git add
(или удаляете файл с помощьюgit rm
).Обычно вызовgit add
добавляет все изменения в этом файле в индекс, ноadd
поддерживает интересный вариант:--patch
или-p
для краткости. Я использую эту опцию так часто, что добавил псевдоним git для облегчения доступа:git config alias.ap "add --patch"
.Когда вы передаете эту опцию для добавления, вместо того, чтобы сразу добавлять все изменения файла в индекс, он проходит через каждое изменение и спрашивает вас, что вы хотите сделать, и выглядит так:
@@ -24,7 +32,12 @@ модуль CoreMIDI ] функции.каждый do | func | - attach_function * func + начать + attach_function * func + исключение спасения => e + $ stderr.puts "Не удалось прикрепить функцию # {func.first}" + поднять + конец конец def midi_read_proc () Поставьте этот кусок [y / n / a / d / K / j / J / e /?]?
Вверху находится некоторая информация о различиях о текущей позиции в файле, за которой следует фактическая разница в исходном коде (называемая «кусок»), а ниже - ваши доступные параметры. Нажать
?
даст вам краткое объяснение каждого из них, но я использую чаще всего:-
y
- Y es, добавить этот кусок -
n
- N o, не добавлять этот фрагмент -
d
- N o, не добавляйте этот фрагмент и все остальные оставшиеся фрагменты.Полезно, если вы уже добавили то, что хотите, и хотите пропустить остальное -
s
- S разбивает кусок на более мелкие фрагменты. Это работает, только если между изменениями в отображаемом фрагменте есть неизменные линии, поэтому это не повлияет на пример выше -
e
- Вручную e dit hunk. Это, наверное, самый мощный вариант. Как и было обещано, он откроет кусок в текстовом редакторе, и вы сможете редактировать его, как вам нравится
.
Ручное редактирование фрагмента - это очень мощно, но также немного сложно, если вы никогда этого раньше не делали.Самая важная вещь, о которой следует помнить: разница всегда имеет отступ одним символом в дополнение к любому другому отступу. Символ может быть либо пробелом (обозначает неизмененную строку), либо
–
, указывающим, что строка была удалена, либо+
, указывающим, что строка была добавлена. Ничего больше. Это должен быть пробел,–
или+
. Что-нибудь еще, и вы получите ошибки (нет символа для измененной строки, поскольку они обрабатываются путем удаления старой строки и добавления измененной строки как новой).Поскольку у вас есть открытая разница в вашем любимом текстовом редакторе (вы ведь настроили Git для использования вашего любимого текстового редактора, не так ли?), Вы можете делать все, что захотите, при условии, что вы убедитесь, что полученная разница применяется чисто.
И в этом вся хитрость. Если вы никогда не делали этого раньше, Git сообщит вам: «Ваш отредактированный кусок не применяется. Снова редактировать? " так часто вы начинаете ненавидеть себя за свою неспособность понять это, даже если это кажется таким простым (или Git, потому что он не может понять, чего вы хотите).
Одна вещь, которая очень часто сбивала меня с толку, заключалась в том, что я забыл об отступе на один символ. Я бы отметил строку с
-
, которую нужно удалить, но в большинстве текстовых редакторов, которые вставляют-
, он не перезаписывает пространство, которое было раньше. Это означает, что вы добавляете дополнительный пробел ко всей строке, что, в свою очередь, означает, что алгоритм сравнения не может найти / сопоставить строку в исходном файле, что, в свою очередь, означает, что Git будет кричать на вас.Другое дело, что разница еще должна иметь смысл.«Смысл» означает, что его можно наносить чисто. То, как вы создаете разумную разницу, кажется чем-то вроде темного искусства (по крайней мере, для меня сейчас), но вы всегда должны помнить, как выглядел исходный файл, а затем планировать свои
-
s и+
с соответственно. Если вы будете редактировать свои фрагменты достаточно часто, то со временем научитесь.И если вы решите, что не хотите редактировать блок, просто удалите все в файле, сохраните и закройте его. Затем Git прервет процесс редактирования и оставит фрагмент без изменений, вернув вас к стандартному выбору.
git add - интерактивный
- интерактивный
(или-i
) является старшим братом- патч
.--patch
позволяет вам определять только отдельные блоки в файлах.- интерактивный
переходит в интерактивный режим, он немного мощнее. Настолько мощный, что у него есть собственное маленькое подменю:*** Команды *** 1: [s] статус 2: [u] дата 3: [r] evert 4: [a] dd не отслеживается 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Что сейчас>
Интерактивный режим разработан, чтобы упростить просмотр и управление изменениями во всем репозитории.Хотя вы можете ограничить его набором файлов, я обычно использую его, когда есть много различных изменений, разбросанных по всему репозиторию.
Использовать его довольно просто. Нажмите цифру или символ в квадратных скобках команды, которую вы хотите выполнить.
-
status
дает вам вывод состояния, показывая вам, сколько добавленных и удаленных строк есть в каждом файле (разделенных между поэтапными и неустановленными изменениями) - Обновление
-
revert
позволяет отключить изменения из индекса, снова работая со всеми файлами -
добавить неотслеживаемые
позволяет (как вы уже догадались) добавлять неотслеживаемые файлы - Патч
- патч
-
diff
показывает разницу между индексом и HEAD
quit
andhelp
работает точно так, как рекламируется.Каждая из команд позволяет вам выбрать, над какими файлами вы хотите работать. Вы можете выбрать несколько файлов, введя их номера (или символы в квадратных скобках) и нажав клавишу ВВОД. Вы можете ввести сразу несколько цифр / символов, разделенных пробелами, или добавить их по отдельности. Выбранные файлы помечаются цифрой
*
перед их строкой.Оставьте строку пустой и нажмите Enter, чтобы сообщить Git, что все готово, и он перейдет к следующему этапу, если есть один
Заключение
Обе эти опции позволяют вам создать фиксацию, которая представляет собой логическое изменение, даже если у вас есть много других изменений.
Это действительно здорово для меня, так как позволяет мне писать столько кода, сколько я хочу, не забывая заранее фиксировать каждое изменение отдельно, таким образом не прерывая мой поток. После этого я легко могу разделить все изменения и по-прежнему придерживаться своей политики «одна фиксация для каждого логического изменения».
.
- путь в параметре