#4 Git — Добавление файлов
В этом видео мы научимся добавлять файлы под контроль Git.
Ранее мы создали файл .gitignore и указали какие файлы будем игнорировать.
И так как у нас это первое добавление то нам надо осуществить так сказать массовое добавление
файлов под контроль Git.
Для того чтобы добавить все untracked файлы выполним следующую команду:
Посмотрев статус репозитория командой git status мы увидим что файлы ранее имеющие красный цвет — untracked
поменяли свой цвет на зеленый, то есть теперь Git знает что надо следить за этими файлами, но их слепок, то есть их
текущее состояние еще не было добавленно в Git, не был сделан commit.
Сделать сейчас commit будет слишком простой задачей и предположим что один или более файлов мы забыли
поместить в список игнорируемых и сейчас нам надо убрать их из под надзора Git.
С помощью данной команды мы удаляем определенный файл из под присмотра Git.
То есть это файл не попадет в наш следующий commit
Итак, у нас есть группа файлов которые игнорируются и не попадут в коммит и есть untracked файл который так же не попадет в наш коммит. Теперь сохраним текущее состояние нашего проекта.
git commit -a -m»init»
-a — все измененные файлы поместить в индекс и сразу делаем commit
-m — комментарий для коммита
После выполнения даной команды так называемый слепок текущего состояния файлов попадает в репозиторий
и в последствии вы сможет откатить проект до текущего состояния в случае необходимости.
- ← #3 Git — Игнорирование файлов
- #5 Git — Коммиты, индексы, добавления →
В чем разница между git add ., add -A, add -u и add *?
Есть разные способы добавить все измененные файлы в индекс репозитория Git. В чем разница и зачем столько способов?
git add . git add * git add -u git add -A git add --all git add --no-all
Отслеживать
Nick Volynkin
задан 25 июн 2015 в 3:38
Nick Volynkin ♦ Nick Volynkin
34k 25 25 золотых знаков 130 130 серебряных знаков 222 222 бронзовых знака
ассоциация: stackoverflow.com/questions/572549/…
– user181100
25 фев 2017 в 16:36
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Давайте обозначим категории файлов, которые вообще можно добавлять. Будем использовать те же обозначения, что и в выводе команды git status -s :
M — (modified) отслеживаемые, изменились с прошлого коммита, еще не добавлены
D — (deleted) отслеживаемые, удалены после прошлого коммита, еще не добавлены
? — (untracked) неотслеживаемые, не запрещены к добавлению
! — (ignored) неотслеживаемые, запрещены к добавлению (например, в .gitignore )
Параметры и аргументы
Первое различие — в том, что . — это путь (аргумент), а всё остальное — параметры. Те и другие не исключают друг друга и возможны их сочетания.
Использование абсолютных :/ и относительных . путей с командой add
Путь . обозначает текущую директорию, т.е. ту, в которой была запущена команда.
Начиная с Git версии 2.0, поведение команды add приведено в соответствие с поведением commit и других комманд. Теперь . обозначает не всю рабочую область (working tree), а текущий путь в этой области.
Таким образом, если вы выполняете команду add не в корневой директории проекта (той, где лежит .git/ ), то будет обработано содержимое только текущей директории.
Чтобы явным образом дать указание Git работать со всей рабочей областью, используйте :/ :
# работает одинаково из любой директории, добавляет всю рабочую область git add :/ # путь относительно корневой директории git add :/path/to/files/ # работает только в текущей директории cd test git add . # эквивалентно этому: git add :/test # путь относительно текущей директории cd test git add ./path # эквивалентно этому: git add :/test/path
Если не указан никакой путь к добавляемым файлам, то большинство команд работает во всей рабочей области, а git add и git add —no-all просто не работают.
Сводная таблица

О функционале команд подробно
git add . git add '*'
Git версии 2.0+ просматривает текущую папку и добавляет файлы M , D , ? .
Git версии 1.х просматривает всю рабочую область и добавляет файлы M , D .
Если ‘*’ дается в кавычках, то обрабатывать его будет Git и это эквивалентно git add . . Исключение: из-под cmd.exe git add ‘*’ не сработает, используйте git add . или git add * .
git add --no-all :/ git add --ignore-removal :/
Эта команда в Git v. 2.0+ работает как git add . в Git v. 1.x, то есть добавляет измененные и новые файлы M , ? во всей рабочей области. Для этой команды обязательно указывать путь.
git add --no-all . #добавляет измененные и новые файлы в *текущей директории* git add --no-all path1/ path2/ # добавляет измененные и новые файлы в путях *относительно текущей директории*
git add -u git add -update
Git обновляет (update) статус уже отслеживаемых файлов т.е. M , D .
git add -A git add --all git add --no-ignore-removal
Эти варианты эквивалентны и добавляют M , D , ? .
Без точки — из всей рабочей области:
git add -A = git add -A :/ = git add :/ + git add -u
С точкой — только текущий путь:
git add -A . = git add . + git add -u .
git add *
Этот синтаксис лучше не использовать, и вот почему:
При этой команде shell (или bash или другая командная оболочка) просматривает рабочую область и отдает Git список файлов на добавление. Система сработает таким образом, что будут найдены абсолютно все не-скрытые файлы, находящиеся в заданном корне. Вы можете посмотреть на этот список, выполнив echo * . ( Исключение: из-под cmd.exe git add * работает так же как git add ‘*’ на shell/bash. )
Произойдет следующее (здесь мы видим сразу несколько причин не использовать add * ):
- Добавятся не изменившиеся с прошлого коммита файлы. Git спокойно и молча «прожует» этот запрос, не влияющий на индекс.
- Будут добавлены в индекс файлы в не-скрытых папках M , ? .
- Не будут добавлены файлы в скрытых папках. .M , .?
- Не будут добавлены удаленные файлы D .
- Если будут захвачены игнорируемые файлы ! , то будет попытка их добавить. Git отменит всю операцию и покажет сообщение об ошибке.
Зачем столько способов
Разнообразие параметров ( -u , -A , —no-all ) нужно для того, чтобы можно было добавлять разные группы файлов. Конкретно —no-all . было добавлено для того, чтобы реализовывать старое поведение add . в версиях 1.х.
Похоже, что несмотря на это, Git не позволяет добавлять конкретные группы файлов одной командой (см. сводную таблицу в начале).
Тонкости в использовании . и :/ нужны для того, чтобы каждую команду можно было выполнять как на всю рабочую область, так и на конкретную подпапку.
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Git: добавить все файлы в репо
Если вы хотите, чтобы Git отслеживал файл в репозитории, вы должны явно добавить его в репозиторий, что может стать немного громоздким, если у вас много файлов. Другой вариант — добавить / разместить все файлы в репо, что намного быстрее. В общем, лучше добавлять каждый вручную, чтобы избежать ненужных промежуточных файлов, но если вы знаете, что делаете, это может сэкономить время. Как и все в Git, это можно сделать несколькими способами. Доступное поведение и параметры также меняются в зависимости от
Время чтения: 3 мин.
Если вы хотите, чтобы Git отслеживал файл в репозитории, вы должны явно добавить его в репозиторий, что может стать немного громоздким, если у вас много файлов. Другой вариант — добавить / разместить все файлы в репо, что намного быстрее. В общем, лучше вручную добавлять каждый , чтобы избежать промежуточного хранения файлов , которые вы не хотите, но если вы знаете , что вы делаете это может сэкономить некоторое время.
Как и все в Git, это можно сделать несколькими способами. Доступное поведение и параметры также меняются в зависимости от версии Git, которую вы используете, поэтому в этой статье мы сосредоточимся на Git 2.x, который должен быть установлен на большинстве компьютеров.
Подготовить все файлы
С помощью этой команды будут размещены все файлы в вашем репозитории, включая все новые , измененные и удаленные файлы. Команда выглядит следующим образом:
$ git add -A
Параметр -A является сокращением для —all .
Другой способ сделать это — опустить параметр -A и просто указать точку для обозначения всех файлов в текущем рабочем каталоге:
$ git add .
Примечание : команда git add . размещает файлы только в текущем каталоге, а не в каких-либо подкаталогах, тогда как git add -A также помещает файлы в подкаталоги.
Подготовить все новые и измененные файлы
Предыдущие команды также удаляют файл из вашего репозитория, если он больше не существует в проекте. Если в вашем случае это нежелательное поведение, вам следует использовать параметр —ignore-removal , который будет обрабатывать только новые и измененные файлы:
$ git add --ignore-removal .
Помещать все измененные и удаленные файлы
Другой вариант этой команды будет заключаться в том, чтобы обрабатывать только измененные и удаленные файлы, но не новые файлы. Для многих существующих проектов это на самом деле более безопасная команда, чем другие, поскольку она влияет только на файлы, уже отслеживаемые репозиторием, и не будет добавлять другие, если вы специально не укажете это.
Такое поведение достигается с помощью -u , который является сокращением параметра —update :
$ git add -u
Добавление файлов по шаблону
Хотя технически это не добавляет все файлы, это еще один способ добавить пакет файлов. Git позволяет добавлять сразу несколько файлов с помощью шаблонов подстановки.
Так, например, если вы хотите добавить все файлы Python из текущего каталога в репозиторий, вам следует использовать такую команду:
$ git add *.py
Хотя в большинстве проектов есть подкаталоги, и в этом случае вам придется запустить эту команду в каждом из них, чтобы добавить все свои файлы Python. Но есть способ быстрее. Вместо этого вы можете использовать ** , который соответствует всем подкаталогам.
Итак, для другого примера, эта команда добавит все файлы JavaScript, в том числе в подкаталоги:
$ git add **/*.js
Licensed under CC BY-NC-SA 4.0
Git и Github. Простые рецепты
При разработке собственного проекта, рано или поздно, приходится задуматься о том, где хранить исходный код и как поддерживать работу с несколькими версиями. В случае работы на компанию, обычно это решается за вас и необходимо только поддерживать принятые правила. Есть несколько общеупотребимых систем контроля версий, и мы рассмотрим одну из самых популярных — это Git и сервис Github.
Система Git появилась, как средство управления исходными текстами в операционной системе Linux и завоевала множество поклонников в среде Open Source.
Сервис Github предоставляет хостинг (хранение) исходных текстов как на платной, так и на бесплатной основе. Это одна из крупнейших систем, которую любят Open Source пользователи. Основное отличие платной версии — это возможность создания частных репозиториев (хранилищ) исходных текстов и если вам скрывать нечего, то можете спокойно пользоваться бесплатной версией.
После того, как вы начали работу над проектом и написали какой-то работающий прототип, у вас появится желание сохранить результаты работы. Это так же может быть полезно в случае, если вы захотите продолжить работу на другом компьютере. Самое простое решение — это сохранить все на флешке. Этот вариант неплохо работает, но если есть подключение к интернету (а сейчас у кого его нет), то удобно воспользоваться системами Git/Github.
В этой статье будут описаны базовые сценарии использования систем Git/Github при работе над проектом в среде Linux с помощью командной строки. Все примеры проверялись на системе с Linux Ubuntu 14.04 и Git 1.9.1. Если вы пользуетесь другим дистрибутивом, то возможны отличия.
Создание локального репозитория
Предположим, что ваш проект находится в папке /home/user/project. Перед тем, как сохранять исходники, можно посмотреть, нет ли временных файлов в папке с проектом и по возможности их удалить.
Для просмотра папки удобно воспользоваться командой tree, которая покажет не только содержимое каждой папки, но и древовидную структуру директорий.
Часто временные файлы содержат специфические суффиксы, по которым их легко обнаружить и в последствии удалить. Для поиска таких файлов можно воспользоваться командой find. В качестве примера посмотрим, как найти все файлы, которые генерируются компилятором Python и имеют расширение .pyc
Переходим в папку с проектом /home/user/project:
cd /home/user/project
И показываем список файлов с расширением .pyc:
find . -name *.pyc
Эта команда выведет список всех файлов с расширением .pyc в текущей директории и в ее поддиректориях. Для удаления найденных файлов, достаточно добавить ключ -delete к этой команде:
find . -name *.pyc -delete
Очень рекомендуется не спешить и сразу ключ этот не добавлять. Первый раз вызвать команду для просмотра файлов и только убедившись, что в список не попало ничего полезного добавить ключ удаления.
Создадим локальный репозиторий в папке с проектом:
git init
После выполнения этой команды появится новая папка с именем .git. В ней будет несколько файлов и поддиректориев. На данный момент система управления версиями еще не видит наших файлов.
Добавление файлов в локальный репозиторий
Для добавления файлов используется команда:
git add readme
После выполнения команды, файл readme будет добавлен в систему управления версий (конечно если он уже был то этого в проекте). При добавлении файла генерируется хеш значение, которое выглядит примерно так:
9f2422325cef705b7682418d05a538d891bad5c8
Добавленные файлы хранятся в папке .git/objects/xx/yyyyyyyy, при этом первые 2 цифры хеша ипользуются для указания директории, а остальное хеш значение является именем файла. Наш добавленный файл будет находится здесь:
.git/objects/9f/2422325cef705b7682418d05a538d891bad5c8
Что легко увидеть с помощью команды:
ls .git/objects
Сам файл является архивом, который легко распаковать и вывести на экран, указав полное значение хеша.
git cat-file -p 9f2422325cef705b7682418d05a538d891bad5c8
Для того, чтобы добавить все файлы из текущей директории введите:
git add .
Если нужно добавить файлы из текущей директории и из всех поддиректориев, то используйте:
git add --all
Для того, чтобы в систему не попадали временные файлы, можно их занести в файл .gitignore, который нужно создать самостоятельно и разместить в корневом каталоге проекта (на том же уровне, что и .git директория).
Например, если в в файл .gitignore добавить следующую строчку *.pyc, то все файлы с расширением .pyc не будут добавляться в репозиторий.
После добавления файлов, все изменения находятся в так называемой staging (или cached) area. Это некоторое временнное хранилище, которое используется для накопления изменений и из которого создаются собственно версии проектов (commit).
Для просмотра текущего состояния можно воспользоваться командой:
git status
После выполнения команды мы увидим, что в stage area находится наш файл:
new file: readme
Если вы продолжите вносить изменения в файл readme, то после вызова команды git status вы увидите две версии файла.
new file: readme modified: readme
Чтобы добавить новые изменения достаточно повторить команду. Команда git add не только добавляет новые файлы, но и все изменения файлов, которые были добавлены ранее.
git add readme
Можно отменить добавления файла readme в staging area с помощью команды:
git rm --cached readme
После выполнения команды, файл readme отметится, как неизмененный системой.
Создание версии проекта
После того, как мы добавили нужные файлы в staging area мы можем создать версию проекта. С помощью команды:
git commit -m "comment"
Каждая новая версия сопровождается комментарием.
После коммита, мы сможем найти два новых объекта внутри .git репозитория.
.git/objects/9f/2422325cef705b7682418d05a538d891bad5c8 .git/objects/65/7ab4c07bd3914c7d66e4cb48fe57f5c3aa7026 .git/objects/da/c6721c3b75fcb3c9d87b18ba4cef2e15e0a3d3
Посмотрим, что внутри:
git cat-file -t 657ab4c07bd3914c7d66e4cb48fe57f5c3aa7026
Ключ -t показывает тип объекта. В результате мы видим:
commit
Для второго объекта:
git cat-file -t dac6721c3b75fcb3c9d87b18ba4cef2e15e0a3d3
tree
Для самого первого файла:
git cat-file -t 9f2422325cef705b7682418d05a538d891bad5c8
blob
Если мы будем дальше изучать содержимое этих файлов, то обнаружим древовидную структуру. От каждого коммита можно по ссылкам пройти по всем измененным файлам. Для практического применения это не очень нужно, но возможно так будет легче понять, что происходит при работе с системой Git.
Самую первую версию отменить нельзя. Ее можно только исправить. Если вы хотите добавить изменения в последнюю версию, то после выполнения команды commit, добавляете необходимые изменения и вызываете:
git commit -m "comment" --amend
git commit --amend --no-edit
Ключ —no-edit нужен, чтобы не вводить заново комментарий.
Можно просмотреть изменения, которые вы внесли последним коммитом:
git show
git show --name-only
Ключ —name-only нужен, чтобы показывать только имена измененный файлов. Без него по каждому измененнному файлу будет выдан список всех изменений.
Если вы продолжили работать и изменили только те файлы, которые были уже добавлены в систему командой git add, вы можете сделать коммит одной командой:
git commit -a -m "comment"
Для просмотра списка всех коммитов, воспользуйтесь командой:
git log
git log --oneline
Ключ —oneline нужен, чтобы уменьшить количество информации выдаваемой на экран. С этим ключем каждый коммит показывается в одну строчку. Например:
2b82e80 update 657ab4c first
Для того, чтобы просмотреть изменения по конкретному коммиту, достаточно в команду git show добавить хеш значение коммита, которое можно получить с помощью предыдущей команды.
git show 657ab4c
Для отмены последнего коммита (кроме самого первого) можно воспользоваться следующей командой:
git reset HEAD~1
Для того чтобы удалить все файлы в папке, которые не относятся к проекту и не сохранены в репозитории, можно воспользоваться командой:
git clean -df
Создание репозитория на Github
До текущего момента мы работали с локальным репозиторием, который сохранялся в папке на компьютере. Если мы хотим иметь возможность сохранения проекта в интернете, создадим репозиторий на Github. Для начала нужно зарегистрироваться на сайте github.com под именем myuser (в вашем случае это может быть любое другое имя).
После регистрации нажимаем кнопочку «+» и вводим название репозитория. Выбираем тип Public (репозиторий всегда Public для бесплатной версии) и нажимаем Create.
В результате мы создали репозиторий на сайте Github. На экране мы увидим инструкцию, как соединить наш локальный репозиторий со вновь созданным. Часть команд нам уже знакома.
Добавляем удаленный репозиторий (по протоколу SSH) под именем origin (вместо origin можно использовать любое другое имя).
git remote add origin git@github.com:myuser/project.git
Можем просмотреть результат добавления с помощью команды:
git remote -v
Если все было правильно сделано, то увидим:
origin git@github.com:myuser/project.git (fetch) origin git@github.com:myuser/project.git (push)
Для того, чтобы отменить регистрацию удаленного репозитария введите:
git remote rm origin
Это может понадобиться, если вы захотите поменять SSH доступ на HTTPS. После этого можно добавить его опять, например под именем github и протоколом HTTPS.
git remote add github https://github.com/myuser/project.git
Следующей командой вы занесете все изменения, которые были сделаны в локальном репозитории на Github.
git push -u github master
Ключ -u используется для того, чтобы установить связь между удаленным репозиторием github и вашей веткой master. Все дальнейшие изменения вы можете переносить на удаленный репозиторий упрощенной командой.
git push
Перенос репозитория на другой компьютер
После того, как репозиторий был создан на Github, его можно скопировать на любой другой компьютер. Для этого применяется команда:
git clone https://github.com/myuser/project.git
Результатом выполнения этой команды будет создание папки project в текущем каталоге. Эта папка также будет содержать локальный репозиторий (то есть папку .git).
Так же можно добавить название папки, в которой вы хотите разместить локальный репозиторий.
git clone https://github.com/myuser/project.git
Работа с одним репозиторием с разных компьютеров
С одним репозиторием с разных компьютеров может работать несколько разработчиков или вы сами, если например работаете над одним и тем же проектом дома и на работе.
Для получения обновлений с удаленного репозитория воспользуйтесь командой:
git pull
Если вы изменили ваши локальные файлы, то команда git pull выдаст ошибку. Если вы уверены, что хотите перезаписать локальные файлы, файлами из удаленного репозитория то выполните команды:
git fetch --all git reset --hard github/master
Вместо github подставьте название вашего удаленного репозитория, которое вы зарегистрировали командой git push -u.
Как мы уже знаем, для того чтобы изменения выложить на удаленный репозиторий используется команда:
git push
В случае, если в удаленном репозитории лежат файлы с версией более новой, чем у вас в локальном, то команда git push выдаст ошибку. Если вы уверены, что хотите перезаписать файлы в удаленном репозитории несмотря на конфликт версий, то воспользуйтесь командой:
git push -f
Иногда возникает необходимость отложить ваши текущие изменения и поработать над файлами, которые находятся в удаленном репозитории. Для этого отложите текущие изменения командой:
git stash
После выполнения этой команды ваша локальная директория будет содержать файлы такие же, как и при последнем коммите. Вы можете загрузить новые файлы из удаленного репозитория командой git pull и после этого вернуть ваши изменения которые вы отложили командой:
git stash pop
Заключение
Мы рассмотрели базовые сценарии работы с системами Git и Github. Каждая приведенная выше команда имеет значительно больше ключей и соответственно возможностей. Постепенное их изучение даст вам возможность легко оберегать свои иходники и больше концентрироваться непосредственно на разработке.