Программирование PC Краткий справочник по Git Fri, June 09 2023  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Краткий справочник по Git Печать
Добавил(а) microsin   

Небольшая памятка по командам 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.

Примечания:

(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 шага вопросов не вызывают. Нужно согласиться с условиями лицензии, выбрать папку для установки, поставить галочки устанавливаемых компонентов, выбрать место размещения для ярлыков запуска. Можно оставить все по умолчанию:

Git setup01

Git setup02

Git setup03

Git setup04

На этом шаге лучше всего выбрать редактор, которым Вы привыкли пользоваться. Мне нравится Notepad2:

Git setup05

На этом шаге предлагают настроить рабочее окружения для запуска Git. Первый вариант никак не модифицирует переменные окружения, подразумевается запуск Git под управлением командной строки MinGW bash. Второй и третий вариант прописывает некоторые переменные окружения (пути запуска), чтобы можно было запускать Git как из стандартного интерпретатора команд Windows, так и из MinGW bash. Я выбрал второй вариант, который задан по умолчанию:

Git setup06

Здесь выбирается библиотека, с помощью которой обслуживаются защищенные соединения. Оставил этот вариант по умолчанию:

Git setup07

Здесь выбрал вариант, который при операциях Git не модифицирует окончания строк текстовых файлов:

Git setup08

Здесь лучше оставить выбор по умолчанию. Вариант настройки MinTTY обеспечивает удобную цветовую подсветку выводимого текста в консоли:

Git setup09

Эти опции тоже луше оставить по умолчанию:

Git setup10

Git setup11

Git setup12

Как работать с Git по шагам, начиная с создания репозитория. Предполагается, что Git уже установлен.

1. Зайдите в рабочий каталог проекта, запустите сессию bash. Можно конечно пользоваться и стандартной командной строкой Windows, но MINGW64 Bash удобнее, потому что он предоставляет цветовую подсветку сообщений, и корректно поддерживает Unicode, что позволяет пользоваться русскими буквами в командах Git.

Git MINGW64 Bash window

2. Необходимо создать репозиторий и указать для него имя пользователя и email. Для создания репозитория выполните команду:

git init

После этого выполните следующие команды (вместо Your Name и anyemail@domain.ru укажите любое имя и адрес электронной почты):

git config --global user.name "Your Name"
git config --global user.email "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 clone https://github.com/jjjsmit/BluetoothBLEClient.git

# Что игнорировать в папке bin:
bin/*.dlb
bin/*.ldr
bin/*.bin
bin/*.zlib
bin/*.log
 
# Что игнорировать в папке bootloader:
bootloader/*.pcf
bootloader/Debug/
bootloader/Release/
 
# Все содержимое в папке deleted игнорируется:
deleted/
 
# Что игнорировать в папке doc:
doc/**/*.pdf
doc/**/*.png
doc/**/*.bmp
doc/**/*.svg
doc/**/*.zip
doc/**/*.jpg
doc/**/*.psd
doc/**/*.png
doc/**/*.xls
doc/**/*.doc
doc/**/*.docx
doc/**/*.spl7
doc/181219автовыбор-КРЛ
 
# Что игнорировать в папке lib:
lib/**/*.bak
lib/**/*.old
lib/**/*.pcf
lib/**/*.dlb
 
# Что игнорировать в папке mainapp-VDK:
mainapp-VDK/**/*.dlb
mainapp-VDK/**/*.bak
mainapp-VDK/**/*.pcf
mainapp-VDK/**/*.log
 
# Что игнорировать в папке pictures:
pictures/**/*.bmp
pictures/**/*.png
pictures/**/*.psd
pictures/**/*.old
pictures/**/*.bin
pictures/**/*.pdf
pictures/**/*.zlib
 
# Что игнорировать в папке util:
util/**/*.als
util/**/*.exe
util/**/*.dxe
util/**/*.old
util/**/*.zip
util/**/*.bmp
util/**/*.ico
util/**/*.dll
util/**/*.o
util/**/*.vsd
util/**/*.suo
util/**/*.gz
util/**/*.url
util/**/*.pfx
util/**/*.ldr
util/**/*.chm
util/calibr/Debug/
util/calibr/Release/
util/calibr/bin/Debug/
util/calibr/bin/Release/
util/calibr/obj/
util/calibr/publish/
util/zpipe-test/pack01
util/zpipe-test/src
util/visa/bin/Debug/
util/visa/bin/Release/
util/visa/publish/
util/visa/obj/

[Манипуляции с ветками (branch)]

Ветка это просто обособленная версия проекта, которая может храниться в репозитории независимо от остальных веток. Можно переключаться между ветками, и делать в каждой из них какую-либо экспериментальную работу.

Команда Функция
git branch Показать список всех веток, которые существуют в репозитории. По умолчанию в репозитории существует только одна основная ветка - master. Если веток несколько, то текущая ветка будет помечена звездочкой и её название выделена зеленым текстом.
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 должен быть основной результат работы над проектом, а в ветках какие-либо мало значимые эксперименты.

[FAQ]

Необходимо сконфигурировать репозиторий, добавив в него имя пользователя и email. Для этого выполните следующие команды:

git config --global user.name "Your Name"
git config --global user.email "anyemail@domain.ru"

Вместо Your Name и anyemail@domain.ru подставьте свое имя и адрес электронной почты.

Создайте файл .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, выполните команду:

git config remote.origin.url http://git.netserver.ru/username/myproject.git

Иногда надо дополнительно выполнить следующую команду, чтобы протолкнуть (push) текущую ветку репозитория (branch) на сетевой сервер, и установить его как приемник push:

git push --set-upstream origin master

После этой команды  git push и git pull будут по-умолчанию работать с репозиторием на сетевом сервере.

4. Чтобы сохранить наработанные изменения и протолкнуть их на сервер, используйте команды:

git add .
git commit -a
git push

Чтобы засинхронизировать текущий проект с сервером, используйте команду:

git pull

В репозитории (это был 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 в любом из подкаталогов репозитория:

d:\asm\nRF5_SDK_12.3.0_d7731ad>git add */Makefile
add 'examples/ant/ant_advanced_burst/d52_starterkit/s212/armgcc/Makefile'
add 'examples/ant/ant_advanced_burst/pca10040/s212/armgcc/Makefile'
add 'examples/ant/ant_async_transmitter/d52_starterkit/s212/armgcc/Makefile'
add 'examples/ant/ant_async_transmitter/pca10040/s212/armgcc/Makefile'
add 'examples/ant/ant_background_scanning/d52_starterkit/s212/armgcc/Makefile'
add 'examples/ant/ant_background_scanning/pca10040/s212/armgcc/Makefile'
add 'examples/ant/ant_broadcast/rx/d52_starterkit/s212/armgcc/Makefile'

На примере файла .gitignore:

git add .gitignore

Пример для добавления всех файлов, имена которых начинаются на точку:

git add ".*"

Попытался сделать 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

[Словарик]

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.
9Git: как переключаться между фиксациями.

 

Добавить комментарий


Защитный код
Обновить

Top of Page