TouchAI
2/19/2018 - 5:03 PM

git

git

Git
Зафиксированный - файл уже сохранён в вашей локальной базе
Изменённым - файлы, которые поменялись, но ещё не были зафиксированы
Подготовленные - это изменённые файлы, отмеченные для включения в следующий коммит.
Git directory working directory staging area
1 Вы вносите изменения в файлы в своём рабочем каталоге.
2 Подготавливаете файлы, добавляя их слепки в область подготовленных файлов.
3 Делаете коммит, который берёт подготовленные файлы из индекса и помещает их в каталог Git'а на постоянное хранение.

--global - файл .gitconfig в каталоге $HOME (C:\Documents and Settings\$USER или C:\Users\$USER для большинства пользователей)

 указать ваше имя и адрес электронной почты
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

 выбрать текстовый редактор, который будет использоваться
$ git config --global core.editor code

встроенная diff-утилита, которая будет использоваться для разрешения конфликтов слияния
git config --global merge.tool diffuse

 проверить используемые настройки
$ git config --list

проверить значение конкретного ключа
$ git config user.name

 открыть страницу руководства по любой команде
$ git help <команда> например $ git help config

начать использовать Git для существующего проекта
$ git init

добавить под версионный контроль существующие файлы
$ git add *.c
$ git add .  $ git add --all

коммит
$ git commit -m 'initial project version'

клонирование существующего репозитория в каталог grit
$ git clone git://github.com/schacon/grit.git

клонирование существующего репозитория в каталог отличный от grit
$ git clone git://github.com/schacon/grit.git mygrit

 для определения, какие файлы в каком состоянии находятся 
$ git status

 начать отслеживать (добавить под версионный контроль) новый файл или проиндексировать существующий
$ git add filename

git add -u подготовка удаленных файлов

файл .gitignore   

*.[oa]  -  игнорировать любые файлы заканчивающиеся на .o или .a  
*~  игнорировать все файлы заканчивающиеся на тильду (~)
Пример:
# комментарий — эта строка игнорируется
*.a # не обрабатывать файлы, имя которых заканчивается на .a
!lib.a # НО отслеживать файл lib.a, несмотря на то, что мы игнорируем все .a файлы с помощью предыдущего правила
/TODO # игнорировать только файл TODO находящийся в корневом каталоге, не относится к файлам вида subdir/TODO
build/ # игнорировать все файлы в каталоге build/
doc/*.txt # игнорировать doc/notes.txt, но не doc/server/arch.txt
doc/**/*.txt # игнорировать все .txt файлы в каталоге doc/

непосредственно добавленные и удалённые строки — собственно заплатку (patch).
(сравнивает содержимое вашего рабочего каталога с содержимым индекса)
$ git diff

посмотреть, что вы проиндексировали и что войдёт в следующий коммит
$ git diff --cached 

эта команда сравнивает ваши индексированные изменения с последним коммитом
$ git diff --staged

$ git commit

Для ещё более подробного напоминания, что же именно вы поменяли
$ git commit -v

Комментарий для коммита в командной строке
$ git commit -m "Story 182: Fix benchmarks for speed"

заставляет Git автоматически индексировать каждый уже отслеживаемый на момент коммита файл
$ git commit -a 

удалить его из отслеживаемых файлов (точнее, удалить его из вашего индекса) 
$ git rm

 принудительное удаление проиндексированного файла
$ git rm -f 

 это удалить файл из индекса
$ git rm --cached readme.txt

Эта команда удаляет все файлы, которые имеют расширение .log в каталоге log/
$ git rm log/\*.log

Эта команда удаляет все файлы, чьи имена заканчиваются на ~
$ git rm \*~

переименовать файл в Git
$ git mv file_from file_to
(эквивалентно 
$ mv README.txt README
$ git rm README.txt
$ git add README)

список коммитов созданных в данном репозитории в обратном хронологическом порядке
$ git log
$ git log -p 
$ git log --pretty=oneline
$ git log --pretty=oneline --max-count=2
$ git log --pretty=oneline --since='5 minutes ago'
$ git log --pretty=oneline --until='5 minutes ago'
$ git log --pretty=oneline --author=<your name>
$ git log --pretty=oneline --all
$ git log --all --pretty=format:"%h %cd %s (%an)" --since='7 days ago'
$ git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short

что ограничит вывод до 2-х последних записей
$ git log -p -2

получить дельту по словам
$ git log -p --word-diff 

 получить некоторую краткую статистику по каждому коммиту
$ git log --stat

граф веток
$ git log --graph -all 

$ git log --oneline --graph

--pretty=oneline выводит каждый коммит в одну строку, что удобно если вы просматриваете большое количество коммитов.
short, full, и fuller, практически не меняя формат вывода, позволяют выводить меньше или больше деталей
format:"%h - %an, %ar : %s" свой формат вывода лога
$ git log --pretty=format:"%h - %an, %ar : %s" 

 список коммитов, сделанных за последние две недели
$ git log --since=2.weeks 

сделать этот коммит ещё раз
$ git commit --amend 
пример - в результате один коммит
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

НЕ создает новый коммит а заменяет страый
git commit --amend -m "Add an author/email comment"

отмена индексации файл
$ git reset HEAD benchmarks.rb

Отмена изменений файла и возращение его к состоянию предыдущего коммита
$ git checkout -- benchmarks.rb

откат до коммита
$ git checkout <hash>

просмотреть, какие удалённые серверы у вас уже настроены
$ git remote 

просмотреть, какие удалённые серверы у вас уже настроены и их URL
$ git remote -v 

добавление нового удаленного репозитория
$ git remote add name url

извлечь (fetch) всю информацию, которая есть в репозитории 
$ git fetch pb 
$ git fetch [имя удал. сервера]
$ git fetch origin

автоматически извлекает и затем сливает данные из удалённой ветки в вашу текущую ветку
$ git pull  

отправить (push) их в главный репозиторий
$ git push [удал. сервер] [ветка]

получить побольше информации об одном из удалённых репозиториев
$ git remote show origin  

Просмотр имеющихся меток
$ git tag

поиск по шаблону
$ git tag -l 'v1.4.2.*'

Создание аннотированной метки, Опция -m задаёт меточное сообщение
$ git tag -a v1.4 -m 'my version 1.4'

 посмотреть данные метки
$ git show v1.4

посмотреть данные коммита
$ git show b10cc123

Легковесная метка
$ git tag v1.4-lw

 возможно помечать уже пройденные коммиты
$ git tag -a v1.2 -m 'version 1.2' 9fceb02

удаление тега
$ git tag -d v1-beta

отправляет метки на удалённые серверы
$ git push origin v1.5

 все ваши метки отправятся на удалённый сервер
$ git push origin --tags

 создадим новую ветку под названием testing
$ git branch testing

создать и перейти на ветку
$ git checkout -b style

 перейти на существующую ветку
$ git checkout testing

откатить один файл до заданного коммита
$ git checkout 09bd8cc1 hello.txt

объединить эту ветку и свой master
$ git checkout master
$ git merge iss53

удалить ветку
$ git branch -d iss53

список веток,  * указывает на ветку, на которой вы находитесь в настоящий момент.
$ git branch

посмотреть последний коммит на каждой из веток
$git branch -v

посмотреть те ветки, которые вы уже слили
ветки из этого списка, перед которыми нет символа *, можно смело удалять командой git branch -d
$git branch --merged

все ветки, содержащие наработки, которые вы пока ещё не слили в текущую ветку
$git branch --no-merged

просмотр всех веток, в том числе на удаленном репозитории
$ git branch -a 

Команда изменяет текущую ветку. Переданный параметр - это просто указатель на новое начало коммитов. 
Пересоздаются (копируются) коммиты из диапазона [BRANCH or SHA1]..HEAD . 
$git rebase [BRANCH or SHA1]
пример
git checkout develop
git pull
git checkout feature/A/super_code
git rebase develop

Алиасы
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"
git config --global alias.type 'cat-file -t'
git config --global alias.dump 'cat-file -p'

В файле .gitconf
[alias]
  co = checkout
  ci = commit
  st = status
  br = branch
  hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
  type = cat-file -t
  dump = cat-file -p
  
 отмена коммита
 $ git revert HEAD --no-edit - последнего коммита
 
 отмена заданного коммита
 $ git revert b10cc123
 
 отмена коммитов до заданного тега 
 git reset --hard v1
 Параметр --hard указывает, что рабочий каталог должен быть обновлен в соответствии с новым head ветки.
 
 git reset --hard {{some-commit-hash}} — вернуться на определённый коммит в истории.
 Все изменения, сделанные после этого коммита пропадут.
 
 git reset {{some-commit-hash}} — вернуться на определённый коммит в истории. 
 Все изменения, сделанные после этого коммита, получат состояние «Not staged for commit».
 Чтобы вернуть их обратно, нужно использовать команды git add и git commit.
 
 git reset --soft {{some-commit-hash}} — вернуться на определённый коммит в истории. 
 Все изменения, сделанные после этого коммита, получат состояние «Staged for commit». 
 Чтобы вернуть их обратно, нужно использовать команду git commit.
 Например чтобы взять три последних коммита и слить их в один большой коммит
 
 git checkout forget-my-changes.js. Это как git reset --hard, только для конкретного файла.
 
 Сравнить два файла
 git diff some-branch some-filename.js
 
 получение обновлений и ребейз
 git pull --rebase
 
 
 git push -f
 
 git diff HEAD
 
 
 git pull эквивалентно
 git fetch
 git merge origin/master
 
 Добавьте локальную ветку, которая отслеживает удаленную ветку
 git branch --track style origin/style
 
 создание чистого репозитория для расшаривания
 git clone --bare hello hello.git
 
 добавление удаленного репозитория
 git remote add shared ../hello.git
 
 
 git remote add shared ../hello.git
git branch --track shared master
git pull shared master


 git difftool -d
 git config --global diff.tool meld
 
 git diff -w - игнорировать пробелы
git config --global merge.tool meld

git branch -a - выводит все ветки, в том числе удаленные

git reflog изменения HEAD в хронологическом порядке

git log -g  вывод лога для записей из reflog

rm -Rf .git/logs/ - удаление рефлога

git fsck - проверка целостности
git fsck --full показаны все объекты, недостижимые из других объектов