2013-04-21 4 views
23

Существует множество вопросов о переполнении стека, в которых рассматривается проблема постановки и передачи только частей из файлов. Однако я не могу заставить его работать.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. сохраняю, закройте редактор, но мерзавец говорит:

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

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

Спасибо!

+1

Вы пытаетесь узнать «git way» этого? Лично я не беспокоюсь о таких деталях. Я бы просто удалял одну функцию, фиксировал ее, добавлял ее и фиксировал. – TheBuzzSaw

+0

Да, это именно то, что я сделал в своем последнем проекте. Возможно, это самый простой способ. Тем не менее, я хотел бы сделать это в git, а затем решить, какой способ выбрать. –

+0

Возможный дубликат [Commit only часть файла в Git] (http://stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git) – 7ochem

ответ

15

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

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

+1

Я вернулся. Я настроил весь мой редактор, чтобы использовать окончание строк unix, и все работает так, как ожидалось. –

12

Это не чувствует, как абсолютный «мерзавца путь», чтобы сделать его это так мерзавца любит командную строку, но вот то, что я делаю:

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

Partial staging with git gui

Обратите внимание, что этот инструмент правильно интегрирован с мерзавцем. Вам не нужно делать свою фиксацию в этом 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 -. Это даст вам ту же оболочку, но с лучшим всем (особенно лучшее изменение размера и копирование пасты &).

+0

'git add -p' является традиционным способом git. Я всегда использовал его и никогда не испытывал никаких проблем. Это может быть только редактор, который, похоже, не добавляет правильные окончания строк, которые ожидают git. BTW, чтобы использовать 'git gui' в Windows, вы должны использовать либо cygwin, либо msys. – Tuxdude

+0

Я знаю, что 'git add -p' работает и должен работать для того, что пытается достичь OP. Я хочу сказать, что проще проецировать части файла, когда вы можете правильно прокручивать его и создавать одиночные строки без необходимости переключения на редактор. И если вы используете git в Windows, это всегда с cygwin или msys-git не может запускаться изначально из-за окон из-за его сценариев оболочки. – Chronial

+0

Благодарим вас за подробный комментарий. Я также попробовал git gui, но та же ошибка появилась. Окончание строки было ключом к решению, как Бен Джексон, и вы указали. Теперь также git gui работает так, как ожидалось. –

Смежные вопросы