Могу ли я зафиксировать только часть своего кода, используя SVN или Mercurial? - PullRequest
37 голосов
/ 29 сентября 2008

Я обычно использую Tortoise SVN, но я изучал Mercurial, так как это распределенная система контроля версий.

В обеих системах я ищу инструмент, который позволяет мне выбирать только части файла и фиксировать их. Если я хочу сделать это сейчас, мне нужно скопировать во временную версию файла и сохранить только изменения, которые я хочу зафиксировать в текущей версии, а затем снова скопировать временную версию в текущую версию после фиксации. Это просто такая неприятность, и программа должна сделать это за меня.

Я слышал, что Git поддерживает это, пожалуйста, дайте мне знать, если это правильно.

Ответы [ 6 ]

40 голосов
/ 29 сентября 2008

Mercurial может сделать это с расширением record .

Он попросит вас указать каждый файл и каждый элемент diff. Например:

% hg record
diff --git a/prelim.tex b/prelim.tex
2 hunks, 4 lines changed
examine changes to 'prelim.tex'? [Ynsfdaq?]  
@@ -12,7 +12,7 @@
 \setmonofont[Scale=0.88]{Consolas}
 % missing from xunicode.sty
 \DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i}
-\else
+\else foo
 \usepackage[pdftex]{graphicx}
 \fi

record this change to 'prelim.tex'? [Ynsfdaq?]  
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file
record this change to 'prelim.tex'? [Ynsfdaq?]  n
Waiting for Emacs...

После коммита оставшийся дифференциал останется позади:

% hg di
diff --git a/prelim.tex b/prelim.tex
--- a/prelim.tex
+++ b/prelim.tex
@@ -1281,3 +1281,5 @@
 %% Local variables:
 %% mode: latex
 %% End:
+
+foo
\ No newline at end of file

В качестве альтернативы вам может оказаться проще использовать MQ (Mercurial Queues) для разделения отдельных изменений в вашем хранилище на патчи. Существует также вариант записи MQ (qrecord).

Обновление: Также попробуйте расширение crecord , которое предоставляет интерфейс curses для выбора фрагмента / строки.

crecord screenshot

12 голосов
/ 30 сентября 2008

Да, Git позволяет вам сделать это. Команда git add имеет опцию -p (или --patch), которая позволяет вам просматривать ваши изменения по отдельности, выбирать, какие из них выполнять (вы также можете уточнить блоки или редактировать патчи на месте). Вы также можете использовать интерактивный режим для git-add (git add -i) и использовать опцию «p».

Вот скринкаст об интерактивном добавлении , который также демонстрирует функцию исправления git add.

8 голосов
/ 01 марта 2010

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

Это даже позволит вам зафиксировать все изменения в некоторых файлах вместе с частичными изменениями в других файлах за один раз.

http://tortoisehg.bitbucket.io/

5 голосов
/ 30 сентября 2008

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

Прежде чем сделать коммит, вы можете поместить изменения из разных файлов (или фрагментов изменений в файле) на «полку», а затем зафиксировать нужные вам вещи. Затем вы можете отменить изменения, которые вы не зафиксировали, и продолжить работу.

Я пользуюсь им последние несколько дней и мне это очень нравится. Очень легко визуализировать и использовать.

2 голосов
/ 07 сентября 2017

Mercurial теперь предоставляет опцию --interactive (или -i) для команды commit, которая включает эти функции прямо из коробки.

Это работает напрямую из командной строки, поэтому идеально, если вы энтузиаст командной строки!

Запуск

> hg commit -i

начинает интерактивный сеанс, который позволяет просматривать, редактировать и записывать отдельные изменения для создания коммита.

Это очень похоже на опции --patch и --interactive для команд git add и git commit.

0 голосов
/ 29 сентября 2008

Я бы порекомендовал так не работать.

Если вам нужно изменить наборы, установите A, который готов к регистрации, и набор B, который еще не готов, как вы можете быть уверены, что только проверка в наборе A не нарушит вашу сборку / тесты? Вы можете пропустить некоторые строки, забыть о строках в другом файле или не осознавать зависимость, которая есть у А, от нарушения сборки для других.

Ваши коммиты должны быть дискретными атомарными изменениями, которые не нарушают сборку для вас или других в вашей команде. Если вы частично делаете файл, вы значительно увеличиваете вероятность того, что вы нарушите сборку для других, не зная об этом, пока в вашу дверь не постучат несчастные коллеги.

Большой вопрос, почему вы чувствуете необходимость работать таким образом?

...