это краткое содержание часто используемых команд.

git init — новый репозиторий
git status — состояние: что было редактировано, что добавлено в индекс для коммита

git add . — добавить в индекс все изменения
git add file.txt — добавить содержимое файла в индекс
git add -i — интерактивное добавление позволяет выбирать файлы, которые надо добавить. Для каждого файоа можно добавить некоторые изменения, другие оставить для следующего коммита.
git add -p — про каждое изменение в файле спрашивает, добавить его в индекс или нет -p==patch

git commit -m «initial commit» — первый commit (некоторые команды криво работают, пока не сделать первый коммит)
git commit -am «comment» — add + commit, но новые файлы не будут добавлены
git commit —amend — докоммитить предыдущий коммит. если что еще надо в него добавить или изменить текст коммита:
git commit —amend -m «new comment»
git commit —amend -C HEAD — не менять текст коммита. Вместо HEAD может быть любая ссылка на коммит, например:
— HEAD — последний коммит текущей ветки
— sha1_hash коммита
— имя ветки
— имя_ветки~2 — два коммита назад от HEAD’a ветки
— тег
— HEAD^2 — два коммита назад от HEAD
— HEAD~1 — тоже два коммита назад от HEAD

git log — логи коммитов
git log —all — все ветки
git log —graph —all —oneline — все ветки, показать связь между ветками. информация об одном коммите должна влезать на одну строку
git log -p — патчи

git branch — список веток
git branch newfeature — создать ветку newfeature
git checkout newfeature
или тоже самое одной командой:
git checkout -b newfeature
…редактирование (программирование фичи)
git commit -am «new feature done» — ее commit
git checkout master — переход в ветку master
git merge newfeature — объединение ветки newfeature с master
теперь в master работает новая фича.
Если при слиянии возникли конфликты, то посмотреть на них можно:
git status
edit Press.pm — поправить
git add Press.pm
git commit — завершает процесс слияния
Если надоело разрешать конфликты, то можно вернуть обе ветки в исходное состояние:
git reset —hard HEAD
А если commit завершен, то вернуть обратно можно так:
git reset —hard ORIG_HEAD

git checkout -f — отметить незакоммиченные изменения

git checkout — file.txt — вынимает версию файла, подготовленную к коммиту (после git add file.txt)
git checkout <commit> file.txt — из указанного коммита

git tag v4.2 — простой тег
git tag -a v4.2 -m «stable v4.2» — аннотированный тег (более подробный, вроде commit’a)
git tag -d v4.2 — удалить
git tag — список тегов
git tag -l <pattern> — поиск по шаблону
git log v4.2 — все коммиты, начиная с тега v4.2
git log v4.2 Press.pm — все коммиты, начиная с тега v4.2, в включающие изменения файла Press.pm
git branch —contains v4.2 — ветки с этой меткой
git show v4.2 — на какой commit указывает тег, когда и кем был сделан.
git describe — показывает сколько коммитов было с последнего тега:
v4.2-g[хэш последнего коммита]

git reset — undo
git reset —hard <commit> — отменить самым радикальным и не поправимым образом все, что было сделано и закоммичено после коммита <commit>. Рабочая папка тоже будет содержать проект из этого коммита.
git reset —soft <commit> — делает <commit> последним коммитом (HEAD’ом). Рабочая папка остается не тронутой.

git giu — оконный интерфейс в windows
gitk — оконный интерфейс в linux
gitk —all — все ветки

git update-index — обновить индекс содержимого файлов
git update-index —add — добавлять файлы с диска
git update-index —remove — удалять файлы, если их нет на диске

git diff — все изменения от последнего commit’a
git diff file.txt — изменения в одном файле
git diff —cached — сравнение последнего commit’a и того, что подготовлено для нового коммита
git diff <commit> — сравнение commit’a и рабочей папки, например
git diff HEAD^2 file.txt
git diff —stat sha1old..sha2new — список файлов и количество измененных строк между двумя коммитами
Сравнение двух веток:
git diff master..newfeature — сравнение двух последних коммитов веток
git diff master…newfeature — показывает разницу между последним коммитом в newfeature и его последнего предка в master. Полезно, если ветка newfeature была объединена с master, а потом в ней еще что-то изменилось. Тогда эта команда покажет разницу с последнего merga.

git blame file.txt — кто и когда редактировал файл

Временные коммиты
git stash — сделать временный коммит рабочей папки
… поправить что-нибудь в другой ветке, переключиться обратно и
git stash apply — вернуть рабочую папку обратно.
git status list — выводит список стешей, их может быть много, например:

git stash save «comment»
git stash apply stash@{1} — где stash@{1} — нужный стеш из git status list

Файл .gitignore — список шаблонов файлов, история по которым не ведется. То есть файлы, которые не попадают в репозиторий Например:
#пароли к бд
MyConfig.pm
#temp files:
*.*~
#все логи, кроме ошибок
*.log
!error.log

Или можно запретить все, кроме избранных файлов:
*.*
!*.pl
!*.pm

Удаленные repo:
git branch -a — список веток, включая удаленные (т.е. с исходного репозитория)
git remote add remoteName remoteURL — добавить удаленную ветку.
Все удаленные репозитории показываются в файле .git/config
[remote «origin»]
fetch = +refs/heads/*:refs/remotes/origin/* — связи между ветками
url = http://sn:@192.168.0.2/project/projectname.git

Забрать изменения с удаленного компьютера можно двумя способами:
1)
git fetch origin master — забирает с удаленного компьютера изменения в ветке master
git diff master..origin/master — посмотреть, что изменилось
git checkout -b testbranch
и
git merge origin/master — объединить изменения с удаленного компьютера с веткой master
…протестировать
git checkout master
git merge testbranch
2) все это одной командой (если не надо тестировать):
git pull origin master

git push origin master — пихает изменения из текущей ветки в origin master. Желательно делать push только в bare репозитории, т.к. команда push портит содержимое рабочей папки.

git rebase master — на master накладывается текущая ветка (сначала будут идти все коммиты master, потом все коммиты текущей ветки). Если просто объединить, то коммиты будут перемешаны и получится не красиво.
если возникли конфликты, их надо разрешить и запустить
git rebase —continue
Если надоест:
git rebase —abort — отменить все
git rebase —skip — пропустить один коммит

git rebase -i HEAD~10 — почистить историю последних 10 коммитов
в текстовом редакторе (из переменной окружения EDITOR) откроется список коммитов в формате:
pick hash message
Чтобы удалить коммит — удалить строку,
Поменять порядок коммитов — поменять порядок строк
объединить коммит с предыдущим — pick поменять на squash
для внесения изменений в коммит — pick на edit
После этого, если отметили коммиты, то
git commit —ament
если нет, то
git commit —continue
Подробности в git help rebase

git filter-branch —tree-filter ‘rm cgi-bin/MyConfig.pm’ HEAD Удалить файлы из всех коммитов
подробности в git help filter-branch

поиск коммита, в котором возникла ошибка:
git bisect start
git bisect bad sha1_bad_commit
git bisect good sha1_good_commit
git извлечет состояние по середине между хорошей и плохой версиями.
Если в этом состоянии по прежнему есть ошибка:
git bisect bad
Если работает, то
git bisect good
После окончания изменения надо выполнить
git bisect reset
Можно автоматизировать процесс тестирования командой:
git bisect run «perl testrun.pl»
Скрипт testrun.pl должен возвращать 0, если все хорошо.

импорт-экспорт истории:
git fast-import </tmp/history
git fast-export >/tmp/history

submodule
Позволяет добавлять посторонние репозитории в отдельную папку проекта.
Подробности git help submodule
Недостатки:
1. Команда git archive игнорирует субмодули
2. в рабочей копии после git checkout надо выполнять
git submodule update —init

subtree
История коммитов из внешнего проекта перенаправляется в подпапку с использованием стандартного механизма работы с внешними ветками.
git remote add -f creocms /path/to/creocms
git merge -s ours —no-commit creocms/master
git read-tree —prefix=creocms/ -u creocms/master
git commit -m «Merge creocms»
Изменения из creocms вытягиваются командой:
git pull -s subtree creocms master
В каждой рабочей копии надо выполнять
git remote add -f creocmms /path/to/creocms
И в каждой новой ветке:
git fetch creocms