Fork me on GitHub

Шпаргалка по GIT

Для начала надо понимать, что у гит нет главного репозитория. Все репозитории равнозначны и делятся на два типа локальные и удалённые. Подключать можно сколько угодно и пулятся и пушить во все сразу используя волшебный ключик all

Основная настройка имя и почта

1
2
git config --global user.email "твояпочта@example.com"
git config --global user.name "Имя"

Псевдонимы (Алиасы) задаются следующим образом

1
2
3
4
5
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.l "log --oneline --graph"

Если команда имеет пробелы то её необходимо взять в кавычки

Теперь вывод лога в графическом виде делается командой git l

Пример работы

Для создания локального репозитория в каталоге проекта выполняем

1
2
git init
Инициализирован пустой репозиторий Git в ~/testttt/.git/

Смотрим статус локального репозитория сокращённый вариант

1
2
3
git git status -sb
## Начальный коммит на master
?? README.md

Смотрим статус локального репозитория сокращённый вариант

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
git status
На ветке master

Начальный коммит

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

    README.md

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

Добавляем файл порекомендации

1
git add --all                                                                                                                                            

Проверяем теперь статус

1
2
3
4
git git status -sb

## Начальный коммит на master
A  README.md
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git status

На ветке master

Начальный коммит

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)

    новый файл:    README.md

Комитим (закрепляем изменения)

1
2
3
4
git commit -m'добавил прочтименя'
[master (корневой коммит) 7b56033] добавил прочтименя
 1 file changed, 2 insertions(+)
 create mode 100644 README.md

И ещё раз проверяем статус

1
2
3
git status
На ветке master
нечего коммитить, нет изменений в рабочем каталоге

Подключаем удалённый репозиторий

1
git remote add origin git@example.org:testing.git

Вытягиваем все изменения которые уже есть на удалённом репозитории ЭТО НАДО ДЕЛАТЬ ВСЕГДА!!!

1
2
3
4
5
6
7
8
9
git pull origin master
Из example.org:testing
 * branch            master     -> FETCH_HEAD
Merge made by the 'recursive' strategy.
 .gitignore |  2 ++
 index1.php | 12 ++++++++++++
 2 files changed, 14 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 index1.php

При этом он автоматом смёржился без канфликтов т.к. небыло одинаковых файлов с разным содержимым

Получается что мёрж это отдельный коммит

1
2
3
4
5
6
7
8
git push origin master
Подсчет объектов: 5, готово.
Delta compression using up to 4 threads.
Сжатие объектов: 100% (3/3), готово.
Запись объектов: 100% (5/5), 639 bytes | 0 bytes/s, готово.
Total 5 (delta 0), reused 0 (delta 0)
To git@example.org:testing.git
   fd7eea4..8b771b4  master -> master

Что бы не чесать репу и разбирать ошибки почему не запушилось я делаю так

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
git pull origin master && git push origin master
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Распаковка объектов: 100% (5/5), готово.
Из example.org:testing
   fd7eea4..8b771b4  master     -> origin/master
Обновление fd7eea4..8b771b4
Fast-forward
 README.md | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 README.md
Everything up-to-date

Смотрим что там поменялось

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
git log
commit 8b771b424f9f8b1a056309dd3124899a8b3ed281
Merge: 7b56033 fd7eea4
Author: Денис Туляков <dtulyakov@example.org>
Date:   Fri Aug 12 09:15:16 2016 +0300

    Merge branch 'master' of example.org:testing

commit 7b5603380bd17873a258125454ead54a678b7fad
Author: Денис Туляков <dtulyakov@example.org>
Date:   Fri Aug 12 09:10:07 2016 +0300

    добавил прочтименя

commit fd7eea4d73069a66aa403ebfd4f57204c6f461e4
Author: Денис Туляков <dtulyakov@example.org>
Date:   Thu Aug 11 15:01:48 2016 +0300

        новый файл:    .gitignore

commit 1003563522071a7bf789b8ca1b5204ea59a47a93
Author: Oleg Yxxxxxxx <oleg@example.org>
Date:   Thu Aug 11 14:59:45 2016 +0300

    'test'

Псевдо графика показывает, что мы смёржиди две ветки в одну

1
2
3
4
5
6
git log --oneline --graph
*   8b771b4 Merge branch 'master' of example.org:testing
|\  
| * fd7eea4     новый файл:    .gitignore
| * 1003563 'test'
* 7b56033 добавил прочтименя

Если мы хотим, что то наколдовать но не уверены в результате (может получится какаято кака). Делаем ветку

1
git branch testdef

Смотрим в какой мы ветке и какие есть вообще

1
2
3
git branch
* master
  testdef

Переключаемся в новую ветку

1
2
git checkout testdef
Переключено на ветку «testdef»

Теперь проверим где мы

1
2
3
git branch
  master
* testdef

Я поправил файл "прочтименя" и закомитил его. Переодически надо пулятся из мастера что бы потом глаза на лоб не лезли при разрешении конфликтов. То есть находясь в своей ветке делать

1
git pull origin master

После удачных тестов надо слить ветки, что бы всем было доступно наше "произведение искуства". Для этого комитим всё что хотим слить, переходим в мастер и мёржим ветки.

1
2
git checkout master
Переключено на ветку «master»

А вдруг гит нас обманул и мы не в мастере

1
2
3
git branch
* master
  testdef

Всё нормально можно мёржить

1
2
3
4
5
git merge testdef
Обновление 8b771b4..1d71990
Fast-forward
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
git pull origin master && git push origin master
Из example.org:testing
 * branch            master     -> FETCH_HEAD
Already up-to-date.
Подсчет объектов: 3, готово.
Delta compression using up to 4 threads.
Сжатие объектов: 100% (2/2), готово.
Запись объектов: 100% (3/3), 423 bytes | 0 bytes/s, готово.
Total 3 (delta 0), reused 0 (delta 0)
To git@example.org:testing.git
   8b771b4..1d71990  master -> master

Для того, что бы ещё кто то мог править нашу ветку её надо вытолкнуть на удалённый репозиторий

1
2
3
4
git push origin testdef
Total 0 (delta 0), reused 0 (delta 0)
To git@example.org:testing.git
 * [new branch]      testdef -> testdef

Ну а желающему можно просто пульнуть всё

1
2
3
4
5
git pull --all     
Извлечение из origin
Из example.org:testing
 * [новая ветка]     testdef    -> origin/testdef
Already up-to-date.

Или только ту ветку которая нужна

1
2
3
4
git pull origin testdef
Из example.org:testing
 * branch            testdef    -> FETCH_HEAD
Already up-to-date.

Но создать её всё равно надо через команду branch или другой вариант (создание ветки и переключение в неё)

1
2
git checkout -b testing
Переключено на новую ветку «testing»

Для добавления ещё одного репозитория

1
git remote add remotename git@example.org:testing2.git

Смотрим сколько репозиториев есть

1
2
3
4
5
git remote -v
origin  git@example.org:testing.git (fetch)
origin  git@example.org:testing.git (push)
remotename  git@example.org:testing2.git (fetch)
remotename  git@example.org:testing2.git (push)

Для того, что бы вытолкнуть в репозиорий remotename или в origin надо указать куда

1
2
git pull remotename master && git push remotename master
git pull origin master && git push remotename master

Понятно что если делать так

1
git pull && git push

Есть репозиторий и ветка которые отмечены по умолчанию. НО они могут быть изменены! Поэтому, что бы не было сюрпризов - я рекомендую указывать явные пути откуда и куда пулять или пушить. Но это рекомендация. Как делать каждый решает для себя сам

Например поправил файл и создал новый

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
git status
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».
Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git checkout -- <файл>…», чтобы отменить изменения
   в рабочем каталоге)

    изменено:      README.md

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

    test.txt

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)

Хочу отменить все изменения а новый не добавлять в не пушить его. Отменяем свои изменения.

1
git checkout README.md

Проверяем

1
2
3
4
5
6
7
8
9
git status
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».
Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

    test.txt

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

Пока файл не добавлен через add он не будет отслеждиваться.

Удалить файл из гит но оставить локально

1
git rm --cache README.md

Если сделать это без --cache то файл удалится локально и из индекса

Есть ещё stash но о нём чуть позже

Для того что бы "склеить" коммиты можно воспользоваться такоим приёмом

1
git rebase --root -i

В редакторе напротив коммитов которые оставляем не трогаем ничего, там уже указано pick, а те которые надо "склеить" пишем squash

Ссылки:

  • Что такое git
  • Онлайн книга Pro Gitk

Comments