Я довольно часто использую область 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