3215

Gitでファイルに変更を加えた場合、一部の変更のみをコミットするにはどうすればよいですか?

たとえば、ファイルで変更された30行のうち15行だけをコミットするにはどうすればよいですか?

4

26 に答える 26

4323

使用できますgit add --patch <filename>(または-p略して)。git は、ファイルを適切な「ハンク」(ファイルの一部) と見なすものに分解し始めます。次に、次の質問が表示されます。

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

各オプションの説明は次のとおりです。

  • y次のコミットのためにこのハンクをステージングする
  • n次のコミットのためにこのハンクをステージングしない
  • q終了する; このハンクまたは残りのハンクをステージングしないでください
  • aファイル内のこのハンクとそれ以降のすべてのハンクをステージングします
  • dファイル内のこのハンクまたはそれ以降のハンクをステージングしない
  • g移動先のハンクを選択
  • /指定された正規表現に一致するハンクを検索します
  • jこのハンクを未決定のままにし、次の未決定ハンクを参照
  • Jこのハンクを未決定のままにし、次のハンクを参照
  • kこのハンクを未決定のままにし、前の未決定ハンクを参照
  • Kこのハンクを未決定のままにし、前のハンクを参照
  • s現在のハンクを小さなハンクに分割します
  • e現在のハンクを手動で編集する
    • +/-#(thanks veksenに)置き換えることで、ハンクを手動で編集できます。
  • ?print hunk ヘルプ

ファイルがまだリポジトリにない場合は、最初にgit add -N <filename>. その後、続行できますgit add -p <filename>

その後、次を使用できます。

  • git diff --staged正しい変更をステージングしたことを確認する
  • git reset -p誤って追加されたハンクのステージングを解除する
  • git commit -vコミット メッセージの編集中にコミットを表示します。

git format-patchこれは、コミットデータをファイルに解析することを目的とするコマンドとは大きく異なることに注意してください.patch

今後の参考: Git Tools - Interactive Staging

于 2009-07-06T02:36:42.233 に答える
274

git add --interactiveorを使用してから( 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 にもこの機能がある場合があります。

于 2009-07-06T11:49:28.263 に答える
169

git guiは、差分ビューの下でこの機能を提供します。関心のある行を右クリックすると、「この行をコミットするステージ」メニュー項目が表示されます。

于 2009-07-06T02:41:47.263 に答える
38

Atlassian のSourceTreeを使用することを強くお勧めします。(無料です。) これは簡単です。コードの個々のハンクまたはコードの個々の行をすばやく簡単にステージングできます。

ここに画像の説明を入力

于 2014-08-12T13:32:06.937 に答える
33

新しいファイルgit add --patchに使用するには、最初にファイルをインデックスに追加する必要があることに注意してください。git add --intent-to-add

git add -N file
git add -p file
于 2014-12-05T17:29:10.147 に答える
23

多くの変更があり、変更からいくつかのコミットを作成することになる場合、物事をステージングする前に一時的に開始点を保存したいと考えています。

このような:

$ 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 回目のパスに頼ることができるコミットされた状態が必要です。

于 2013-06-06T22:14:36.497 に答える
16

emacs を使用する場合は、emacs の git インターフェイスを提供するMagitを参照してください。ステージング ハンク(ファイルの一部) を非常によくサポートします。

于 2009-07-08T07:00:31.223 に答える
15

コマンドラインを使用したい場合は、前の回答に追加して、次のように入力git add -e myfileすると、コミットする内容を行ごとに選択できます。このコマンドは、次のように違いのあるエディターを開くためです。

ここに画像の説明を入力

ご存知かもしれませんが、 で始まる+行は追加、 で始まる行-は削除です。そう:

  • 追加をステージングしない場合は、その行を削除するだけです。
  • 削除をステージングしない場合は-、スペースに置き換えてください。

これは、git add -hこの方法でファイルを追加すること(ファイルにパッチを当てること)について述べていることです:

追加内容 追加内容は「+」で始まる行で表されます。追加の行を削除することで、ステージングを防ぐことができます。

削除されたコンテンツ: 削除されたコンテンツは、「-」で始まる行で表されます。"-" を " " (スペース) に変換することで、それらの削除を段階的に防ぐことができます。

変更されたコンテンツ: 変更されたコンテンツは、"-" 行 (古いコンテンツの削除) とそれに続く "+" 行 (置換コンテンツの追加) で表されます。"-" 行を " " に変換し、"+" 行を削除することで、変更のステージングを防ぐことができます。ペアの半分だけを変更すると、インデックスに紛らわしい変更が発生する可能性があることに注意してください。

注意:ファイルの内容を変更しないでください。これは適切な場所ではありません。削除または追加された行の演算子を変更するだけです。

于 2018-08-24T15:24:08.123 に答える
14

IntelliJ IDEA (およびシリーズの他のすべての製品) には、v2018.1 以降、部分コミットのサポートが組み込まれています。

ここに画像の説明を入力

于 2018-03-28T07:00:44.660 に答える
6

この質問が出されてから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

使用例を示すスクリーンキャスト例

于 2019-03-24T19:55:44.207 に答える
3

Windowsプラットフォーム上にある場合、私の意見では、ファイルから数行を取得するためのgit gui非常に優れたツールですstagecommitunstaged

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
于 2015-05-28T12:52:34.403 に答える
2

emacs にはgitsumもあります

于 2009-07-12T21:52:10.173 に答える
2

ツールのリストにlazygitを追加したいと思います。これは素晴らしいコマンド ライン GUI です (つまり、X 転送が許可されていなくても ssh を介して動作します)。豊富な機能 (たとえば、コミットする行の選択、対話型のリベース)、便利なカラーリングがあり、比較的簡単に使用できます。さまざまな方法でインストールできます (go、conda、パッケージ マネージャーなど)。現在も積極的に開発/維持されています。

于 2021-10-27T15:51:58.913 に答える
1

git-colaは優れた GUI であり、この機能も組み込まれています。ステージングするラインを選択して を押すだけSです。選択が行われない場合、完全なハンクがステージングされます。

于 2015-08-27T11:28:04.627 に答える
1

上記の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など)を使用します。

于 2014-06-30T08:34:06.680 に答える