Небольшая памятка по командам Git, приемы работы с локальным репозиторием.
1. Основные команды (выполненные в текущем каталоге корневой папки проекта):
Команда
Функция
git init
Создание репозитория в текущем каталоге.
git config user.name "имя"
Ввод имени пользователя репозитория.
git config user.email "box@domain.ru"
Ввод email пользователя репозитория.
git add -n *
Проверка, какие файлы будут добавлены в репозиторий.
git add readme.txt
Добавить в репозиторий файл readme.txt(1).
git add util/**/*.cpp
Добавить все файлы *.cpp, которые находятся в папке util и её подкаталогах.
git add *.c *.h *.s *.asm
Добавить в репозиторий все файлы(1) с расширениями *.c, *.h, *.s, *.asm.
git commit -m "190311 first commit"
Выполнить коммит репозитория.
git status
Показать состояние репозитория - какие файлы были добавлены или изменены.
git status --untracked-files=no
Показать состояние репозитория без отображения файлов, которые еще не добавлены в репозиторий.
git rm --cached имяфайла
Убирает из репозитория указанный файл (он больше не отслеживается). В рабочем каталоге этот файл останется.
git log
Просмотр истории изменений репозитория.
git pull
Взять изменения из remote-репозитория в локальный репозиторий.
git push
Выгрузить изменения в локальном репозитории в remote-репозиторий.
git clone
Сделать локальную копию репозитория.
git checkout -b имяветки
Создание новой ветви имяветки в репозитории, и переключение на работу в ней. Основная ветвь носит имя master, содержимое ветви master будет сохраняться неизменной.
git checkout master
Возврат в основную ветвь репозитория.
git stash
Позволяет временно заархивировать (припрятать [7]) измененные, но не прошедшие commit файлы, когда их требует перезаписать команда git pull.
git commit -e
Откроет текстовый редактор для ввода комментария фиксации. Этот вариант создания фиксации позволяет нативно вводить многострочный комментарий [11].
git diff ...
Сравнение фиксаций или ветвей проекта [12].
Примечания:
(1) Если добавляемые файлы уже присутствуют в репозитории, то будут отображены изменения в этих файлах.
2. Подробная помощь по команде (откроется окно браузера со справкой):
git help команда
3. Краткая подсказка по команде:
git команда -h
4. Файл .gitignore позволяет создать список файлов, которые не нужно отслеживать. В этом файле можно делать комментарии, комментарием считается строка, которая начинается на символ #. В каждой строке указывается имя файла, который игнорируется, в именах можно использовать символы группирования * и ?. Чтобы исключить папку и файлы в ней, нужно добавить имя папки со слешем в конце, например: Debug/. Примеры файлов .gitignore см. в [4].
5. Можно создавать алиасы (синонимы) команд для быстрого доступа к ним. Вот так например, можно создать синоним git st для команды git status:
git config --global alias.st "status -s"
После этого команды git st и git status будут выполняться одинаково.
Установка выполняется по шагам с помощью обычного мастера. Однако не некоторых шагах не очевидно, какие опции выбирать.
Начальные 4 шага вопросов не вызывают. Нужно согласиться с условиями лицензии, выбрать папку для установки, поставить галочки устанавливаемых компонентов, выбрать место размещения для ярлыков запуска. Можно оставить все по умолчанию:
На этом шаге лучше всего выбрать редактор, которым Вы привыкли пользоваться. Мне нравится Notepad2:
На этом шаге предлагают настроить рабочее окружения для запуска Git. Первый вариант никак не модифицирует переменные окружения, подразумевается запуск Git под управлением командной строки MinGW bash. Второй и третий вариант прописывает некоторые переменные окружения (пути запуска), чтобы можно было запускать Git как из стандартного интерпретатора команд Windows, так и из MinGW bash. Я выбрал второй вариант, который задан по умолчанию:
Здесь выбирается библиотека, с помощью которой обслуживаются защищенные соединения. Оставил этот вариант по умолчанию:
Здесь выбрал вариант, который при операциях Git не модифицирует окончания строк текстовых файлов:
Здесь лучше оставить выбор по умолчанию. Вариант настройки MinTTY обеспечивает удобную цветовую подсветку выводимого текста в консоли:
Как работать с Git по шагам, начиная с создания репозитория. Предполагается, что Git уже установлен.
1. Зайдите в рабочий каталог проекта, запустите сессию bash. Можно конечно пользоваться и стандартной командной строкой Windows, но MINGW64 Bash удобнее, потому что он предоставляет цветовую подсветку сообщений, и корректно поддерживает Unicode, что позволяет пользоваться русскими буквами в командах Git.
2. Необходимо создать репозиторий и указать для него имя пользователя и email. Для создания репозитория выполните команду:
git init
После этого выполните следующие команды (вместо Your Name и anyemail@domain.ru укажите любое имя и адрес электронной почты):
3. Выполните команду git add -n *, которая выведет список файлов, которые могут быть потенциально добавлены в репозиторий. Скорее всего, в этом списке будут некоторые файлы, изменение которых отслеживать не нужно (объектные и двоичные файлы, картинки, логи и т. п.). Если такие файлы есть, то перейдите к шагу 4, а если нужно добавить все файлы из выведенного списка, то перейдите к шагу 6.
Если проект большой, и много его файлов находится в отдельных папках, то команду проверки git add -n можно запускать на файлы только одной папки. Например, вот проверка, какие файлы будут добавляться в репозиторий из папки lib проекта:
git add -n lib
4. Создайте в текстовом редакторе файл .gitignore, после этого начните добавлять в него записи для тех файлов, которые нужно игнорировать (Git не будет их отслеживать). Начните с папок, которые находятся в каталоге проекта, папку .git обрабатывать не нужно, это служебная папка.
Внимание: чтобы можно было в файле .gitignore использовать имена файлов с русскими буквами, файл .gitignore должен быть в кодировке UTF-8.
Предположим, что есть папка bin в каталоге проекта, и в ней находятся файлы с расширениями dlb, ldr, bin, log, которые не надо добавлять в репозиторий. Тогда в файл .gitignore добавьте следующие строки:
# Что игнорировать в папке bin:
bin/*.dlb
bin/*.ldr
bin/*.bin
bin/*.log
Если в папке много подкаталогов, и Вы хотите обработать их сразу все, то можно воспользоваться группировкой /**/:
doc/**/*.bmp
Обратите внимание, что первая строка начинается на #, это просто комментарий, добавленный для удобства. Сохраните файл .gitignore и снова выполните команду git add -n *, Вы увидите, что файлы из составленного списка игнорируются.
Каждую отдельную папку можно проверять командой git add -n имяпапки/.
5. После того, как создали список игнорируемых файлов для папки, добавьте её в репозиторий на отслеживание, для этого выполните команду git add без опции -n. Например, так добавляется папка lib:
git add lib/
Аналогичные шаги 4 и 5 проделайте со всеми папками и файлами проекта.
6. Теперь осталось сделать коммит.
git commit -m "190312 первый коммит"
Здесь опция -m задает обязательный комментарий для коммита. В комментарии я люблю указывать 6 цифрами дату коммита (YYMMDD). Имейте в виду, что русские буквы в комментарии можно указывать только в командной строке bash (он устанавливается вместе с Git).
7. Чтобы сделать локальную копию репозитория в текущем каталоге на диске, используйте команду git clone. Пример клонирования репозитория BluetoothBLEClient [8] через web-ссылку:
Ветка это просто обособленная версия проекта, которая может храниться в репозитории независимо от остальных веток. Можно переключаться между ветками, и делать в каждой из них какую-либо экспериментальную работу.
Команда
Функция
git branch
Показать список всех веток, которые существуют в репозитории. По умолчанию в репозитории существует только одна основная ветка - master. Если веток несколько, то текущая ветка будет помечена звездочкой и её название выделена зеленым текстом.
git branch -a
Посмотреть список веток в локальном и сетевом репозитории. Текущая ветка в локальном репозитории будет выделена зеленым цветом, а ветки в сетевом репозитории будут выделены красным, и будут иметь префикс remotes/origin/.
git branch имяновойветки
Создать новую ветку в проекте без переключения на неё.
git checkout -b имяновойветки
Создать новую ветку и переключиться на неё.
git switch -c имяновойветки
Создать новую ветку от текущей фиксации, и сделать эту ветку текущей. Как переключаться между фиксациями, см. [9].
git branch -D имяветки
Удалить ветку.
git switch -
Отмена предыдущей операции переключения между ветками.
git checkout ссылканаветку
Переключение между ветками. Вместо ссылканаветку может быть указано либо имя ветки (master или любое другое имя), либо первые шесть HEX-символа хеша фиксации. Список фиксаций с хешами можно посмотреть командой git log --pretty=oneline.
git branch -m old new
Переименовать ветку. Ветка с именем old получит имя new.
Хороший стиль работы - не плодить слишком много веток, чтобы не запутаться, либо вести подробную документацию по каждой ветке. В ветке master должен быть основной результат работы над проектом, а в ветках какие-либо мало значимые эксперименты.
Создайте файл .gitignore, поместите его в корневую папку проекта (там же, где находится папка репозитория .git), и в этом файле создайте строки, обозначающие исключаемые файлы (см. выше описание работы с файлом .gitignore).
Для этого используйте группировку /**/. Например, следующая запись .gitignore исключит из репозитория все файлы *.pdf, которые находятся в папке util, и во всех её подкаталогах:
util/**/*.pdf
Групповые подстановки можно также использовать и в командной строке Git.
Файл .gitignore должен иметь кодировку UTF-8. Вместо стандартной консоли команд cmd.exe в Windows используйте командную строку MINGW64 bash (устанавливается вместе с Git).
Процесс по шагам (взято из замечательной статьи [6]):
1. Сначала надо создать на сервере пустой репозиторий. Обычно это делается в HTML-интерфейсе сервера. После этого нужно запомнить Git-ссылку на этот репозиторий. Предположим, ссылка такая:
http://git.netserver.ru/username/myproject.git
2. В папке локального репозитория выполнить команды:
git remote add server http://git.netserver.ru/username/myproject.git git push server master:master
Первая команда добавляет в конфигурацию репозитория новый сервер, вторая делает выгрузку репозитория на сервер.
3. Для того, чтобы команды git теперь работали с репозиторием на сетевом сервере git.netserver.ru, выполните команду:
Иногда надо дополнительно выполнить следующую команду, чтобы протолкнуть (push) текущую ветку репозитория (branch) на сетевой сервер, и установить его как приемник push:
git push --set-upstream origin master
После этой команды git push и git pull будут по-умолчанию работать с репозиторием на сетевом сервере.
4. Чтобы сохранить наработанные изменения и протолкнуть их на сервер, используйте команды:
git add . git commit -a git push
Чтобы засинхронизировать текущий проект с сервером, используйте команду:
В репозитории (это был nRF5x SDK 12.3) множество проектов примеров содержат файлы Makefile, распределенные по разным каталогам. Простая команда с указанием имени файла не позволяет добавить в репозиторий эти файлы:
d:\asm\nRF5_SDK_12.3.0_d7731ad>git add Makefile
fatal: pathspec 'Makefile' did not match any files
Проблема в том, что тут указано полное имя, без шаблона wildcard. Чтобы команда сработала, нужно указать в качестве имени файла */Makefile, что будет соответствовать файлам Makefile в любом из подкаталогов репозитория:
Попытался сделать push ветки на сервер, не получилось, git выдает сообщение:
fatal: Вы сейчас не находитесь ни на одной из веток
В чем ошибка: перед внесением изменений в код не была установлена текущая ветка. Что надо сделать:
1. Копию всех исходников! 2. git checkout имя_той_ветки_котору_надо_выгрузить_на_сервер. Эта команда отменит все изменения, и вернет старое локальное состояние этой ветки. 3. Вернуть все исходники обратно из копии, сделанной на шаге 1. 4. git add *, git commit -m "bla-bla" 5. git push
Восстановить случайно удаленный файл можно командой git checkout имяфайла.
$ git status
Текущая ветка: main
Эта ветка соответствует « main ».
Изменения, которые не в индексе для коммита:
удалено: src/adcbatt.c
удалено: src/main.c
$ git checkout src/adcbatt.c
Updated 1 path from the index
$ git checkout src/main.c
Updated 1 path from the index
В чем ошибка: перед внесением изменений в код не была установлена текущая ветка. Что надо сделать:
1. Копию всех исходников! 2. git checkout имя_той_ветки_котору_надо_выгрузить_на_сервер. Эта команда отменит все изменения, и вернет старое локальное состояние этой ветки. 3. Вернуть все исходники обратно из копии, сделанной на шаге 1. 4. git add *, git commit -m "bla-bla" 5. git push
Подобная ошибка может произойти, если была переустановка операционной системы, и каталог репозитория был восстановлен с помощью внешнего диска с файловой системой FAT32.
$ git status
fatal: detected dubious ownership in repository at '/home/имяпользователя/каталог'
To add an exception for this directory, call:
Исправить ошибку можно либо командой git config --global, как советуется в этом сообщении об ошибке, либо если поменять владельца каталога репозитория на текущего пользователя:
branch ветвление проекта (создание его отдельной версии в репозитории).
commit легковесный снимок состояния файлов в определенный момент времени (когда был сделан коммит).
head самая последняя версия файлов в репозитории.
repository репозиторий, база данных, где хранится история изменений проекта. Git хранит репозиторий в папке .git, которая находится в корневом каталоге проекта.
staging area область файловой системы (список файлов), подготовленная к коммиту.
stash операция, которая поглощает грязное состояние рабочего каталога, то есть изменённые отслеживаемые файлы и изменения в индексе, и сохраняет их в стек незавершённых изменений, которые вы потом в любое время можете снова применить.
[Ссылки]
1. Downloads Git site:git-scm.com. 2. Learn Git site:atlassian.com. 3. Подробное введение в работу с Git site:tproger.ru. 4. A collection of useful .gitignore templates site:github.com. 5. git: быстрый старт. 6. Как перенести локальный GIT-репозитарий на сервер вместе со всей историей site:webhamster.ru. 7. Инструменты Git - Припрятывание и очистка site:git-scm.com. 8. jjjsmit / BluetoothBLEClient site:github.com. 9. Git: как переключаться между фиксациями. 10. How do I force "git pull" to overwrite local files? site:stackoverflow.com. 11. git: как создавать многострочный комментарий для commit. 12. git: как сравнивать фиксации и ветки.