Содержание
git
Команды:
- add — добавить файл или папку в репозиторий git;
- am — применить все патчи из email;
- archive — создать архив файлов;
- bisect — использовать бинарный поиск для поиска нужного коммита;
- branch — управление ветками проекта;
- bundle — перемещение объектов и ссылок в архиве;
- checkout — переключение между ветками;
- cherry-pick — внести изменения в уже существующие коммиты;
- clean — удалить все неотслеживаемые файлы и папки проекта;
- clone — создать копию удаленного репозитория в папку;
- commit — сохранить изменения в репозиторий;
- diff — посмотреть изменения между коммитами;
- fetch — скачать удаленный репозиторий;
- init — создать репозиторий;
- merge — объединить две ветви;
- pull — интегрировать удаленный репозиторий с локальным;
- push — отправить изменения в удаленный репозиторий;
- tag — управление тегами;
- worktree — управление деревнями разработки.
Локальный репозиторий
Для создания проекта необходимо создать директорию и инициализировать проект.
Создаём директорию проекта и файл 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
Очистка репозитория
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
Ошибки
fatal: couldn't find remote ref
Решение:
git config --unset-all remote.origin.fetch git fetch --prune --all
fatal: The upstream branch of your current branch does not match the name of your current branch
Решение:
git branch --unset-upstream
Ссылки
https://losst.ru/kak-polzovatsya-git-dlya-nachinayushhih
https://habrahabr.ru/post/323234/ - Безболезненное разрешение Merge конфликтов в Git
