# Удалим файл обычным образом
$ rm sample.txt
$ git status
On branch main
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: sample.txt
$ git add -A
# И вся последовательность команд выше эквивалентна всего одной:
$ git rm sample.txt
rm 'sample.txt'
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: sample.txt
# Осталось только сделать коммит, чтобы сохранить изменения:
$ git commit -m "L-04: Deleted sample.txt"
[main f34705a] L-04: Deleted sample.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 sample.txt
# Допустим у нас есть некоторый репозиторий, просмотрим статус файлов:
$ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
file_to_commit.txt
another_file_to_commit.txt
file_not_for_commit.txt
# Для простоты добавим все файлы в индекс разом
$ git add -A
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: file_to_commit.txt
new file: another_file_to_commit.txt
new file: file_not_for_commit.txt
# А теперь восстановим файл “file_not_for_commit.txt” в области индекса. Тогда источником станет последний коммит, а в нем такого файла нет (файл же новый). Поэтому файл будет удален из области индекса. Кстати, можно заметить, что даже Git подсказывает нам: “use "git restore --staged <file>..." to unstage”.
$ git restore --staged file_not_for_commit.txt
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: another_file_to_commit.txt
new file: file_to_commit.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
file_not_for_commit.txt
# Для справки: в данном случае эквивалентной командой будет:
$ git rm --cached file_not_for_commit.txt
rm 'file_not_for_commit.txt'
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: another_file_to_commit.txt
new file: file_to_commit.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
file_not_for_commit.txt
$ git checkout HEAD~2
Note: switching to 'HEAD~2'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 90abf7e L-04: Fixing gradient bug
$ git log --pretty=oneline
90abf7ef211229adfa4cb75e0f35a0561dd15467 (HEAD) L-04: Fixing gradient bug
3a3bb706651a19013822c09e5c70c9fc425a66dc L-04: Adding gradient function
d469222a7a760daa3cd56747e216e3de2a3343ee L-04: Initial commit
$ git log --all --pretty=oneline
62aa1ffe0587c7ffa3d865a3233da04d65818030 (main) L-04: Adding autograd
33ff7207fed9cbb34c9f3334249ef0707477f278 L-04: Adding neuron class
90abf7ef211229adfa4cb75e0f35a0561dd15467 (HEAD) L-04: Fixing gradient bug
3a3bb706651a19013822c09e5c70c9fc425a66dc L-04: Adding gradient function
d469222a7a760daa3cd56747e216e3de2a3343ee L-04: Initial commit
$ git checkout -
Previous HEAD position was 90abf7e L-04: Fixing gradient bug
Switched to branch 'main'
$ git checkout main
Previous HEAD position was 90abf7e L-04: Fixing gradient bug
Switched to branch 'main'
# Команда cat выводит в консоль содержимое файла.
$ git checkout 5df3f7e
$ cat main.py
print(“Hello world”)
# Переключим указатель HEAD на определенный коммит:
$ git checkout 9a4e88b
# Теперь создадим новую ветку
$ git checkout -b feature
Switched to a new branch 'feature'
# Добавим файл и сделаем коммит
$ echo "just docs we forgot to put" > docs.md
$ cat docs.md
just docs we forgot to put
$ git add -A
$ git commit -m "L-04: Adding docs"
[feature d5e3273] L-04: Adding docs
1 file changed, 1 insertion(+)
create mode 100644 docs.md
# Переключимся в состояние “detached head” на ветке main.
$ git checkout d5e3273
# Теперь мы создадим несколько коммитов, исключительно для примера:
$ echo 'print('hello world')' > hello_world.py
$ echo 'print('Hi')' > say_hi.py
$ echo 'Some text file' > about.txt
$ git add hello_world.py
$ git commit -m "L-04: Adding hello_world.py"
[detached HEAD d013c75] L-04: Adding hello_world.py
1 file changed, 1 insertion(+)
create mode 100644 hello_world.py
$ git add say_hi.py
$ git commit -m "L-04: Adding say_hi.py"
[detached HEAD 58f8c22] L-04: Adding say_hi.py
1 file changed, 1 insertion(+)
create mode 100644 say_hi.py
$ git add about.txt
$ git commit -m "adding about.txt"
[detached HEAD 7c10724] L-04: Adding about.txt
1 file changed, 1 insertion(+)
create mode 100644 about.txt
# А сейчас мы вспомнили, что сделали несколько коммитов в состоянии “detached head” и испугались, что потеряем их. Но не стоит бояться, можно просто создать ветку прямо сейчас:
$ git checkout -b feature
Switched to a new branch 'feature'
# И чтобы убедиться, что мы не потеряли ни одного коммита, давайте взглянем на историю ветки feature
$ git log --pretty=oneline main..feature
7c10724b12dba69ed1acf4c6fef804c251f7c290 (HEAD -> feature) L-04: Adding about.txt
58f8c226952d500df7a9c2f798011ab20165a286 L-04: Adding say_hi.py
d013c75418ac71ca8f4578583aa23d7567dab332 L-04: Adding hello_world.py
d5e327368d12d6e5ef5b04e16af1d96319069805 L-04: Adding docs
# Выполним реверт предпоследнего коммита. Кстати, такой реверт никогда не вызовет конфликтов.
$ git revert HEAD~1
# Как только мы выполним команду, будет открыт консольный редактор, чтобы вы могли отредактировать сообщение нового коммита. Можно что-то дописать, можно сразу закрыть редактор сочетанием Ctrl+X (здесь приведено сочетание для редактора “nano”). Решать вам. В нашем случае окно редактора будет выглядеть так.
Revert "L-04: Addit docs.txt"
This reverts commit aadfbc3a6756289727e56ac3de59004e66e40033.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes to be committed:
# modified: docs.txt
#
^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos
^X Exit ^R Read File ^\ Replace ^U Paste Text^T To Spell ^_ Go To Line
# После закрытия редактора, в терминал будет выведена информация об успешном реверте коммита
[main e933971] Revert "addit docs.txt"
1 file changed, 1 insertion(+), 1 deletion(-)
Some docs here
and here
Some docs here
Some docs here
and here
also here
# Пробуем откатить коммит .
$ git revert 33ff381
Auto-merging docs.md
CONFLICT (content): Merge conflict in docs.md
error: could not revert 33ff381... L-04: Adding info to docs
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ git reset --soft HEAD~2
$ git add -A
$ git commit -m “L-04: Reset commit”
[main 03953f8] L-04: Reset commit
1 file changed, 3 insertions(+), 1 deletion(-)
$ git reset --hard HEAD^
HEAD is now at c732f69 L-04: Adding more info to docs
$ git reset --hard HEAD~n
$ git reset ORIG_HEAD
# Ветка main (Основная стабильная ветка)
geometric_lib
├── circle.py
├── square.py
└── docs
└── README.md
# Ветка develop (Ветка разработки)
geometric_lib
├── circle.py
├── square.py
└── docs
└── README.md
└── calculate.py
# Ветка feature (Ветка для новых функций)
geometric_lib
├── circle.py
├── square.py
└── docs
└── README.md
└── rectangle.py
# п 1. Клонируем репозиторий и активируем локальные ветки
$ git clone https://github.com/smartiqaorg/geometric_lib
$ cd geometric_lib/
$ git branch --all
$ git checkout develop
$ git checkout feature
$ git branch --all
# п 2. Работаем с веткой feature: откатываем коммит
$ git checkout feature
$ git log
$ git revert HEAD
$ git log
# п 3. Работа с веткой develop: Объединение коммитов
$ git checkout develop
$ git log
$ git reset --soft HEAD~2
$ git log
$ git status
$ git commit -c ORIG_HEAD
$ git log
# п 4. Работа с веткой experiment: Перенос и удаление файлов
$ git checkout main
$ git checkout -b experiment
$ git restore --worktree docs/README.md --source develop
$ git status
$ git restore --worktree --staged calculate.py --source develop
$ git status
$ git add docs/README.md
$ git commit -m "L-04: Experimental commit"
$ git rm circle.py square.py
$ git status
$ git commit -m "L-04: Deleted circle and square"