Ответ 1
Вы делаете именно то, что я делал в прошлом, и я даже воссоздал весь ваш эксперимент на машине UNIX, и он работал так, как ожидалось.
Я подозреваю, что ваш редактор меняет окончания строки в файле diff, когда он сохраняет.
Существует несколько вопросов о переполнении стека, в которых рассматривается проблема постановки и передачи только частей из файлов. Однако я не могу заставить его работать.
Скажем, мы хотим реализовать фиктивный математический класс в 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
Появится следующее сообщение:
Мне бы хотелось разбить кусок на более мелкие куски, поэтому я нажимаю s
, и появляется следующее сообщение:
Кажется, что git не разделил его на более мелкие куски.
Попробуйте теперь вручную отредактировать текущий кусок. Поэтому я нажимаю: e
.
Мой текстовый редактор по умолчанию (возвышенный текст) открывается, и здесь я могу отредактировать ханк:
Я пытаюсь просто удалить строку 8,9,10,11 - потому что я хочу создать только функцию add
.
Я сохраняю, закрываю редактор, но git говорит:
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?
Я действительно новичок в git add -p
и интерактивной постановке, поэтому, возможно, это то, что я делаю неправильно, или просто невозможно, чего я хочу, и действительно надеюсь, что у более опытных пользователей git есть некоторые инструкции, возможно, также решение для меня.
Спасибо!
Вы делаете именно то, что я делал в прошлом, и я даже воссоздал весь ваш эксперимент на машине UNIX, и он работал так, как ожидалось.
Я подозреваю, что ваш редактор меняет окончания строки в файле diff, когда он сохраняет.
Это не похоже на абсолютный "git способ", так как git любит командную строку, но вот что я делаю:
Git поставляется в комплекте с git gui
- вы можете запустить его, выполнив только эту команду. Там вы можете выбрать свой неустановленный файл, пометить строки, которые вы хотите зафиксировать, и нажать "Сценарии для фиксации". Если вы хотите, чтобы он больше походил на инструмент командной строки, вы можете запустить git gui citool
, что приводит к закрытию ui при фиксации.
Обратите внимание, что этот инструмент правильно интегрирован с 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 -
. Это даст вам ту же оболочку, но с лучшим всем (особенно лучше изменить размер и скопировать и вставить).