Могу ли я зафиксировать только части своего кода, используя SVN или Mercurial?

StackOverflow https://stackoverflow.com/questions/149198

Вопрос

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

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

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

Это было полезно?

Решение

Mercurial может сделать это с помощью запись расширение.

Он будет запрашивать вас для каждого файла и каждого фрагмента 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...

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

% 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-вариант record (qrecord).

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

crecord screenshot

Другие советы

Да, git позволяет вам это делать.Тот Самый git add команда имеет -p (или --patch) опция, которая позволяет вам просматривать ваши изменения поэтапно, выбирать, какие из них следует вносить поэтапно (вы также можете доработать фрагменты или отредактировать исправления на месте).Вы также можете использовать интерактивный режим для git-добавления (git add -i) и используйте опцию "p".

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

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

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

http://tortoisehg.bitbucket.io/

Я спросил у похожий вопрос совсем недавно, и результирующий ответ об использовании выдвижная полка hgshelve это было именно то, что я искал.

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

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

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

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

Выполняется

> hg commit -i

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top