[Git] Шпаргалка по работе с Git

Привет, %username%! У меня голова для того, чтобы в неё есть, а вот запомнить последовательность комманд при коммите и пуше в Github со всеми тэгами и прочим я как то не осилил пока что.

Подготовка

Логично, что перед использованием git нам надо его установить.

brew install git

У меня яблочное пюре головного мозга и поэтому использую технику от огрызочной компании.

Следующим шагом нам необходимо создать пару ключей для корректной работы:

ssh-keygen
cat ~/.ssh/id_rsa.pub

Пользуемся

Заходим на свой github (все примеры будут на его основе ибо мне так хочется) и в свойствах аккуанта прописываем свой открытый ssh-ключ, после чего клонируем репозиторий:

cd ~/workplace/python
git clone git@github.com/jtprog/petproject.git
cd petproject

Создаем новый файл в репозитории:

echo "TODO: Add function for login to my magic API" > TODO.md

Добавляем новый файл на отслеживание:

git add TODO.md
git commit -a

Перед нами откроется окно текстового редактора - vim - где мы вводим описание наших изменений. Если мы не хотим описывать изменения в редакторе vim, можно указать всё в одной строке:

git commit -am 'Add new TODO;'

Затем можем залить наши изменения в удаленнй репозиторий:

git push origin master

Всё! На этом можно закончить! Да простят меня мудрые разработчики.

Всякие полезности

Мы хотим внести изменения в код и не уверены в себе - а вдруг всё сломается? Для таких ситуаций используются ветки:

git branch new_feature
git checkout new_feature

Работаем с этой веткой и пилим свою фичу. Если ничего хорошего не вышло, возвращаемся к основной - master - ветке:

git checkout master

Если вышло что-то хорошее, мержим ветку в master (о разрешении конфликтов поговорим позже):

git commit -a 
git checkout master
git merge new_feature

Периодически пушим наши изменения в Github:

git push origin

Если над кодом мы работаем не в одиночку, то нам необходимо периодически получать последнюю версию исходников от коллег:

git pull origin

Шпаргалка по командам

Ниже будет просто большая шпаргалка по коммандам git

Создать новый репозиторий:

git init project-name

Если вы планируете клонировать его по ssh с удаленной машины, также скажите:

git config --bool core.bare true

… иначе при git push вы будете получать странные ошибки вроде:

Refusing to update checked out branch: refs/heads/master
By default, updating the current branch in a non-bare repository
is denied, because it will make the index and work tree inconsistent
with what you pushed, and will require 'git reset --hard' to match
the work tree to HEAD.

Клонировать репозиторий с удаленной машины:

git clone git@github.com/jtprog/petproject.git

Если хотим пушить один код в несколько репозиториев:

git remote add remotename git@gitlab.mywork.ru:repo.git

Добавить файл в репозиторий:

git add text.txt

Удалить файл:

git rm text.txt

Текущее состояние репозитория (изменения, неразрешенные конфликты и тп):

git status

Сделать коммит:

git commit -a -m "Commit description"

Сделать коммит, введя его описание с помощью $EDITOR:

git commit -a

Замержить все ветки локального репозитория на удаленный репозиторий (аналогично вместо origin можно указать и remotename, см выше):

git push origin

Аналогично предыдущему, но делается пуш только ветки master:

git push origin master

Запушить текущую ветку, не вводя целиком ее название:

git push origin HEAD

Замержить все ветки с удаленного репозитория:

git pull origin

Аналогично предыдущему, но накатывается только ветка master:

git pull origin master

Накатить текущую ветку, не вводя ее длинное имя:

git pull origin HEAD

Скачать все ветки с origin, но не мержить их в локальный репозиторий:

git fetch origin

Аналогично предыдущему, но только для одной заданной ветки:

git fetch origin master

Начать работать с веткой some_branch (уже существующей):

git checkout -b some_branch origin/some_branch

Создать новый бранч (ответвится от текущего):

git branch some_branch

Переключиться на другую ветку (из тех, с которыми уже работаем):

git checkout some_branch

Получаем список веток, с которыми работаем:

git branch # звездочкой (*) будет отмечена текущая ветвь

Просмотреть все существующие ветви:

git branch -a # | grep something

Замержить some_branch в текущую ветку:

git merge some_branch

Удалить бранч (после мержа):

git branch -d some_branch

Просто удалить бранч (тупиковая ветвь):

git branch -D some_branch

История изменений:

git log

История изменений в обратном порядке:

git log --reverse

История конкретного файла:

git log file.txt

Аналогично предыдущему, но с просмотром сделанных изменений:

git log -p file.txt

История с именами файлов и псевдографическим изображением бранчей:

git log --stat --graph

Изменения, сделанные в заданном коммите:

git show 3fb23aba0b4ff4692b20ed9f69f6189e7033d262

Посмотреть, кем в последний раз правилась каждая строка файла:

git blame file.txt

Удалить бранч из репозитория на сервере:

git push origin :branch-name

Откатиться к конкретному коммиту (хэш смотрим в git log):

git reset --hard 3fb23aba0b4ff4692b20ed9f69f6189e7033d262

Аналогично предыдущему, но файлы на диске остаются без изменений:

git reset --soft 3fb23aba0b4ff4692b20ed9f69f6189e7033d262

Попытаться обратить заданный commit (но чаще используется branch/reset + merge):

git revert 3fb23aba0b4ff4692b20ed9f69f6189e7033d262

Просмотр изменений (суммарных, а не всех по очереди, как в git log):

git diff # подробнее в "git diff --help"

Используем vimdiff в качестве программы для разрешения конфликтов (mergetool) по умолчанию:

git config --global merge.tool vimdiff

Отключаем диалог “какой mergetool вы хотели бы использовать”:

git config --global mergetool.prompt false

Отображаем табы как 4 пробела, например, в git diff:

git config --global core.pager 'less -x4'

Создание глобального файла .gitignore:

git config --global core.excludesfile ~/.gitignore_global

Разрешение конфликтов (когда оные возникают в результате мержа):

git mergetool

Создание тэга:

git tag some_tag # за тэгом можно указать хэш коммита

Удаление untracked files:

git clean -f

“Упаковка” репозитория для увеличения скорости работы с ним:

git gc

Иногда требуется создать копию репозитория или перенести его с одной машины на другую. Это делается примерно так:

mkdir -p /tmp/git-copy && cd /tmp/git-copy
git clone --bare git@github.com:jtprog/petproject.git
cd petproject.git
git push --mirror git@gitlab.com:jtprog/petproject.git

Смею заметить - Git позволяет юзать короткую запись хэшей. Вместо ea480e3e932e2fd62c6a251d9c0db812c347cb04 можно писать ea480e3 или даже ea48.

На этом можно закончить. И так получилось многабукафф довольно объёмно.


Обсудить статью в чате TG или в Slack