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/configsudo 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.phpgit checkout -- test.phpОтменить изменения всех файлов в каталоге web
git checkout -- web/*
Комиты
Cделать комит включающий в себя все файлы (изменения) которые в данный момент в индексе, и написать комментарий:git commit -m "some comment"Cделать комит конкретного файла (фаил должен быть в индексе, т.е. например перед этим выполнена команда: git add test.php)
git commit -m "Краткое описание" test.phpgit 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-namegit branch -m branch-name2git 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 mastergit merge my-new-branchсмотрим состояние:
git branch -vgit branch -vv* master 3d774c7 [впереди 1] Vendor directory changes my-new-branch 3d774c7 Vendor directory changes3d774c7 [впереди 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 developgit branch -vvgit checkout mastergit 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 addedUsername for 'https://github.com': RepoNamePassword 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 -vorigin 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 addedremotes/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.gitgit branch -va* master d2fa10c First versiongit 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-templategit checkout editorial-templategit checkout -- components/*git pull origin editorial-template6.4 ставим отслеживание удалённой ветки:
git branch --set-upstream-to origin/editorial-template6.5 сравниваю текущие изменения в удалённой ветке с текущими в локальной на всякий случай =)
git fetchgit checkout master6.7 выполняем слияние "editorial-template" в "master"
git merge editorial-template