MyTetra Share
Делитесь знаниями!
Git - список примеров всех команд
Время создания: 21.02.2014 10:26
Раздел: Linux, компиляция, C/C++
Запись: xintrea/mytetra_db_harpokrat/master/base/1392964016mj7f8s23d0/text.html на raw.githubusercontent.com

Это краткое изложение часто используемых команд GIT. Это дополненная и обновленная версия. Для удобства работы все команды отформатированы и разбиты на разделы.



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 - кто и когда редактировал файл




Временные коммиты (работа с "карманом" stash):



git stash - сделать временный коммит рабочей папки



... поправить что-нибудь в другой ветке, переключиться обратно и 



git stash apply - вернуть рабочую папку обратно.


git status list - выводит список стешей, их может быть много, например:


git stash save "comment"


git stash apply stash@{1} - где stash@{1} - нужный стеш из git status list



Файл .gitignore - содержит список шаблонов файлов, история по которым не должна вестись в GIT. То есть это список файлов, которые не попадают в репозиторий. Например:



#пароли к бд

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 портит содержимое рабочей папки.



Rebase



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



Filter-branch


git filter-branch --tree-filter 'rm cgi-bin/MyConfig.pm' HEAD - Удалить файлы из всех коммитов

подробности в git help filter-branch.



Bisect - поиск коммита, в котором возникла ошибка



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


Так же в этом разделе:
 
MyTetra Share v.0.64
Яндекс индекс цитирования