Git: базовые команды и самые основные ситуации. Примеры.
В данной статье рассмотрены основные команды git. Не смотря на то что команды "базовые", это не означает что имеется ввиду какой-то "неполноценный" набор команд. Освоив их - вы сможете достаточно полноценно пользоваться git. То есть, рассмотренных команд обычно хватает при решении примерно 90% задач возникающих при разработке программ с использованием рассматриваемой "системой контроля версий". В случае с не совсем тривиальными ситуациями, для лучшего понимания представлены примеры.
Необходимый уровень знаний для понимания данного материала: понимания базовых принципов git, а именно: для чего нужна система контроля версий, что такое индекс, ветка, коммит, иметь представление о локальном и удалённом репозитории.
Данная статья отлично подойдёт как повседневная "шпаргалка" для начинающих (и не только начинающих) разработчиков.
Итак, к делу!!!
Настройка:
Выводит версию используемого git:git version
Отображает настройки:
git config --list
Установить имя пользователя и email глобально:
git config --global --add user.name 'Ivan Petrov'
git config --global --add user.email 'youremail@gmail.com'
Установить имя пользователя и email локально:
git config --add user.name 'Ivan Petrov'
git config --add user.email 'youremail@gmail.com'
В репозитории в котором вы работаете, настройки хранятся в
.git/config
sudo nano .git/config
Шаблоны <email> и подобных - ваши данные
[user]
email = <email>
name = <first_name> <last_name>
Инициализация git с текущими настройками настройками
git init
Отобразить состояния файлов (изменённые\в индексе)
git status
Добавление\удаление в "индекс" (staged область)
Добавить в индекс конкретный фаил (test.php):git add test.php
Добавить в индекс все изменённые файлы текущей директории:
git add .
git reset HEAD test.php
git checkout -- test.php
Отменить изменения всех файлов в каталоге web
git checkout -- web/*
Комиты
Cделать комит включающий в себя все файлы (изменения) которые в данный момент в индексе, и написать комментарий:git commit -m "some comment"
Cделать комит конкретного файла (фаил должен быть в индексе, т.е. например перед этим выполнена команда: git add test.php)
git commit -m "Краткое описание" test.php
git commit --amend -m "First program version - it's new comment"
Удаление коммитов в локальной ветке
Допускается это применять только если ещё не делался push в удалённую ветку!
Удалить последний коммит
git reset --hard HEAD~
если нужно удалить 2 последних комита, то добавляем 2
git reset --hard HEAD~2
Хорошие примеры на Stackoverflow
Работа с ветками
git branch <имя_ветки>
git checkout <имя_ветки>
git branch -v
* master 0967848 File robots.txt added
посмотреть, "кто кого отслеживает":
git branch -vv
посмотреть все имеющиеся ветки (локальные и удалённые):
git branch -va
где:
v - вывести подробно,
а - отображать все ветки локальные и удалённые
git checkout <имя_ветки>
и выполнить:
git pull origin master
Переименовать локальную ветку (с branch-name на branch-name2)
git checkout branch-name
git branch -m branch-name2
git branch -d <имя_ветки>
(git branch -D <имя_ветки>)удалить ветку на сервере:
git push origin --delete <branchName>
Примеры:
1.2.Настройки отслеживания локальной ветки
1.3.Настройки отслеживания удалённой ветки (ситуация 1)
1.4.Настройки отслеживания удалённой ветки (ситуация 2)
Удалённые репозитории:
git remote -v
Удалить ветку в удалённом репозитории
git push origin --delete <имя_ветки>
Клонировать проект (примеры ниже):
git clone <URL>
Получить данные (изменения) из удалённого репозитория в свою локальную копию удалённого репозитория:
git fetch
Привязать свой локальный репозиторий к удалённому:
git remote add <repo_name URL>
где repo_name - придумать имя репозитория (видно локально)
URL - адрес удалённого репозитория;
Например:
git remote set-url origin https://RepoName@bitbucket.org/RepoName/code-info.git
Получить файлы из удалённой ветки (если удалённый репозиторий уже подключён к локальному):
git fetch <repo_name>
Если хотим добавить данные из локальной ветки в удалённый репозиторий:
git push <repo_name branch_name>
Получить данные из ветки удалённого репозитория:
git pull <repo_name branch_name>
git remote remove my-remote-repo master
Примеры:
2.1.Присоединиться к разработке или использ.проект для которого уже создан удалённый репозиторий
2.3.Привязать локальный репозиторий к удалённому и загрузить в него данные из локального
2.4.Слияние удалённых веток (например через web-интерфейс) и последующее обновление локальных веток:
2.5.Создать новый удалённый репозиторий и залить проект
Пример #1.1: Слияние веток | Назад
ЗАДАЧА:1)Добавить изменения из текущей ветки "my-new-branch" в ветку "master";
2)Отправить изменения обновлённой ветки "master" в ветку "master" удалённого репозитория.
РЕШЕНИЕ:
git checkout master
git merge my-new-branch
смотрим состояние:
git branch -v
git branch -vv
* master 3d774c7 [впереди 1] Vendor directory changes
my-new-branch 3d774c7 Vendor directory changes
3d774c7 [впереди 1] - означает что локальная ветка мастер находится как бы впереди удалённой ветки мастер
теперь всё готово к отправке в удалённый репозиторий
2) посмотрим список удалённых репозиториев:
git branch -va
* master 3d774c7 [впереди 1] Vendor directory changes
my-new-branch 3d774c7 Vendor directory changes
remotes/origin/HEAD -> origin/master
remotes/origin/master 0967848 File robots.txt added
смотрим название репозитория:
git remote -v
origin https://github.com/RepoName/code-info.git (fetch)
origin https://github.com/RepoName/code-info.git (push)
видим, репозиторий "origin", следовательно команду "push" выполняем так (обновляем удалённую ветку "master":):
git push origin master
Пример #1.2: Настройка отслеживания локальной ветки | Назад
Допустим есть ветка "master" и "hotfix".
РЕШЕНИЕ:
Для этого становимся на ветку "hotfix" и пишем следующую команду:
git branch --set-upstream master
Теперь локальная ветка "master" отслеживает локальную ветку "hotfix".
Флаг --set-upstream устарел и будет удален в будущем. Вместо него используйте --track
Пример #1.3: Настройка отслеживания удалённой ветки (ситуация 1) | Назад
ЗАДАЧА:Назначить локальной ветке "develop" ветку для отслеживания - удалённую ветку "develop".
Предполагается, что и локальная и удалённая ветки "develop" - существуют.
РЕШЕНИЕ:
Становимся на локальную ветку develop и:
git branch --set-upstream-to origin/develop
Пример #1.4: Настройка отслеживания удалённой ветки (ситуация 2) | Назад
ЗАДАЧА:Например мы создали локальную ветку develop от ветки master. Поработали в ней,
РЕШЕНИЕ:
git push --set-upstream origin develop
git branch -vv
git checkout master
git fetch
(?)git status
На ветке master
Ваша ветка отстает от «origin/master» на 3 коммита и ....
теперь можем обновить текущую локальную ветку ("master") в соответствии с удалённой "origin/master":
git pull
Пример #2.1: Присоединиться к разработке или использ.проект для которого уже создан удалённый репозиторий | Назад
git clone https://github.com/RepoName/code-info.git .
git branch -va
* master 0967848 File robots.txt added
remotes/origin/HEAD -> origin/master
remotes/origin/master 0967848 File robots.txt added
Username for 'https://github.com': RepoName
Password for 'https://RepoName@github.com':
Подсчет объектов: 586, готово.
Delta compression using up to 2 threads.
Сжатие объектов: 100% (450/450), готово.
Запись объектов: 100% (586/586), 67.47 KiB | 0 bytes/s, готово.
Total 586 (delta 210), reused 0 (delta 0)
remote: Resolving deltas: 100% (210/210), completed with 207 local objects.
To https://github.com/RepoName/code-info.git
0967848..3d774c7 master -> master
Пример #2.2: Получить данные (изменения) из удалённого репозитория в свою локальную копию удалённого репозитория | Назад
Шаг 1смотрим текущее состояние наших веток, в том числе состояние локальной копии удалённой ветки (зафиксированное последней процедурой проверки её состояния):
git branch -va
* master 0967848 File robots.txt added
remotes/origin/master 0967848 File robots.txt added
Шаг 2
теперь посмотрим название удалённого репозитория:
git remote -v
origin https://github.com/RepoName/code-info.git (fetch)
origin https://github.com/RepoName/code-info.git (push)
видим, что подключены удалённые репозитории с присвоеным (по умолчанию) именем "origin"
Шаг 3
проверяем состояние удалённой ветки "master" удалённого репозитория "origin", а также обновляем её локальную копию "remotes/origin/master"
git fetch origin
теперь смотрим состояние:
git status
На ветке master
Ваша ветка отстает от «origin/master» на 1 коммит и может быть перемотана вперед.
(используйте «git pull», чтобы обновить вашу локальную ветку)
нечего коммитить, нет изменений в рабочем каталоге
Шаг 4
eщё раз смотрим текущее состояние наших веток:
git branch -va
* master 0967848 [позади 1] File robots.txt added
remotes/origin/master 3d774c7 Vendor directory changes
Шаг 5
теперь можем переключиться на неё и посмотрить какие изменения в ней содержатся:
git checkout origin/master
если изменения нас устраивают можно "маржить" эту ветку с нашей локальной веткой "master":
git checkout master
убеждаемся что мы на ветке "master":
git branch -va
* master 0967848 [позади 1] File robots.txt added
remotes/origin/master 3d774c7 Vendor directory changes
Шаг 6
делаем слияние веток ("маржим")
git merge origin/master
ПРИМЕЧАНИЕ:
В случае, если вам не нужно смотреть изменения в удалённой ветке и вы хотите сразу обновить локальную ветку "master" до состояния удалённой ветки "master",
то проще после шага 2, сделать "pull" запрос к ветке "master" удалённого репозитория (в данном случае "origin"):
git pull origin master
Пример #2.3: Привязать локальный репозиторий к удалённому и загрузить в него данные из локального | Назад
1. Привязать локальный репозиторий "test-repo" к удалённому "my-remote-repo";
2. Загрузить данные из локального репозитория test-repo в удалённый "my-remote-repo";
РЕШЕНИЕ:
Шаг 1: из каталога test-repo пишем:
git remote add my-remote-repo https://github.com/RepoName/my-remote-repo.git
git branch -va
* master d2fa10c First version
git push my-remote-repo master
git branch -va
* master d2fa10c First version
remotes/my-remote-repo/master d2fa10c First version
Пример #2.4: Слияние удалённых веток (например через web-интерфейс) и последующее обновление локальных веток: | Назад
После слияния удалённых веток develop с веткой master на сайте cтановимся на локальную ветку "master",
Сравниваем текущие изменения в удалённой ветке с текущими в локальной:
git fetch
смотрим результат:
git status
На ветке master
Ваша ветка отстает от «origin/master» на 3 коммита и может быть перемотана вперед.
git pull
Теперь обновим локальную ветку develop в соответствии с удалённой "master":
становимся на ветку "develop":
git checkout develop
обновляем:
git pull origin master
посмотрим результат:
git branch -vv
* develop 9749189 [origin/develop: впереди 1] Merged develop into master
master 9749189 [origin/master] Merged develop into master
Видим, что теперь локальная ветка "develop" впереди удалённой "develop"
git push
ВСЁ! ;)
Пример #2.5: Создать новый удалённый репозиторий и залить проект: | Назад
Далее, в локальной папке с проектом:
git init
смотрим результат:
git status
теперь, неплохо бы создать фаил .gitignore , чтобы не отправлять в индекс файлы, изменения которых не следует отслеживать
добавляем файлы в индекс (staged область):
git add .
делаем первый комит:
git commit -m "First version"
подключаем пустой удалённый репозиторий "test-repo"
git remote add origin https://my-projects@bitbucket.org/my-projects/test-repo.git
находясь на локальной ветке "master" подключаем удалённую ветку "master" как "вышестоящую" (т.е. которая будет отслеживаться локальной веткой "master"):
git push --set-upstream origin master
нет указателя HEAD
git log --oneline --decorate --graph --all
* 42e7029 (HEAD -> master, origin/master) First version
git clone https://my-projects@bitbucket.org/my-projects/my-site.git .
3. Теперь установим vendor с зависимостями:
composer install
4. в каталоге /config создать фаил db.php типа:
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => '
mysql:host=localhost;
dbname=my_db
',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
sudo chmod -R 770
РЕШЕНИЕ:
git branch editorial-template
git checkout editorial-template
git checkout -- components/*
git pull origin editorial-template
6.4 ставим отслеживание удалённой ветки:
git branch --set-upstream-to origin/editorial-template
6.5 сравниваю текущие изменения в удалённой ветке с текущими в локальной на всякий случай =)
git fetch
git checkout master
6.7 выполняем слияние "editorial-template" в "master"
git merge editorial-template