Git
Первоначальная конфигурация
git config --global user.name "name"
git config --global user.email "email"
git config --global core.editor "nano"
git config --global core.autocrlf true # автоматически конвертирует CRLF в LF и обратно
Создание
$ git init <название проекта>
$ git clone <url-адрес>
Синхронизация
git status
git fetch [remote] # скачивает историю с удаленного репозитория
git merge [remote]/[branch] # сливает изменения из ветки удаленного репозитория в текущую ветку локального
git pull # сочетание git fetch и git merge
git pull --rebase
Индексация
git add .
git add *
git add -A
Отмена изменений
Отмена локальньных изменений
git commit --amend # поменять название последнего коммита
git add <file>
git commit --amend # добавить файл к последнему коммиту
git reset # отменить индексирование
git reset --soft HEAD^ # отменить последний коммит (изменения останутся в индексе)
git reset --soft <commit_hash> # откатиться до конкретного коммита (изменения останутся в индексе)
git reset --hard # отменить все изменения и откатиться
git checkout -- <filename> # вернуться к версии файла
git reset --hard origin/master # сбросить ветку до текущего состояния другой ветки
Отмена общих изменений
git revert HEAD -> отменить коммит
git revert HEAD --no-edit -> отменить без редактирования
если произошли конфликты git status
git revert --continue
git revert --abort -> отменить процесс реверта
добавить или удалить конфликтные файлы git add/rm, затем закоммитить
git checkout 03ecdd7
git checkout HEAD
git checkout HEAD^
git checkout HEAD^^^
git checkout HEAD~6
История
git log --pretty=oneline
git log --pretty=oneline --all -> ???
git log --pretty=oneline --graph
git log --pretty=format:'%h %ad | %s%d' --date=short
git log master..feature # показать какие коммиты есть в ветке feature, но нет в master
git log master.. # не обязательно указывает feature ветку, если git уже находится на ней
Сохранение фрагментов
git stash # временно сохраняет все незафиксированные изменения отслеживаемых файлов
git stash push -u -m "Message" # с учетом неотслеживаемых файлов и сообщением
git stash list # выводит список всех временных сохранений
git stash apply # восстанавливает состояние ранее сохранённых версий файлов
git stash pop # восстанавливает состояние ранее сохранённых версий файлов и удаляет их из сохранений
git stash drop # сбрасывает последние временно сохраненныe изменения
git stash show # показать информацию о последнем временном сохранении
git stash show -p # показать подробную информацию о последнем временном сохранении
git stash apply|pop|drop|show <stash@{2}> # производит действие с выбранным сохранением
git stash --keep-index # не учитывает stage файлы
Слияние коммитов - сквош
Заранее лучше указать предпочитаемый редактор, чтобы vim не застал врасплох.
git rebase -i HEAD~6 # количество коммитов для сквоша
Затем в интерактивном режиме пометить сливаемые коммиты меткой “squash” или просто “s”. Коммиты идут не как в git log, а от более раннего к позднему, поэтому первый коммит оставляем “pick”, а все остальные помечаем. Сохраняем изменения. В новом окне удаляем лишние названия коммитов, оставляя одно. Сохраняем изменения.
git reset --soft `git merge-base HEAD <base-branch>` # работает в gnu окружении из-за вызова
# git merge-base возвращает хеш подходящего для слияния коммита
Ветки
git branch # вывести список всех веток
git branch <newbranch> # создать новую ветку
git checkout <newbranch> # перейти на ветку
git checkout -b <newbranch> # сокращение для предыдущих двух
git push -u origin <newbranch> # добавить ветку на github
# -u is short for --set-upstream option
Слияние
merge
git merge <branch> # сливает изменения из указанной ветки в текущую ветку
cherry-pick
Команда git cherry-pick используется для того чтобы взять изменения, внесённые каким-либо коммитом, и попытаться применить их заново в виде нового коммита наверху текущей ветки. Это может оказаться полезным чтобы забрать парочку коммитов из другой ветки без полного слияния с той веткой.
git cherry-pick <commitnumber>
Алиасы
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"
Уход за репозиторием
В больших репозиториях при переключении с ветки на ветку, коммитах, ребейзе может появляться сообщение
Auto packing the repository for optimum performance
В этот момент запустится сборщик мусора. Отключить его запуск можно командой
git config gc.auto 0
git config --unset gc.auto # вернуть обратно
Credential manager
Если логин и пароль перестал приниматься интерактивным вводом и сохраняться в системе, то стоит обновить сам git
git update-git-for-windows
git update # для остальных систем