Инструкция по работе с Git

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
github.png





 
Последнее редактирование:

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Глоссарий терминов для Git

  • Git или Гит — система контроля и управления версиями файлов.
  • GitHub или Гитхаб — веб-сервис для размещения репозиториев и совместной разработки проектов.
  • Репозиторий Git — каталог файловой системы, в котором находятся: файлы конфигурации, файлы журналов операций, выполняемых над репозиторием, индекс расположения файлов и хранилище, содержащее сами контролируемые файлы.
  • Локальный репозиторий — репозиторий, расположенный на локальном компьютере разработчика в каталоге. Именно в нём происходит разработка и фиксация изменений, которые отправляются на удалённый репозиторий.
  • Удалённый репозиторий — репозиторий, находящийся на удалённом сервере. Это общий репозиторий, в который приходят все изменения и из которого забираются все обновления.
  • Форк (Fork) — копия репозитория. Его также можно рассматривать как внешнюю ветку для текущего репозитория. Копия вашего открытого репозитория на Гитхабе может быть сделана любым пользователем, после чего он может прислать изменения в ваш репозиторий через пулреквест.
  • Обновиться из апстрима — обновить свою локальную версию форка до последней версии основного репозитория, от которого сделан форк.
  • Обновиться из ориджина — обновить свою локальную версию репозитория до последней удалённой версии этого репозитория.
  • Клонирование (Clone) — скачивание репозитория с удалённого сервера на локальный компьютер в определённый каталог для дальнейшей работы с этим каталогом как с репозиторием.
  • Ветка (Branch) — это параллельная версия репозитория. Она включена в этот репозиторий, но не влияет на главную версию, тем самым позволяя свободно работать в параллельной. Когда вы внесли нужные изменения, то вы можете объединить их с главной версией.
  • Мастер (Master) — главная или основная ветка репозитория.
  • Коммит (Commit) — фиксация изменений или запись изменений в репозиторий. Коммит происходит на локальной машине.
  • Пул (Pull) — получение последних изменений с удалённого сервера репозитория.
  • Пуш (Push) — отправка всех неотправленных коммитов на удалённый сервер репозитория.
  • Пулреквест (Pull Request) — запрос на слияние форка репозитория с основным репозиторием. Пулреквест может быть принят или отклонён вами, как владельцем репозитория.
  • Мёрдж (Merge) — слияние изменений из какой-либо ветки репозитория с любой веткой этого же репозитория. Чаще всего слияние изменений из ветки репозитория с основной веткой репозитория.
  • Кодревью — процесс проверки кода на соответствие определённым требованиям, задачам и внешнему виду.
 
Последнее редактирование:
  • Спасибо
Благодарности: conler, Lord_X, hyperion70 и 2 других

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Основные команды при работе с Git

Создаём новый репозиторий:
Код:
git init project-name
project-name имя вашего репозитория

Добавляем файл в репозиторий:
Код:
git add file.txt

Удаляем файл из репозитория:
Код:
git rm file.txt

Смотрим текущую ситуацию в репозитории (конфликты/изменения/и тд):
Код:
git status

Делаем коммит:
Код:
git commit -m "Commit description"
Commit description = имя вашего коммита

Делаем коммит если хотим ввести его описание через редактор:
Код:
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
some_branch - имя ветки

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

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

Получаем список веток, с которыми работаем:
Код:
git branch
Звездочкой отмечена текущая ветвь

Просмотреть все существующие ветви:
Код:
git branch -a

Замержить some_branch в текущую ветку:
Код:
git merge some_branch
some_branch - имя ветки

Удалить бранч (после мержа):
Код:
git branch -d some_branch
some_branch - имя ветки

Просто удалить бранч (тупиковая ветвь):
Код:
git branch -D some_branch
some_branch - имя ветки

История изменений:
Код:
git log

История изменений в обратном порядке:
Код:
git log --reverse

История конкретного файла:
Код:
git log file.txt

Аналогично предыдущему, но с просмотром сделанных изменений:
Код:
git log -p file.txt

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

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

Посмотреть, кем в последний раз правилась каждая строка файла:
Код:
git blame file.txt

Удалить бранч из репозитория на сервере:
Код:
git push origin :branch-name
branch-name - имя ветки

Откатиться к конкретному коммиту (хэш смотрим в «git log»):
Код:
git reset --hard id коммита

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

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

Просмотр изменений (суммарных, а не всех по очереди, как в «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
some_tag - хэш коммита

Удаление untracked files:
Код:
git clean -f

«Упаковка» репозитория для увеличения скорости работы с ним:
Код:
git gc
 
Последнее редактирование:

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Конфигурирование Git

  • Для создания и редактирования сообщений коммитов и меток Git по умолчанию использует тот редактор, который установлен текстовым редактором по умолчанию в вашей системе. Чтобы это изменить делаем:
    Код:
    git config --global core.editor emacs
    emacs - вместо него может быть любой редактор, например, gedit
  • Делаем шаблон для коммитов:
    Создаём, например, $HOME/.gitmessage.txt с таким содержимым:

    заголовок

    что произошло
    Теперь чтобы заставить git использовать этот шаблон по умолчанию делаем:
    Код:
    git config --global commit.template $HOME/.gitmessage.txt
    git commit
    Теперь при создании коммита на экране будет что-то на подобии:
    заголовок

    что произошло

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    #
    # modified: lib/test.rb
    #
    ~
    ~
    ".git/COMMIT_EDITMSG" 14L, 297C
  • Раскрашиваем вывод терминала при работе с git
    Код:
    git config --global color.ui true
    Если нужно более задать параметры раскрашивания команд делаем так:
    Код:
    git config --global color.branch true
    git config --global color.diff true
    git config --global color.interactive true
    git config --global color.status true
    Также можно задать цвет вывода информации:
    Например, чтобы получить информацию в выводе команды diff в синем цвете с чёрным фоном и жирным шрифтом
    Код:
    git config --global color.diff.meta “blue black bold”
    Возможные цвета:
    • normal
    • black
    • red
    • green
    • yellow
    • blue
    • magenta
    • cyan
    • white
 
  • Спасибо
Благодарности: Lord_X, hyperion70 и Matrixx

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Конфигурирование Git через .gitconfig
  • Делаем подсветку вывода:
    Код:
    [color]
            ui = true
  • Добавляем шаблон коммита:
    Код:
    [commit]
            template = ~/.gitmessage.txt
    У gitmessage.txt содержимое может быть любым
  • Чтобы каждый раз не вводить имя и пароль при работе Git определёное время делаем так:
    Код:
    [credential]
            helper = cache --timeout=<время>
    Где <время> это время заданное в секундах, например, 3600
  • Делаем более короткие и удобные имена команд при работе с Git:
    Код:
    [alias]
        cd = checkout
        dir = branch
        mersq = merge --squash
        free = branch -D
    Команды могут быть любыми.
 
  • Спасибо
Благодарности: Lord_X, hyperion70 и Matrixx

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Шифрование в Git

Если вы захотели воспользоваться публичным ресурсом вроде GitHub или GoogleDrive для хранения своего репозитория, но при этом не готовы делиться со всем миром результатами своего труда, то вам поможет шифрование файлов в гит-репозитории.

Настройка git:

Для начала мы должны разобраться с тем, что именно мы хотит шифровать в дереве. Создадим файл в корне пустого репозитория .gitattributes:
Код:
* filter=openssl diff=openssl
.git* !filter !diff
init.txt !filter !diff
Так мы зашифруем всё репо.

А так мы зашифруем отдельные файлы, например, .java
Код:
*.java filter=openssl diff=openssl
.git* !filter !diff
init.txt !filter !diff

Теперь создадим файл init.txt у себя в репо:
Код:
#This is protected repository. To initialize it you need:
#
# git clone -n https://github.com/<your_project_name>
# git checkout tags/init
# Then execute in shell:
# . init.txt <password for repository>
[ -z "$1" ] && echo "Argument required: <password>" && return
git config filter.openssl.clean "openssl enc -base64 -aes-256-ecb -S 123456789 -k $1"
git config filter.openssl.smudge "openssl enc -d -base64 -aes-256-ecb -k $1"
git config diff.openssl.textconv "openssl enc -d -base64 -aes-256-ecb -k $1 2&>/dev/null || cat"
git checkout master
Где <your_project_name> - ваш проект, $1 - пароль для репозитория.
Затем вводим команды:
  • git config filter.openssl.clean "openssl enc -base64 -aes-256-ecb -S 123456789 -k $1"
  • git config filter.openssl.smudge "openssl enc -d -base64 -aes-256-ecb -k $1"
  • git config diff.openssl.textconv "openssl enc -d -base64 -aes-256-ecb -k $1 2&>/dev/null || cat"
Где $1 - пароль для репозитория.
Теперь добавим это всё в репозитарий:
  • git add .
  • git commit -m "protection initialization"
  • git push
  • git tag init
  • git push --tags
 
  • Спасибо
Благодарности: hyperion70 и Matrixx

andrwgldmn

rm -rf /*
22.12.2018
100
194
100
23
Киев
github.com
Устройство
iPhone SE
Типичные ошибки при работе с git и способы их решения

Ошибка в комментарии к коммиту:

Если коммит еще не был отправлен на сервер (push), то можно воспользоваться простой командой, позволяющей редактировать текст сообщения к последнему коммиту.

Код:
git commit --amend

Как отменить последний коммит?

Можно использовать git reset, вот так:

Код:
git reset --hard HEAD~1

HEAD~1 означает один коммит до HEAD т.е. до текущего положения. Стоит заметить, что это “ядерный” способ, который отменит все изменения. Если вам нужно сохранить всё, что вы сделали, но еще не успели закоммитить, используйте:

Код:
git reset --soft HEAD~1

Удалить ветку на сервере:

Код:
git push origin --delete имя_ветки

В чём разница между “git pull” и “git fetch”?

git pull — это по сути git fetch после которого сразу же следуюет git merge. git fetch получает изменения с сервера и сохраняет их в refs/remotes/. Это никак не влияет на локальные ветки и текущие изменения. А git pull уже вливает все эти изменения в локальную копию.

Как отменить “git add” до коммита?

Вы выполнили git add имя_файла случайно и хотите отменить добавление этого файла. Если коммит еще не был сделан, то поможет:

Код:
git reset имя_файла

Как разрешать конфликты слияния?

Используйте
Код:
git mergetool
, которая предоставляет удобный интерфейс для разрешения конфликтов.


Удалить все локальные файлы и директории, которые не отслеживаются гитом из вашей текущей копии:

Осторожно! Лучше сделайте бэкап перед этим.

Код:
git clean -f -d

Клонировать все ветки с сервера:

Скорее всего, вы это уже сделали, а ветки просто скрыты. Вот команда, чтобы показать их все:

Код:
git branch -a

Можно использовать git checkout origin/имя_ветки, чтобы посмотреть на нужную ветку. Или git checkout -b имя_ветки origin/имя_ветки, чтобы создать локальную ветку, соответствующую удалённой.

Переименовать локальную ветку:

Код:
git branch -m oldname newname

Вернуться к любому коммиту:

Можно использовать reset, как показано ранее, но это будет означать, что вы хотите навсегда вернуться к тому состоянию, в котором вы были, а не просто посмотреть на него (для этого надо сделать checkout). Идентификатор коммита должен быть такой, как он прописан в выводе команды git log.

Код:
git reset --hard идентификатор_коммита

Еще раз повторю, что это отменит все текущие изменения, так что убедитесь, что это действительно то, что вам нужно. Или используйте --soft вместо --hard.

Удалить подмодуль (submodule):

Создание подмодулей используется довольно редко, но иногда они всё таки нужны. Так что вот что вам нужно:

Код:
git submodule deinit submodulename
git rm submodulename
git rm --cached submodulename
rm -rf .git/modules/submodulename

Перезаписать локальные файлы во время git pull:

Вам снова поможет git reset:

Код:
git fetch --all
git reset --hard origin/master

Экспортирование исходников, аналогично “svn export”:

Используйте git archive, например так:

Код:
git archive --format zip --output /путь/к/файлу/файл.zip master

Отменить все изменения, кроме тех, что уже добавлены в планируемый коммит:

Код:
git checkout -- .

Создать новую ветку на сервере из текущей локальной ветки:

Код:
git config --global push.default current
git push -u

Восстановить удалённый файл:

Сначала нужно найти последний коммит, где файл еще существовал:

Код:
git rev-list -n 1 HEAD -- имя_файла

Потом восстановить этот файл:

Код:
git checkout найденный_коммит^ -- имя_файла

Вернуть один конкретный файл на состояние, в котором он был в каком-либо коммите:

Примерно как в прошлом примере, только чуть проще:

Код:
git checkout идентификатор_коммита имя_файла

Сделать так, чтобы git игнорировал изменения прав файлов:

Код:
git config core.fileMode false

Заставить git помнить пароль при работе с :

Для запоминания на 15 минут:

Код:
git config --global credential.helper cache

Можно настроить и более долгий период:

Код:
git config --global credential.helper "cache --timeout=XXXX"
 
  • Спасибо
Благодарности: Tichij, hyperion70 и Matrixx