Добавление файлов в индекс git без фиксации

При использовании Git мой рабочий процесс обычно включает в себя запуск TortoiseGit и выбор файлов, которые я хотел бы зафиксировать.

Это (я полагаю) запускает git add (?) и фиксирует эти изменения в локальном репо.

Мой вопрос: почему необходимо разделение между ДОБАВЛЕНИЕМ файлов в индекс и их СОВЕРШЕНИЕМ?

Существуют ли какие-либо варианты использования простого добавления файлов в индекс без их одновременной фиксации?


person lysergic-acid    schedule 01.04.2013    source источник


Ответы (5)


Добавление файлов в индекс называется staging. Стадия обеспечивает разделение между тем, что должно быть зафиксировано, и тем, что должно остаться вне фиксации. Если вы внесли какие-то изменения, которые лучше подходят для другого коммита, вы можете просто оставить их там без подготовки и сделать коммит для вещей, которые были добавлены в индекс.

Так что, по сути, это помогает вам подготовить простые, последовательные коммиты.

person r.v    schedule 01.04.2013

Я довольно часто использую область index/staging. Это можно представить как корзину для покупок. Это позволяет вам бродить по вашему проекту, добавляя вещи по ходу дела, заполняя корзину. Когда у вас есть то, что вы хотите, вы совершаете коммит (то есть покупаете эти изменения и покидаете магазин).

Одной из замечательных особенностей этого является добавление патчей. git add -p, также известный как git add --patch, позволяет вам выбирать определенные фрагменты из файла, поэтому вы можете коммитить части различных файлов. Я делаю это каждый день, хотя я использую подключаемый модуль pathogen для Vim, который позволяет очень легко и наглядно переходить от изменения к изменению, перемещая их туда и обратно между рабочей копией и копией индекса. Как только я добавляю в корзину только части хорошего детализированного коммита, я фиксирую его с разумным, детализированным сообщением коммита, 50 символов или меньше. Это сделало мою историю невероятной для рассуждений, и это позволило мне передумать через час и интерактивно перебазировать, чтобы объединить коммиты и переупорядочить их в более разумный поток, иногда для того, чтобы модульные тесты работали при каждом коммите, поэтому я чистый, безопасный, точки отката везде в моей истории.

Я также использовал добавление исправлений, чтобы понять, какие части файла имеют смысл вместе. В Vim я делаю ,gs, который в новом разделенном окне открывает статус git для репо текущего файла. Я использую <C-n> и <C-p>, чтобы прыгать по строкам сообщения о состоянии с фактическими файлами на них. Я использую D в этих строках, чтобы просмотреть их в наборе разделенных окон, затем ]c и c[ перескакивают от изменения к изменению, используя dp (помещение различий) и do (получение различий) для перемещения изменений в текущий буфер или из него (эти работать из любого разделения, а <C-w>h и <C-w>l переключать меня туда и обратно между буферами). Как только мне нравится то, что я подготовил для этого файла, я :w сохраняю его, и <C-w>k снова поднимаюсь до разделения состояния, чтобы либо выбрать новый файл для подготовки таким образом, либо - на файлах в любом наборе, чтобы переключить их в и полностью выйти из промежуточной стадии или cc для фактической фиксации, после чего запрашивает сообщение о фиксации. Я могу просмотреть все, что происходит с помощью этих средств, прежде чем совершить фиксацию, и часто в этот момент я понимаю, что что-то забыл или добавил что-то, чего не должен был, и исправил это. Таким образом, мои коммиты довольно нетронуты. Если я хочу commit --amend, я могу инсценировать вещи и использовать cA вместо cc или ca, если я также хочу перефразировать сообщение коммита.

Короче говоря, коммит целых файлов, как я делал во времена SVN, теперь кажется мне очень грубым и неправильным. Действительно сложно изменить только одну проблему во время работы, но добавление исправлений с помощью индекса позволяет мне выделить фактические изменения, которые имеют смысл вместе в одном коммите.

person Gary Fixler    schedule 01.04.2013

Постановка почти как мини-коммит для файла. Вы можете выполнять этапы, повторные этапы, просматривать изменения, как если бы вы их зафиксировали, и даже возвращаться к самому последнему этапу — перед фактической фиксацией. Выполнение нескольких мини-коммитов может помочь вам в организации, так же как и выполнение нескольких полных коммитов.

По сути, это более тонкий уровень детализации.

Кроме того, он позволяет вам немного поиграться локально перед фиксацией — это фактически то же самое, что создать ветку на игровой площадке и выполнить кучу коммитов, а затем снова слить перед окончательным коммитом. Просто намного легче, чем все это.

person Community    schedule 01.04.2013

Вам не нужно фиксировать все файлы, которые вы добавили в индексную/промежуточную область.

git add fileA
git add fileB
git add fileC

Вариант использования 1: зафиксируйте только файл A и файл B:

git commit -m "fileA, fileB added." fileA fileB

Вариант использования 2: отслеживание изменений файлов после их добавления в промежуточную область. Это покажет вам разницу между рабочей копией и последним временем добавления файла в промежуточную область.

person sedden    schedule 01.04.2013

В SmartGit вы можете щелкнуть правой кнопкой мыши по файлу и выбрать файл satge.

person qwert_ukg    schedule 06.08.2014