IT-Storm

Easy things should be easy and hard things should be possible

Menu

Git: базовые команды и самые основные ситуации. Примеры.

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 .
 
Убрать фаил из staged области (индекса), отмена подготовки
git reset HEAD test.php
 
Отменить изменения в файле (если он ещё не в индексе (staged области)):
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 - вывести подробно,
а - отображать все ветки локальные и удалённые
 
обновить текущую ветку до уровня удалённой ветки "master"?
стать на нужную ветку:
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.1. Cлияние веток

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.2.Получить данные (изменения) из удалённого репозитория в свою локальную копию удалённого репозитория

2.3.Привязать локальный репозиторий к удалённому и загрузить в него данные из локального

2.4.Слияние удалённых веток (например через web-интерфейс) и последующее обновление локальных веток:

2.5.Создать новый удалённый репозиторий и залить проект

2.6.Клонирование проекта

 

 

Пример #1.1: Слияние веток | Назад

ЗАДАЧА:
1)Добавить изменения из текущей ветки "my-new-branch" в ветку "master";
2)Отправить изменения обновлённой ветки "master" в ветку "master" удалённого репозитория.

РЕШЕНИЕ:
1) переключаемся на ветку "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
видим 2 ветки находящиеся на одном коммите
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".
Нужно, чтобы ветка "master" отслеживала изменения в "hotfix" и соответственно сообщала об этом при команде git status или git checkout master (при переходе на ветку "master")

РЕШЕНИЕ:
Для этого становимся на ветку "hotfix" и пишем следующую команду:
git branch --set-upstream master
Теперь локальная ветка "master" отслеживает локальную ветку "hotfix".
ПРИМЕЧАНИЕ:
Флаг --set-upstream устарел и будет удален в будущем. Вместо него используйте --track 
или --set-upstream-to
 

Пример #1.3: Настройка отслеживания удалённой ветки (ситуация 1) | Назад

ЗАДАЧА:
Назначить локальной ветке "develop" ветку для отслеживания - удалённую ветку "develop".
Предполагается, что и локальная и удалённая ветки "develop" - существуют.

РЕШЕНИЕ:
Становимся на локальную ветку develop и:
git branch --set-upstream-to origin/develop
 

Пример #1.4: Настройка отслеживания удалённой ветки (ситуация 2) | Назад

ЗАДАЧА:
Например мы создали локальную ветку develop от ветки master. Поработали в ней, 
создали несколько комитов. Теперь решили создать удалённую копию этой ветки и
настроить локальную (develop) так,чтобы вышестоящей веткой для неё была удалённая (develop).

РЕШЕНИЕ:
1.Заходим в удалённый репозиторий (на сайт) и создаём ветку develop от ветки master;
2.На локальной машине - убеждаемся что находимся на ветке develop;
3.Вводим: 
git push --set-upstream origin develop
4.Проверяем (посмотреть кто кого отслеживает):
git branch -vv
 
расшарить комиты удалённой ветки "master" (например после слияния удалённых веток)
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
видим, изменения в коммитах по сравнению с предидущим запросом "git branch -va"
локальная копия удалённого репозитория "remotes/origin/master" изминилась.

Шаг 5
теперь можем переключиться на неё и посмотрить какие изменения в ней содержатся:
git checkout origin/master

если изменения нас устраивают можно "маржить" эту ветку с нашей локальной веткой "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
 
 
Шаг 2: смотрим список веток в локальном репозитории:
git branch -va
* master                        d2fa10c First version
 
Шаг 3: выгружаем данные в удалённый репозиторий: (отправка данных в удал.репозиторий):
git push my-remote-repo master 
где, my-remote-repo - наш удалённый репозиторий,
master - имя ветки которую отправляем
 
Шаг 4: снова смотрим список веток в локальном репозитории:
git branch -va
* master                        d2fa10c First version
  remotes/my-remote-repo/master d2fa10c First version
где, remotes/my-remote-repo/master - локальная копия удалённого репозитория
 

Пример #2.4: Слияние удалённых веток (например через web-интерфейс) и последующее обновление локальных веток: | Назад

После слияния удалённых веток develop с веткой master на сайте cтановимся на локальную ветку "master",
Сравниваем текущие изменения в удалённой ветке с текущими в локальной:
git fetch

смотрим результат:
git status

На ветке master
Ваша ветка отстает от «origin/master» на 3 коммита и может быть перемотана вперед.

Обновляем локальную ветку «master»:
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"
Следовательно - обновим удалённую ветку "develop":
git push

ВСЁ! ;)
 

Пример #2.5: Создать новый удалённый репозиторий и залить проект: | Назад

ЗАДАЧА:
1) создать удалённый репозиторий для проекта.
2) подготовить папку с проектом и залить её в созданный удалённый репозиторий
 
РЕШЕНИЕ:
Создаём репозиторий test-repo с помощью web-интерфейса bitbucket.org

Далее, в локальной папке с проектом:
инициализируем git:
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

 
 
1. Создаём директорию в которую будем клонировать
 
2. Переходим в эту директорию и пишем в командной строке:
git clone https://my-projects@bitbucket.org/my-projects/my-site.git . 
(клонируется ветка master)

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',
];
 
5. Предоставить права на запись для "apache2":
sudo chmod -R 770
 
6. Дополнительная ЗАДАЧА:
Добавим дополнительную ветку "editorial-template", обновим с удалённой веткой "editorial-template", настроим отслеживание (этих веток), и выполним слияние локальных веток "master" и "editorial-template" (последняя - опережает "master").

РЕШЕНИЕ:
6.1 создаём ветку:
git branch editorial-template
 
6.2 переходим в неё:
git checkout editorial-template
 
6.2.1 если имеются изменения которые не в индексе - можно их убрать, например: 
git checkout -- components/*
 
6.3 пушим всё из удалённой ветки в локальную:
git pull origin editorial-template

6.4 ставим отслеживание удалённой ветки:
git branch --set-upstream-to origin/editorial-template

6.5 сравниваю текущие изменения в удалённой ветке с текущими в локальной на всякий случай =)
git fetch
 
6.6 становимся на ветку "master"
git checkout master

6.7 выполняем слияние "editorial-template" в "master"
git merge editorial-template

Разное