Подтвердить что ты не робот

Почему кошелек представлен как 2 фиксации?

При смене некоторых изменений Git создает две отдельные фиксации: "WIP on branch" и "index on branch":

$ git log --graph --all 

*   commit 98aac13303ca086580c1ec9ccba5fe26c2a8ef3c
|\  Merge: 7d99786 82c5c76
| | Author: Tieme <[email protected]>
| | Date:   Wed Nov 19 09:58:35 2014 +0100
| |
| |     WIP on development: 7d99786 Last real commit
| |
| * commit 82c5c763357c401135675a39bfabf9b7f6805815
|/  Author: Tieme <[email protected]>
|   Date:   Wed Nov 19 09:58:35 2014 +0100
|
|       index on development: 7d99786 Last real commit
|
|
| * commit 7d9978637a0e1ef92f2432189bdebf2317f0b2f0
| Author: Tieme <[email protected]>
| Date:   Tue Nov 18 17:32:33 2014 +0100
|
|     Last real commit
|

Я просмотрел документацию для этого, но это не делает его более ясным:

Закладок представляется как фиксация, чье дерево записывает состояние рабочего каталога, а его первый родитель - это фиксация в HEAD, когда был создан stash. Дерево второго родителя записывает состояние индекса при создании кошелька, и оно становится дочерним элементом фиксации HEAD. Граф предков выглядит следующим образом:

         .----W
        /    /
  -----H----I

где H - фиксация HEAD, я - фиксация, которая записывает состояние индекса, а W - это фиксация, которая записывает состояние рабочего дерева.

Почему существуют 2 коммиты, а не только один для файлов, которые я изменил?

4b9b3361

Ответ 1

Короткий ответ

git stash отличает изменения, которые у вас есть от вашего индекса, и тот, который у вас есть в рабочем дереве, и создает фиксации для обоих из них.

Длинный ответ

Некоторые фон

Используя git, возможно, что изменения, которые у вас есть в рабочем дереве (файлы, с которыми вы работаете напрямую), отличаются от изменений, которые вы указали в индексе.

Добавление только ограниченного количества файлов в индекс или с помощью git add --patch даже добавление отдельных измененных строк в файл оставит ваш индекс в другом состоянии в качестве рабочего дерева.
Это хорошо, потому что он позволяет создавать коммиты, которые фокусируются на одной конкретной задаче/функции.

Возможно даже, что у вас есть изменения в вашем индексе, которые больше не являются частью вашего рабочего дерева. Вы можете протестировать его, добавив некоторые изменения в индекс (git add), вручную удалив их из файла, а затем создав фиксацию (git commit).
Конец все равно будет содержать изменения, которые вы добавили в первую очередь, хотя они больше не существуют в вашем рабочем дереве.

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

Что именно происходит?

Теперь утверждение с самого начала должно иметь больше смысла. Один "фиксация закладок" содержит все изменения, которые у вас были в рабочем дереве (файлы, с которыми вы работаете напрямую), а другой содержит изменения, которые вы добавили в свой индекс.

По умолчанию git stash pop или git stash apply только пытается восстановить изменения, которые у вас были в рабочем дереве, и игнорирует изменения, внесенные вами в индекс. Можно указать git stash попытаться восстановить свой индекс, используя флаг --index (git stash (pop|apply) --index).