Система контроля версий Git

Удаление незакоммиченных изменений

Например, мы находимся в репозитории, в ветке cursor. Изменений никаких нет:
image
Внесём в него изменения:


Проверим статус репозитория:

Чтобы вернуть файл к исходному состоянию, нужно ввести git restore <file>:
image
Произошёл откат изменения:

Если файл был добавлен в индекс, то его можно вернуть из индекса аналогичной командой git restore --stage <file>:


Если потребуется откатить это изменение, то нужно ввести git restore <file>:

Теперь внесём несколько изменений. Добавил атлас и в несколько файлов добавил новые строки кода:
image

image
Можем добавить какой-нибудь файл в индекс:

Чтобы удалить все незакоммиченные изменения, можно выполнить команду git reset --hard:
image
Но команда git reset --hard не удаляет ещё не отслеживаемые файлы и которые не добавлялись в индекс:

В этом случае, изменения можно удалить командой git clean -f:
image
image
Если вы вышеперечисленными способами удалите изменения, то восстановить их не получится.

Удаление файла из отслеживания системой контроля версией git:
Например, вы создали какой-то файл, закоммитили его, а потом добавили его в .gitignore. Git будет отслеживать его. И его нужно специальным образом удалить.
Создадим файл:


Закоммитим этот файл:

image
Внесём еще одно изменение в этот файл:


Для того, чтобы перестать отслеживать его системой контроля версией git. Добавим для начала этот файл в .gitignore:

Чтобы Git перестал отслеживать изменения в этом файле, его нужно удалить командой git rm --cached <file>:

После ввода команды git status мы видим, что этот файл удалён из отслеживания системой контроля версий. Но при этом он не удалён из проекта.

Изменим файл:

Этот файл не отслеживается:
image

Основные команды:
  • git restore <file>
    Отменяет изменения в указанном файле <file> в рабочей директории, восстанавливая его до состояния последнего коммита.

  • git restore --staged <file>
    Удаляет указанный файл из индекса (staging area), не затрагивая изменения в рабочей директории.

  • git reset --hard
    Сбрасывает рабочую директорию и индекс до состояния последнего коммита, удаляя все незакоммиченные изменения. Осторожно: данные теряются!

  • git clean -f
    Удаляет все неотслеживаемые файлы и директории из рабочей директории. Флаг -f подтверждает удаление.

  • git rm --cached <file>
    Удаляет указанный файл <file> из индекса (перестаёт отслеживаться), но оставляет его в рабочей директории.

Эти команды полезны для управления изменениями и очистки рабочей директории. Используй с осторожностью, особенно git reset --hard и git clean -f, так как они могут безвозвратно удалить данные.

Отмена закоммиченных изменений

Внесём изменения в файле:

Добавим в индекс, сделаем коммит:


Просмотрим историю коммитов:

Можем с помощью команды git diff <file1> <file2> просмотреть коммит:

Если нам нужно вернуть файл contoller.script к другой версии, мы можем выполнить команду git checkout, но указать не имя ветки, а имя коммита и имя этого файла:

Этот файл возвращен к версии указанного коммита и сразу добавлен в индекс.
Мы можем убрать эту версию файла из индекса с помощью команды git restore --staged <file>:
image

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


Если мы хотим отменить весь коммит целиком, то воспользуемся специальной командой git revert, с помощью неё можно отменить как последний коммит, как и любой предыдущий:

Нам предложат отредактировать сообщения коммита:



Можно посмотреть на историю коммитов и увидеть, что последний коммит отменяет другой коммит:

Если нужно отменить несколько коммитов, то это можно сделать последовательно, отменив команду

git revert --no-commit <hash>
git revert --no-commit <hash>


Список команд:

  • git checkout <commit> <file>
    Восстанавливает указанный файл в рабочей директории до состояния из заданного коммита . Изменения не индексируются.

  • git revert <commit>
    Создаёт новый коммит, который отменяет изменения, внесённые указанным коммитом . История сохраняется, изменения применяются и сразу коммитятся.

  • git revert --no-commit <commit>
    Отменяет изменения из указанного коммита , но не создаёт коммит автоматически. Изменения добавляются в индекс, позволяя вручную завершить revert.

Эти команды полезны для восстановления или отмены изменений в проекте. Используй revert для безопасной отмены коммитов в общей ветке, а checkout для выборочного восстановления файлов.

1 лайк

Отмена коммитов

HEAD в Git — это указатель на текущую позицию в репозитории, обычно ссылающийся на последний коммит в текущей ветке. Он определяет, с чем вы работаете в данный момент.

git reset --soft (или git reset --soft HEAD~1)

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

Предположим, у нас есть репозиторий, в который мы внесли изменения и затем закомитили эти изменения. Теперь сбросим эти изменения с помощью команды git reset --soft:
git:
image

Это приведёт к тому, что последний коммит отменится, а все изменения, которые были сброшены отправятся в индекс:

git reset --hard или git reset hard HEAD~1

Теперь снова закоммитим изменения:
image
image
Введём команду git reset HEAD~1:


~1 означает, что мы сбросим последний 1 коммит. Если бы мы написали ~2, то это означало бы, что нужно сбросить два последних коммита.
На этот раз, изменения файлов в репозитории сброшены до того состояния, будто они не добавлены в индекс:

git reset --hard

Теперь попробуем выполнить команду git reset --hard [hash-commit]:


Мы осуществили сброс до указанного коммита:

Никаких незакоммиченных изменений ни в индексах, ни в директории не осталось:

git commit --amend -m ‘new comments’

С помощью этой команды git commit --amend -m 'new commens' можно изменить сообщение последнего коммита:
Добавим изменения в какой-нибудь файл:



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

Текущее сообщение коммита:

Изменяем сообщение коммита:

Если забыли добавить какой-то файл в коммит, то можно воспользоваться коммандой git commit --amend --no-edit. Предположим, забыли добавить файл в коммит:


Нужно добавить этот файл в индекс:

Затем необходимо добавить этот файл в последний коммит:
image
Этот параметр --no-edit говорит о том, что вы не хотите редактировать сообщение коммита.

С помощью команды git diff можете просмотреть изменения:

Список команд

  • git reset --soft <commit>
    Перемещает HEAD на указанный <commit>, сохраняя изменения в индексе (staging area) и рабочей директории. Используется для отмены коммитов, но с возможностью повторного коммита изменений.
    Пример: git reset --soft HEAD~1

  • git reset --hard <commit>
    Перемещает HEAD на указанный <commit>, полностью удаляя изменения из индекса и рабочей директории после этого коммита. Безвозвратно теряет незакоммиченные изменения!
    Пример: git reset --hard HEAD~1

  • git reset --mixed <commit>
    (По умолчанию для git reset, если флаг не указан) Перемещает HEAD на указанный , снимает изменения из индекса (staging area), но оставляет их в рабочей директории как незакоммиченные. Используется для отмены коммитов и снятия файлов из индекса, сохраняя сами изменения для повторного редактирования.
    Пример: git reset --mixed HEAD~1

Основное отличие от других флагов:

  • --soft: Сохраняет изменения в индексе и рабочей директории.
  • --hard: Удаляет изменения из индекса и рабочей директории.
  • --mixed: Сохраняет изменения только в рабочей директории, очищая индекс.

git commit --amend
Заменяет последний коммит новым, включая текущие изменения в индексе. Можно изменить сообщение коммита или добавить новые изменения.
Пример: git commit --amend -m "Новое сообщение"

  • --no-edit
    Использует существующее сообщение последнего коммита без его изменения. Удобно, если нужно только добавить изменения в индексе к последнему коммиту, не меняя сообщение.
    Пример: git commit --amend --no-edit

Отмена слияния, переименование и удаление веток

Просмотрим список веток в репозитории:


Выполним слияние:

image

Отменить слияние можно с помощью команды git reset --merge <коммит до слияния>:

Другой вариант — слияние не произошло из-за конфликтов:


С помощью команды git merge --abort можно отменить слияние:
image

Переименование веток

Для того, чтобы переименовать ветку, нужно сначала на неё переключиться:
image
С помощью команды git branch -m <new_name> можно сменить имя ветке:
image

Удаление веток:

Перейти в какую-нибудь другую ветку, которую вы не собираетесь удалять:
image
Попробуем удалить ветку, с помощью команды git branch -d <имя ветки>:
image
Ошибка. Ветка полностью не влита в какую-нибудь ветку, можно воспользоваться предложенной командой из консоли и удалить ветку. А можно сделать слияние веток, после того, как исправим все конфликты. И только потом удалить ветку:
image

Краткое описание команд:

  • git reset --merge <commit>
    Перемещает HEAD на указанный , отменяет изменения в индексе и рабочей директории, но сохраняет незакоммиченные изменения, которые не конфликтуют с указанным коммитом. Используется для отмены слияния (merge) или других операций, сохраняя рабочие изменения.
    Пример: git reset --merge HEAD~1

  • git merge --abort
    Прерывает процесс слияния (merge) при возникновении конфликтов и возвращает репозиторий к состоянию до начала слияния. Удаляет временные изменения, связанные с merge.
    Пример: git merge --abort

  • git branch -m <new-name>
    Переименовывает текущую ветку в . Если указать git branch -m <old-name> <new-name>, переименовывает конкретную ветку.
    Пример: git branch -m feature new-feature

  • git branch -d <branch>
    Удаляет указанную ветку <branch>, если она полностью слита (merged) в текущую ветку или HEAD. Если ветка не слита, используйте -D для принудительного удаления.
    Пример: git branch -d feature