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

Git: совершить частичные изменения

Существует несколько вопросов о переполнении стека, в которых рассматривается проблема постановки и передачи только частей из файлов. Однако я не могу заставить его работать.

Скажем, мы хотим реализовать фиктивный математический класс в php (язык не имеет значения) с некоторыми базовыми методами, такими как: add, subtract, multiply и divide.

Начнем с определения класса:

<?php
    class Math {
    }
?>

Сейчас:

$ git add math.php
$ git commit -m "Create Math class."

На следующем шаге мы реализуем как add, так и subtract четыре метода:

<?php
    class Math {
        public function add($a, $b) {
            return $a + $b;
        }

        public function subtract($a, $b) {
            return $a - $b;
        }
    }
?>

Но теперь мы хотим зафиксировать реализацию методов add и subtract в отдельных фиксациях.

Возможно ли это?

Что я пробовал

$ git add -p

Появится следующее сообщение:

enter image description here

Мне бы хотелось разбить кусок на более мелкие куски, поэтому я нажимаю s, и появляется следующее сообщение:

enter image description here

Кажется, что git не разделил его на более мелкие куски.

Попробуйте теперь вручную отредактировать текущий кусок. Поэтому я нажимаю: e.

Мой текстовый редактор по умолчанию (возвышенный текст) открывается, и здесь я могу отредактировать ханк:

enter image description here

Я пытаюсь просто удалить строку 8,9,10,11 - потому что я хочу создать только функцию add. Я сохраняю, закрываю редактор, но git говорит:

Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

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

Спасибо!

4b9b3361

Ответ 1

Вы делаете именно то, что я делал в прошлом, и я даже воссоздал весь ваш эксперимент на машине UNIX, и он работал так, как ожидалось.

Я подозреваю, что ваш редактор меняет окончания строки в файле diff, когда он сохраняет.

Ответ 2

Это не похоже на абсолютный "git способ", так как git любит командную строку, но вот что я делаю:

Git поставляется в комплекте с git gui - вы можете запустить его, выполнив только эту команду. Там вы можете выбрать свой неустановленный файл, пометить строки, которые вы хотите зафиксировать, и нажать "Сценарии для фиксации". Если вы хотите, чтобы он больше походил на инструмент командной строки, вы можете запустить git gui citool, что приводит к закрытию ui при фиксации.

Partial staging with git gui

Обратите внимание, что этот инструмент правильно интегрирован с git. Вам не нужно делать свою фиксацию в этом ui. Вы можете просто скомпоновать соответствующие строки, закрыть его, возможно сделать еще несколько git add, а затем зафиксировать через командную строку.

В общем, я обожаю git интерфейс линии comand, и хотя я не обязательно поклонник оболочки, мне просто понравилось это через некоторое время. Я попробовал несколько графических интерфейсов и выбросил их всех, потому что они не могут конкурировать с интерфейсом командной строки git. Но для git add -p я бы определенно сказал, что это задача для графического интерфейса. Выполнение частичных коммитов проще с помощью git gui. То же самое касается сложного просмотра истории. gitk (также поставляется с git) работает лучше, чем git log --graph -p (пока вам действительно нужно понять дерево и не совсем сейчас о состоянии истории).

Примечание: Но вы все еще, кажется, все делаете правильно - я пробовал то, что вы сделали, и должен согласиться с Беном Джексоном. Это должно определенно работать. Ваш редактор должен что-то прикручивать.

Заключительная записка. Кажется, вы используете командную строку git со стандартным окном cmd. Я настоятельно рекомендую перейти на mintty. Загрузите версию msys, поместите ее в свой каталог Program Files\Git\bin и запустите ее (создайте ярлык) с помощью mintty -. Это даст вам ту же оболочку, но с лучшим всем (особенно лучше изменить размер и скопировать и вставить).