Git: как я могу пометить файл как проверенный перед коммитом? - PullRequest
0 голосов
/ 01 марта 2019

Я ветеран Perforce, который переводит нашу организацию в Git.Одна вещь, на которой я застрял, это то, как управлять большими коммитами (я не имею в виду много разных изменений одновременно - что я знаю, не оптимально), а скорее, один тип изменений, который затрагивает сразу несколько файлов).Например, скажем, я добавляю параметр в функцию, которая вызывается в десятках файлов.Используя командную строку git с визуальным инструментом сравнения, как лучше всего просмотреть все мои изменения перед фиксацией?В практическом плане я мог бы распространить этот обзор на некоторое время или сделать еще несколько изменений после просмотра некоторых моих файлов, а затем вернуться к непросмотренным файлам.

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

Отклоненные идеи:

  1. Сохранять все файлы в неизменном виде,затем отправляйте их по одному и создавайте файл, если мне нравится diff.Проблема с этой идеей заключается в том, что неудобно указывать полные пути каждого файла для выполнения сравнения (а затем разбивать его на этапы), поскольку файлы могут быть разбросаны по многим путям.
  2. Использовать интерактивный режим добавления (git add -i).Проблема с этой идеей в том, что вы не можете различить неустановленные файлы.То есть, чтобы это работало, мне нужно было сделать несколько странных вращений, в которых я бы все ставил, затем, после того, как файл прошел проверку, я фактически удалил его, затем в конце я поменял местами промежуточные и неподготовленные файлы перед фиксацией.Брутто.
  3. Использовать режим патча.Это очень круто, но, похоже, не работает с визуальным difftool.
  4. Используйте git gui.Это действительно очень близко, но я не нашел способа легко запустить difftool для каждого файла двойным щелчком или горячей клавишей.

Как ни странно, git add -iбудет работать идеально для моих нужд, если не изменить смысл diff.то есть по умолчанию, diff работает с неустановленными изменениями, но во время интерактивного добавления diff работает только с поэтапными изменениями.Это сбивает с толку меня, тем более что смысл git add в том, чтобы создавать файлы.

Все мысли приветствуются!Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 01 марта 2019

Вам следует отказаться от идеи коммитов, которая используется в нераспределенных системах scm ... git add -i и варианты - это то, что вы ищете:

  • выберите ваши изменения с помощью 'git добавить -i 'и передать их;не пытайтесь быть идеальным и не стесняйтесь делать несколько коммитов

  • для новых файлов, я бы сначала зафиксировал пустой файл (возможно, с некоторыми заголовками);Вы можете сделать это один за другим в вашем редакторе:

    1. очистить файл (выбросить свою работу)

    2. git add the-file +git commit -m "the-file: initial checkin"

    3. отменить шаг 1

Повторите шаги выше;когда у вас есть некоторый опыт, вы можете использовать 'git commit --fixup HEAD ~ 2` или создавать сообщения коммита, такие как "fixup! добавлен параметр xyz" или "squash! исправлена ​​глупая ошибка".

Естьнекоторые инструменты, которые помогают с git add -i;например, git-gutter+-mode в emacs делает почти идеальную работу, а последовательность magit c f действительно крутая.

Теперь у вас есть история вроде

added parameter xyz
the-file-A: initial checkin
fixed stupid bug
the-file-B: initial checkin
fixup! added parameter xyz
fixup! added parameter xyz
squash! fixed stupid bug
...

Теперь, git rebase -i --autosquash для вашеговетвь master, изменение порядка коммитов, и вы получите:

the-file-A: initial checkin
the-file-B: initial checkin
added parameter xyz
fixed stupid bug

, где последние два коммита содержат изменения в нескольких файлах / местах.

Каждый из этих коммитов связан с одной проблемой и может бытьобзор.

Вы можете запускать компиляцию и юнит-тесты с git rebase -f -e make.

...