Gitでファイルに変更を加えた場合、一部の変更のみをコミットするにはどうすればよいですか?
たとえば、ファイルで変更された30行のうち15行だけをコミットするにはどうすればよいですか?
Gitでファイルに変更を加えた場合、一部の変更のみをコミットするにはどうすればよいですか?
たとえば、ファイルで変更された30行のうち15行だけをコミットするにはどうすればよいですか?
使用できますgit add --patch <filename>
(または-p
略して)。git は、ファイルを適切な「ハンク」(ファイルの一部) と見なすものに分解し始めます。次に、次の質問が表示されます。
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
各オプションの説明は次のとおりです。
+
/-
を#
(thanks veksenに)置き換えることで、ハンクを手動で編集できます。ファイルがまだリポジトリにない場合は、最初にgit add -N <filename>
. その後、続行できますgit add -p <filename>
。
その後、次を使用できます。
git diff --staged
正しい変更をステージングしたことを確認するgit reset -p
誤って追加されたハンクのステージングを解除するgit commit -v
コミット メッセージの編集中にコミットを表示します。git format-patch
これは、コミットデータをファイルに解析することを目的とするコマンドとは大きく異なることに注意してください.patch
。
git add --interactive
orを使用してから( not );を使用できます。git-addマンページの対話モードを参照するか、単に指示に従ってください。git add -p <file>
git commit
git commit -a
最新の Git にはgit commit --interactive
(およびgit commit --patch
、対話型コミットの patch オプションへのショートカット) もあります。
GUI から実行したい場合は、git-guiを使用できます。コミットに含めたいチャンクをマークするだけです。個人的には、 を使用するよりも簡単だと思いますgit add -i
。QGit や GitX などの他の git GUI にもこの機能がある場合があります。
git guiは、差分ビューの下でこの機能を提供します。関心のある行を右クリックすると、「この行をコミットするステージ」メニュー項目が表示されます。
Atlassian のSourceTreeを使用することを強くお勧めします。(無料です。) これは簡単です。コードの個々のハンクまたはコードの個々の行をすばやく簡単にステージングできます。
新しいファイルgit add --patch
に使用するには、最初にファイルをインデックスに追加する必要があることに注意してください。git add --intent-to-add
git add -N file
git add -p file
多くの変更があり、変更からいくつかのコミットを作成することになる場合、物事をステージングする前に一時的に開始点を保存したいと考えています。
このような:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
Whymarrh の答えは、私が通常行っていることですが、変更が多い場合があり、ステージング中に間違いを犯す可能性があることがわかり、2 回目のパスに頼ることができるコミットされた状態が必要です。
emacs を使用する場合は、emacs の git インターフェイスを提供するMagitを参照してください。ステージング ハンク(ファイルの一部) を非常によくサポートします。
コマンドラインを使用したい場合は、前の回答に追加して、次のように入力git add -e myfile
すると、コミットする内容を行ごとに選択できます。このコマンドは、次のように違いのあるエディターを開くためです。
ご存知かもしれませんが、 で始まる+
行は追加、 で始まる行-
は削除です。そう:
-
、スペースに置き換えて
ください。これは、git add -h
この方法でファイルを追加すること(ファイルにパッチを当てること)について述べていることです:
追加内容 追加内容は「+」で始まる行で表されます。追加の行を削除することで、ステージングを防ぐことができます。
削除されたコンテンツ: 削除されたコンテンツは、「-」で始まる行で表されます。"-" を " " (スペース) に変換することで、それらの削除を段階的に防ぐことができます。
変更されたコンテンツ: 変更されたコンテンツは、"-" 行 (古いコンテンツの削除) とそれに続く "+" 行 (置換コンテンツの追加) で表されます。"-" 行を " " に変換し、"+" 行を削除することで、変更のステージングを防ぐことができます。ペアの半分だけを変更すると、インデックスに紛らわしい変更が発生する可能性があることに注意してください。
注意:ファイルの内容を変更しないでください。これは適切な場所ではありません。削除または追加された行の演算子を変更するだけです。
IntelliJ IDEA (およびシリーズの他のすべての製品) には、v2018.1 以降、部分コミットのサポートが組み込まれています。
この質問が出されてから10年。そして、この答えが誰かに役立つことを願っています。hereの回答で述べたように、GUI はオプションではありませんが、Andrew Shadura のcrecord 拡張機能は、コミットする行を選択できる ncurses ウィンドウを表示するのに役立ちます。
拡張機能を次のように設定します。
git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord
cd で git リポジトリに移動し、次のように呼び出します。
git crecord
これにより、以下に示すように使用できる ncurses インターフェイスが表示されます。ncurses ウィンドウで次のキーを押すと、特定のアクションが実行されます。
f hunk toggle fold (arrow keys can also be used)
space toggle hunk selection
a toggle commit or amend
c confirm and open commit window
使用例を示すスクリーンキャスト
Windows
プラットフォーム上にある場合、私の意見では、ファイルから数行を取得するためのgit gui
非常に優れたツールですstage
commit
unstaged
1.ハンクワイズ:
unstagged Changes
セクションからファイルを選択Stage Hunk for commit
2. 行単位:
unstagged Changes
セクションからファイルを選択Stage Lines for commit
3. 数行を除いて完全なファイルをステージングする場合:
unstagged Changes
セクションからファイルを選択Ctrl+T (Stage file to commit)
Staged Changes
セクションに移動しますUnStage Lines for commit
emacs にはgitsumもあります
ツールのリストにlazygitを追加したいと思います。これは素晴らしいコマンド ライン GUI です (つまり、X 転送が許可されていなくても ssh を介して動作します)。豊富な機能 (たとえば、コミットする行の選択、対話型のリベース)、便利なカラーリングがあり、比較的簡単に使用できます。さまざまな方法でインストールできます (go、conda、パッケージ マネージャーなど)。現在も積極的に開発/維持されています。
git-colaは優れた GUI であり、この機能も組み込まれています。ステージングするラインを選択して を押すだけSです。選択が行われない場合、完全なハンクがステージングされます。
上記の1つの回答が示すように、使用できます
git add --patch filename.txt
または短い形式
git add -p filename.txt
...しかし、すでにリポジトリにあるファイルの場合、コミットコマンドで --patch フラグを直接使用する方がはるかに優れています(十分に新しいバージョンのgitを使用している場合):
git commit --patch filename.txt
... または、短い形式
git commit -p filename.txt
...そして、コミットに含める行を選択するために、前述のキー(y / nなど)を使用します。