Основные команды при работе с GIT

Оглавление

Фиксирование изменений всех файлов в папке одной командой

Если вы хотите добавить в коммит изменения сразу всех файлов в папке (в данном примере папка называется test-dir), то для этого используем следующую команду:

git add test-dir/

Переименовывание/перемещение файла

git mv name.txt new-name.txt

Отмена изменений в файле до последнего коммита

git restore name.file

Отмена коммита опубликованного в удаленном репозитории

Самая простая ситуация — отмена изменений. Фактически она сводится к созданию ещё одного коммита, который выполняет изменения противоположные тому коммиту, который отменяется. Руками создавать подобный коммит довольно сложно, поэтому в git добавили команду, автоматизирующую откат. Эта команда называется git revert:

git revert ИДЕНТИФИКАТОР

Команда revert может "отменять" не только последний коммит, но и любой другой коммит из истории проекта. Согласитесь, это очень круто. Без системы контроля версий о таком нельзя было и мечтать.

Удаление последнего коммита

Иногда удалить нужно только что сделанный по ошибке коммит. Конечно, и в этом случае подходит git revert, но так загрязняется история. Если этот коммит сделан был только сейчас и ещё не отправлялся на Github, то лучше сделать так, как будто бы этого коммита не существовало в принципе.

Git позволяет удалять коммиты. Это опасная операция, которую нужно делать только в том случае, если речь идет про новые коммиты, которых нет ни у кого, кроме вас.

Если коммит был отправлен во внешний репозиторий, например, на Github, то менять историю ни в коем случае нельзя, это сломает работу у тех, кто работает с вами над проектом.

Для удаления коммита используется команда git reset. Делается это так:

git reset --hard HEAD~

Последнего коммита больше не существует, но изменения, сделанные в нём, не пропали. Они находятся в рабочей директории для дальнейшей доработки.

git reset — мощная команда, имеющая множество различных флагов и способов работы. С её помощью удаляются или отменяются (без удаления) коммиты, восстанавливаются файлы из истории и так далее. Работа с ней относится к продвинутому использованию git, здесь же мы затрагиваем только самую базу.

Флаг --hard означает полное удаление. Без него git reset отменит коммит, но не удалит его, а поместит все изменения этого коммита в рабочую директорию, так что с ними можно будет продолжить работать. HEAD~ означает "один коммит от последнего коммита". Если бы мы хотели удалить два последних коммита, то могли бы написать HEAD~2.

Откат изменений в файле к определенному коммиту

Просматриваем историю коммита файла и копируем идентификатор нужного коммита

git log name.file

Вместо ИДЕНТИФИКАТОР вставляем идентификатор нужного коммита

git checkout ИДЕНТИФИКАТОР name.file

Скачать изменения с сервера из ветки master в текущую ветку

git branch test-branch      # переключаемся на нужную вертку (в данном примере test-branch)
git fetch origin            # получаем изменения из удаленного репозитория origin
git merge origin/master     # сливаем в текущую ветку изменения из master

Если есть конфликты, то правим их и выполняем git add конфликтующие_файлы, затем git rebase --continue

При этом коммиты вашей ветки окажутся наверху истории изменений.

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

git show d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4

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

git blame file.txt

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

git diff

Как правильно отправить PullRequest в чужой проект

  1. Сделайте форк репозитория, а затем клонируйте его в свою локальную среду разработки
git clone git@example.com:username/original-repo.git
  1. Добавьте основой репозиторий как удаленный (remote) с названием "upstream"

Перейдите в директорию куда вы сделали клон на первом шаге и выполните следующую команду:

git remote add upstream git://example.com/username2/original-repo.git
  1. Получите последние изменения кода из основного репозитория
git fetch upstream

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

  1. Создайте новую ветку основанную на текущей master ветке оригинального репозитория
git checkout upstream/master
git checkout -b 999-название-вашей-ветки
  1. Пишем код

Убеждаемся, что он работает :)

  1. Cделайте коммит изменений

Добавляем файлы c изменениями:

один файл

git add путь/до/вашего/файла.php

все измененные файлы

git add .

Если добавить в описание коммита номер тикета #XXX, тогда Git автоматически свяжет его с тикетом над которым вы работаете:

git commit -m "Описание коммита для тикета #42"
  1. Получите последние изменения кода из upstream (добавили на втором шаге)
git pull upstream master

Опять же таким образом убеждаемся, что ваша ветка содержит последние изменения. Если возникли конфликты, исправляем и снова комитим.

  1. Имея код без конфликтов отравьте изменения на git
git push -u origin 999-название-вашей-ветки
  1. Пришлите pull request в основной репозиторий

Перейдите в свой репозиторий на GitHub'e и нажмите "Pull Request", выберите свою ветку справа и добавьте описание вашего "Pull Request'a", чтобы GitHub автоматически связал его с тикетом добавьте в комментарий номер тикета '#999'.

  1. Ожидайте рассмотрения вашего кода

Кто-то рассмотрит ваш код и может быть попросит внести изменения, если это произошло возвращайтесь к 5 шагу.

  1. Удаление ветки

После того как ваш код приняли или отклонили вы можете удалить ветку из локального репозитория и GitHub'a

git checkout master
git branch -D 999-название-вашей-ветки
git push origin --delete 999-название-вашей-ветки

Все шаги кратко

git clone git@github.com:ваше-имя-пользователя/DocLister.git
git remote add upstream git://github.com/AgelxNash/DocLister.git
git fetch upstream
git checkout upstream/master
git checkout -b 999-название-вашей-ветки
### пишем код
### пишем код
### пишем код
### пишем код
### пишем код
git add путь/до/вашего/файла.php
git commit -m "Описание коммита для тикета #42"
git pull upstream master
git push -u origin 999-название-вашей-ветки

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

Работает и на уже push-нутых ветках, если потом делать git push --force. Последняя команда заменят ветку целиком, так что с ней надо быть особо осторожным.

git reset --soft HEAD~3
git commit -m 'new commit message'

Возможен еще вариант

D появившемся окне оставить p у тех комитов которые должны остаться, а s у тех которые должны приклеиться к верхним

git rebase -i HEAD~3

Как откатить изменений до коммита dd61ab23

git revert dd61ab23
git reset HEAD^ --hard
git push origin -f

Как преименовать уже пушнутый тег

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

Как переместить незакоммиченые изменения в новую ветку

git stash
git checkout -b название-новой-ветки
git stash pop
git push -u origin название-новой-ветки

Другие комманды связанные с прятаньем

git stash save "киллер-фитча" # спрятать с именем киллер-фитча
git stash list                               # показать все спрятанные блоки
git stash apply stash@{1}          # применить предпоследнее спрятанное изменение
git stash drop stash@{0}           # удалить последнее спрятанное изменение

Изменить автора последнего коммита

git commit --amend --author "AgelxNash <iam@agel-nash.ru>" --no-edit && git rebase --continue
git push origin master --force

Добавление файла к последнему коммиту

git add filename
git commit --amend --no-edit
git push -f

Если нужно просто изменить текст последнего коммита

git commit --amend
git push -f

Если изменения еще не запушены, то git push -f выполнять не нужно

Как создать ветку на основе PullRequest (вместо $id подставить номер PR)

git fetch origin pull/$id/head:pr-$id
git checkout pr-$id

Статьи и документации