git: add/save changes,check changes,cancel changes

Внесение/Сохранение изменений

Файл в git может иметь два состояния — отслеживаемый (под версионным контролем) и не отслеживаемый.
Отслеживаемые — это все файлы , которые присутствовали в последнем коммите. В свою очередь файлы в данном состояние могут быть не модифицированными (не измененные с последнего коммита), модифицированными (измененные, но не проиндексированными), и кандитатами (измененные и проиндексированные — staged) на коммит.
Не отслеживаемые — это все остальные файлы, которые были добавлены в проект после последнего коммита.
Как только проект клонирован, то все файлы отслеживаемые и не модифицированные.
Для определения состояния файлов используется команда git status

В рабочей директории нашего проекта first-sample создадим новый файл:
cd ~/first-sample
touch newfile.txt

Смотрим статус
git status
On branch master
Untracked files:
  (use "git add ..." to include in what will be committed)

	newfile.txt

nothing added to commit but untracked files present (use "git add" to track)

On branch master — указывает кукую ветку репозитория мы используем, подробности позже
Untracked files: — нам сигнализирует, что появился новый файл со времени последнего коммита, файл в состоянии не отслеживаемый.
Пока файл находится в таком состоянии, то git не добавляет их в репу при коммите. Данное поведение работы позволяет избавить от попадания в репу случайных файлов.

Для того чтоб файл сменил статус с не отслеживаемого на отслеживаемого необходимо использовать команду git add

Индексируем файл
git add newfile.txt

Смотрим статус
git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	new file:   newfile.txt

Теперь видно, что файл отслеживаемый и проиндексирован.

Модифицируем уже отслеживаемый файл и проверим статус
echo "1 modification" >> newfile.txt

Смотрим статус
git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	new file:   newfile.txt

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

	modified:   newfile.txt

Из примера видно, что файл newfile.txt оказался в кандидатом на коммит и модифицированным, но еще не проиндексированным.Т.е. если сейчас выполнить коммит, то в репу попадёт файл до его модификации, поэтому опять нужно выполнить команду:

git add newfile.txt

Смотрим статус
git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	new file:   newfile.txt

Проверка изменений

Команда git status показывает лишь какие файлы были модифицированы, но не показывает что именно было изменено. Чтоб просмотреть внесенные изменения в файлы используется команда git diff, для просмотра изменений в уже проиндексированном фале исполльзуется ключ --staged, а если нужно просмотреть изменения еще в не индексированном файле, то без всяких ключей.
Модифицируем оба файла из first-example и один из них проиндексируем, а второй нет.

Модифицируем
echo "2 modification" >> newfile.txt
echo "new file" >> readme.txt

Индексируем
git add newfile.txt

Смотрим статус
git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	modified:   newfile.txt

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

	modified:   readme.txt

Здесь мы видим, что у нас имеется два файла:
readme.txt — отслеживаемый модифицированный не проиндексированный
newfile.txt — отслеживаемый модифицированный проиндексированный кандидат на коммит

смотрим не проиндексированный файл

git diff readme.txt
diff --git a/readme.txt b/readme.txt
index b3f7da1..807f8b2 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
 git example first commit
 1 modification
+new file
Видим, что в данный файл была добавлена строка "new file"

смотрим проиндексированный файл

git diff --staged newfile.txt
diff --git a/newfile.txt b/newfile.txt
index a947204..645e510 100644
--- a/newfile.txt
+++ b/newfile.txt
@@ -1 +1,2 @@
 1 modification
+2 modification
Видим, что в данный файл была добавлена строка "2 modification"

Удаление файлов

git rm — данная команда удаляет файл из репы и с диска, чтоб файл не появлялся, как не отслеживаемый
git rm --cached данная команда удаляет файл из репы но не с диска
git rm -f — удаление уже проиндексированного файла(кандидата в коммит)
Пример:

touch tempfile
git add tempfile
git commit -m "test"

git rm tempfile
ls
newfile.txt  readme.txt

git status 
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	deleted:    tempfile

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

git mv — по сути это команда переименования файла, которая заменяет собой три других команды:

$ mv OLD_FILE NEW_FILE
$ git rm OLD_FILE
$ git add NEW_FILE

Игнорирование файлов

Для указания git, какие файлы можно полностью игнорировать (даже после их создания они не попадут в список не отслеживаемых) используется файл .gitignore
Для файла применяются правила:
1. Пустые строки, а также строки, начинающиеся с #, игнорируются.
2. Можно использовать стандартные glob шаблоны.
3. Можно начать шаблон символом слэша (/) чтобы избежать рекурсии.
4. Можно заканчивать шаблон символом слэша (/) для указания каталога.
5. Можно инвертировать шаблон, использовав восклицательный знак (!) в качестве первого символа.
Для облегчения создания данного файла можно использовать https://www.gitignore.io/

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

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

Если в файл были внесены изменения и потребовалось откатить его до последнего коммита, можно воспользоваться командой:
git checkout -- FileName

Вносим изменения
echo 'new line' >> readme.txt

Проверяем содержимое файла
cat readme.txt 
some text
new line

Смотрим статус
git status 
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

	modified:   readme.txt

Откатываем изменения
git checkout -- readme.txt

Смотрим содержимое файла
cat readme.txt 
some text

Смотрим статус
git status 
On branch master
Your branch is up to date with 'origin/master'.

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

Отмена индексации файла

Если необходимо отменить индексацию файла, то используется команда: git reset HEAD FileName

Вносим изменения в файл
echo 'new line' >> readme.txt

Индексируем
git add readme.txt

Смотрим статтус
git status 
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	modified:   readme.txt

Отменяем индексацию файла
git reset HEAD readme.txt
Unstaged changes after reset:
M	readme.txt

Смотрим статус
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

	modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

Как видим индексация отменилась и файл имеет статус отслеживаемый модифицированный, но не проиндексированный.

Коммит изменений

Самый простой вариант коммита — это выполнить команду git commit в директории проекта. Далее откроется редактор в котором можно указать какие-либо комментарии к коммиту.
Чтоб указывать комментарий к коммиту прям в командной строке можно использовать ключ -m
git commit -m "My comment"
Ключ -a позволяет обходиться без команды git add, т.е. с данным ключем автоматически индексируются отслеживаемые файлы и затем выполняется коммит
git commit -a -m 'my comment'

Дополнение к коммиту

Если необходимо переделать коммит, то нужно использовать команду git commit --amend

Создадим новый проект и перейдем в него
mkdir amendcommit
cd amendcommit

Проинициализируем git
git init
Initialized empty Git repository in ~/git-repo/amendcommit/.git/

Добавим файл в проект
echo 'test file' > testfile.txt

Индексируем файл
git add testfile.txt

Коммитим
git commit -m 'some comment'
[master (root-commit) 25bf865] some comment
 1 file changed, 1 insertion(+)
 create mode 100644 testfile.txt

Смотрим историю коммитов
git log
commit 25bf865e8c0a0aa41ab738dd5dc7e3e8b9aa7198 (HEAD -> master)
Date:   Sat Jul 14 16:16:47 2018 +1000

    some comment

В истории видим только один коммит.

Вносим изменения в файл
echo 'new line' >> testfile.txt

Индексируем файл
git add testfile.txt

Коммитим
git commit --amend -m "qwertt"

Смотрим историю
git log
commit 83dd08a17a7655198b22681e8d47ccbe71ae47a8 (HEAD -> master)
Date:   Sat Jul 14 16:16:47 2018 +1000

   qwertt

Как видим кол-во коммитов не изменилось

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

git revert HEAD --no-edit

Пусть у нас имеется такая истопя коммитов
git log --oneline --all --graph
* 15cec91 (HEAD -> master) add text in readme.txt
* 2325c28 create readme.txt
* a7151d3 test comment2
* 24e7942 test comment
т.е. в последнем коммите был добавлен какой-то текст в файл readme.txt, а в предпоследнем коммите 
был создан файл readme.txt
Откатываем коммит
git revert HEAD --no-edit
[master 34ed956] Revert "add text in readme.txt"
 Date: Thu Jul 26 14:46:08 2018 +1000
 1 file changed, 1 deletion(-)
Смотрим историю
git log --oneline --all --graph
* 34ed956 (HEAD -> master) Revert "add text in readme.txt"
* 15cec91 add text in readme.txt
* 2325c28 create readme.txt
* a7151d3 test comment2
* 24e7942 test comment
Как видим в истории появился наш коммит с откатом.
Проверяем состояние файла readme.txt
cat readme.txt 
Он пуст.
Еще раз откатываем коммит
git revert HEAD --no-edit
Проверяем 
cat readme.txt
Some text
т.е. откат произошел к коммиту когда добаляли текст в файл.
Смотрим историю 
git log --oneline --all --graph
* 5f1a7d9 Revert "Revert "add text in readme.txt""
* 34ed956 Revert "add text in readme.txt"
* 15cec91 add text in readme.txt
* 2325c28 create readme.txt
* a7151d3 test comment2
* 24e7942 test comment

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *