Содержание

git

Команды:

Локальный репозиторий

Для создания проекта необходимо создать директорию и инициализировать проект.

Создаём директорию проекта и файл README.md:

mkdir -p ~/git/testing ; cd ~/git/testing
git init

Добавляем в него текущую директорию и делаем первую фиксацию изменений (commit), если в директории есть уже файлы:

git add .
git commit -m "Initial Commit" -a

Добавляем новый файл и делаем к нему комментарий:

touch README.md
git add README.md
git commit -m "Add file" README.md

Внешний репозиторий

Добавить внешний репозиторий:

git remote add origin http://git.domain.com/test/test.git

Список внешних репозиториев:

git remote -v

Отправка изменений:

git push origin master

Клонировать внешний репозиторий:

git clone http://git.domain.com/test/test.git

Клонировать одну ветку с одним последним коммитом:

git clone --depth 1 --single-branch --branch <BRANCHNAME> <REPO>

Добавить информацию об остальных ветках с одним последним коммитом:

git remote set-branches origin '*'
git fetch --depth 1

Клонировать репозиторий на определённый коммит:

git archive -o repo.tar --remote=git://${YOUR_GIT_REPO_URL} ${YOUR_GIT_HASH}

Ветви / Branch

Посмотреть все доступные ветви (звёздочка указывает на активную ветвь):

git branch -a

Создать ветвь develop:

git checkout -b develop

Создать ветвь develop от коммита:

git branch develop <hash>

Создать ветвь develop без коммитов:

git checkout --orphan develop

Переключиться между ветвями:

git checkout master
git checkout develop

Слияние

Слияние из ветки develop в основную:

git merge develop --no-ff

Слить ветку hostfix в мастер ветку:

git checkout master
git merge hotfix

Выйти из состояния слияния:

git merge --abort

Слить ветку master в develop без разрешения конфликтов с заменой файлов из master:

git checkout develop
git merge --strategy=recursive --strategy-option=theirs master

Удаление

Локально:

git branch -d develop

Удалённо:

git push origin --delete deploy

Tag

Добавить tag:

git tag $tag
git push origin $tag

Удалить tag:

git tag -d $tag
git push origin :$tag

https://stackoverflow.com/questions/18216991/create-a-tag-in-a-github-repository

Показать тэг по коммиту:

git name-rev --tags --name-only $sha

Показать коммит по тэгу:

git rev-list -n 1 $tag

Откат изменений

Проверить статус изменений:

git status

До add/rm

Восстановить файл:

git checkout filename

После add и до commit

git restore --staged <filename>

После commit

Откат изменений в репозитории на один коммит назад:

git reset --hard HEAD~1

Откат последнего коммита, но оставить изменения в рабочем каталоге и индексе:

git reset --soft HEAD~1

Откат до определенного коммита по хешу:

git reset --hard 68b0442abef93d5d08cf216b542ac30c389cb1f2

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

git push -f origin master

Отменить уже опубликованные коммиты с помощью новых коммитов

Откат до определенного коммита по хешу:

git revert 68b0442abef93d5d08cf216b542ac30c389cb1f2

Подтвердить откат и отправить изменения:

git commit -m "детальное описание, что и почему сделано"
git push

https://ru.stackoverflow.com/questions/431520/%D0%9A%D0%B0%D0%BA-%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%D1%81%D1%8F-%D0%BE%D1%82%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%8C%D1%81%D1%8F-%D0%BA-%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5-%D1%80%D0%B0%D0%BD%D0%BD%D0%B5%D0%BC%D1%83-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D1%83

Очистка репозитория

git clean -fdx

Изменить сообщение commit'а

git commit --amend -m "New commit message"
git push -f

https://stackoverflow.com/questions/179123/how-to-modify-existing-unpushed-commit-messages

Слияние

Слить ветку hostfix в master ветку:

git checkout master
git merge hotfix

Копирование одного файла

Показать файл $FILENAME из ветки $REVISION

git show $REVISION:$FILENAME

Перезаписать текущий файл $FILENAME из ветки $REVISION:

git restore -s $REVISION -- $FILENAME

Вернуть файлы к состоянию до слиянию:

git checkout HEAD~1 -- $FILENAME1 $FILENAME2

https://stackoverflow.com/questions/2364147/how-to-get-just-one-file-from-another-branch

diff

Показать отличия до add:

git diff

Показать отличия после add:

git diff --cached

Показать отличия, вывести только статус:

git diff --name-status branch1 branch2

Показать полностью изменения:

git diff branch1 branch2

Показать отличия между предпоследним коммитом:

git diff HEAD~1

Показать список отличающихся файлов:

git diff --stat branch2
git diff --stat branch1 branch2

git config

Имя пользователя и email в commit'е

Показать текущее значение user.name:

git config --global --get user.name
git config --get user.name

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

git config user.name "Your Name Here"
git config user.email your@email.com

Установить для (глобального) значения по умолчанию (в ~/.gitconfig):

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

Использование через прокси

Задать прокси сервер:

git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:3128

Удалить прокси сервер:

git config --global --unset http.proxy

Проверить прокси сервер:

git config --global --get http.proxy

Сохранить учётные данные

git config --global credential.helper store

Учётные данные по умолчанию сохраняются в ~/.git-credentials

submodule

В файле .gitmodules

Или инициализировать и обновить зарегистрированные подмодули до назначенного коммита в текущем репозитории:

git submodule update --init --recursive

Инициализировать все подмодули, для которых «git submodule init» до сих пор не вызывался перед обновлением и обновить из submodule репозитория:

git submodule update --init --recursive --remote

Переключиться на определённый commit, в директории сабмодуля:

git checkout <hash>

Просмотр изменений

Показать все изменения в файле:

git log -p docker-compose.yaml

или

gitk docker-compose.yaml

Показать изменения сделанные в ревизии:

git show bfaf2fdb855a99eee29ba49b1e27d78892e6d498 docker-compose.yaml

Показать историю файла в сокращённом виде:

git log --pretty=format:'%h %ai  %s' docker-compose.yaml

https://git-scm.com/docs/pretty-formats

Ошибки

fatal: couldn't find remote ref

Решение:

git config --unset-all remote.origin.fetch
git fetch --prune --all

https://stackoverflow.com/a/67200162/1884479

fatal: The upstream branch of your current branch does not match the name of your current branch

Решение:

git branch --unset-upstream

https://stackoverflow.com/questions/24864700/fatal-the-upstream-branch-of-your-current-branch-does-not-match-the-name-of-you

Ссылки

https://losst.ru/kak-polzovatsya-git-dlya-nachinayushhih
https://habrahabr.ru/post/323234/ - Безболезненное разрешение Merge конфликтов в Git