Skip to content

Instantly share code, notes, and snippets.

@Alex-Space
Last active August 10, 2021 09:18
Show Gist options
  • Save Alex-Space/eb34d8db38d41b9a19ba to your computer and use it in GitHub Desktop.
Save Alex-Space/eb34d8db38d41b9a19ba to your computer and use it in GitHub Desktop.
doc GIT
git config --global user.name "Alex-Space"
git config --global user.email "[email protected]"
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 --diff-filter=D --summary - посмотреть удаленные файлы
git checkout ХЭШ_КОММИТА_КОМАНДЫ_СВЕРХУ^ --названиеФайла - восстановить удаленный файл
git clone -b <branch> <repo> - скачать именно из конкретной ветки проект
git checkout --orphan <branchname> -
git remote -v - узнать с каким удаленным репозиторием связан наш проект
git config --list - вывести все настройки в Гите (в том числе к какому удаленному репозиторию подключена папка)
git help название команды - по которой хотим получить помощь и описание
git init - инициализировать гит в папке, в которой мы находимся
git status - показать статус нашего текущего проекта
git add (пишем файлы, которые добавляем) - добавить в индекс
git commit -m "комментарий коммита" - закоммитить все что в индексе
git log - посмотреть все коммиты, которые были
git remote add origin (ссылка) - добавить удаленный репозиторий, на который будут отправлены наши коммиты
git push -u origin master - отправить наш проект с компа в репозиторий Гитхаба, который указывали сверху. Флаг u означает, что мы запоминаем параметры, что в следующий раз написав git push, он отправит данные в репозиторий origin и ветку master
git pull origin master - эта команда стянет репозиторий origin и ветку master
git diff HEAD - если кто-то поработал с нашим репозиторием и что-то поменял там, мы хотим проверить какие изменения там были произведены
git reset (путь или имя файла) - сбрасывает его из индекса, если мы добавили его туда, но не успели закоммитить
git branch (имя ветки) - создание новой ветки
git checkout (имя ветки) - перейти на созданную ветку
git rm (указание файлов) - удаление из гита
git branch -d <branch name> - удаление ветки
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
http://www.youtube.com/watch?v=BBzHl_j86bc - как сгененировать и использовать SSH ключ на GitHub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment