SVNまたはMercurialを使用してコードの一部のみをコミットできますか?
-
02-07-2019 - |
質問
私は通常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...
コミット後、残りの差分は残されます:
% 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インターフェイスが提供されます。
他のヒント
はい、gitではこれを行うことができます。 git add
コマンドには -p
(または-patch
)オプションがあり、変更をハンクごとに確認できます。ステージングする(ハンクを調整したり、所定の場所でパッチを編集することもできます)。インタラクティブモードを使用してgit-add( git add -i
)し、" p"オプション。
インタラクティブな追加のスクリーンキャストは、 git addのパッチ機能も示しています。
。
TortoiseHGをチェックしてください。これにより、ハンク選択が行われ、異なるコミットに関して1つのファイルに異なる変更をコミットできます。
1回のコミットで他のファイルへの部分的な変更と一緒にいくつかのファイルへのすべての変更をコミットできます。
同様の質問と、 hgshelve拡張機能はまさに私が探していたものです。
コミットを行う前に、異なるファイルからの変更(またはファイル内の変更の塊)を「シェルフ」に置くことができます。必要なものをコミットします。その後、コミットしなかった変更を保留解除して、作業を続行できます。
私は過去数日間使用しており、とても気に入っています。視覚化と使用が非常に簡単です。
Mercurialは、 commit
コマンドにオプション-interactive
(または -i
)を提供するようになりました。ボックス。
これはコマンドラインから直接機能するので、コマンドライン愛好家なら完璧です!
実行中
> hg commit -i
個々の変更の検査、編集、記録を行ってコミットを作成できる対話型セッションを開始します。
これは、 git add
および git commit の
コマンド。-patch
および-interactive
オプションと非常によく似た動作をします
このように動作しないことをお勧めします。
変更のセット、チェックインの準備が整っているセットA、まだ準備の整っていないセットBが必要な場合、セットAをチェックインするだけでビルド/テストが中断しないことをどのように確認できますか?いくつかの行を見逃したり、別のファイルの行を忘れたり、AがBに依存しているために他のビルドを壊してしまうことに気付かないことがあります。
コミットは、チームのビルドを壊さない控えめなアトミックな変更である必要があります 。ファイルを部分的にコミットしている場合、不幸な同僚がドアをノックするまで、知らないうちに他の人のビルドを壊す可能性が大幅に増加します。
大きな質問は、なぜあなたはこのように働く必要があると感じるのですか?