細かく - git ファイル 選択




Gitでファイルの一部だけをコミットする (15)

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

Gitでファイルを変更すると、どうやって変更をコミットできますか?

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


TortoiseGitで:

ファイルを右クリックし、 Context Menu → Restore after commitを使用します。 これにより、ファイルのコピーがそのまま作成されます。 その後、TortoiseGitMergeなどでファイルを編集し、コミットしたくないすべての変更を取り消すことができます。 これらの変更を保存した後、ファイルをコミットできます。


emacsを使用する場合は、 Magit用のgitインタフェースを提供するMagit見てMagit 。 それはステージングハンク (ファイルの一部)をかなりうまくサポートします。


jdsumsionの答えと同じように、あなたの現在の仕事を隠すこともできますが、meldのようなdifftoolを使用して隠されたものから選択された変更を取り出すことができます。 そうすれば、ハンツを手作業で非常に簡単に編集することもできます。これは、 git add -pときには苦痛です。

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

stashメソッドを使用すると、コードをコミットする前にテストする機会が与えられます。


Atomユーザーの場合、パッケージgithubgit guiスタイルで対話型のステージングが含まれています。 ショートカットについては、パッケージのdocumentation参照してください。

Atomを使用すると、背景が暗いテーマで作業することができます(デフォルトでは、 git guiは背景が白です)。


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


git-meld-index - ウェブサイトからの引用:

git-meld-indexは、meldや他のgit difftool(kdiff3、diffuseなど)を実行して、gitインデックス(gitステージングエリアとも呼ばれます)の変更を対話的に行うことができます。

これは、git add -pとgit add --interactiveの機能に似ています。 場合によっては、git add -pよりもmeldが使いやすく/早くなります。 これは、meldは、例えば以下のことを可能にするからです:

  • より多くの文脈を見る
  • イントララインの差分を見る
  • 手で編集し、 'live'差分更新を表示する(キーを押すたびに更新される)
  • スキップしたいすべての変更に「n」を付けずに変更に移動する

使用法

gitリポジトリで次のコマンドを実行します。

git meld-index

meld(または設定されたgit difftool)のポップアップが表示されます:

LEFT :作業中のツリーからコピーされた一時ディレクトリcontiningファイル

RIGHT :索引の内容を含む一時ディレクトリー。 これには、まだ索引には含まれていないが、作業コピーで修正されているか、追跡されていないファイルも含まれます。この場合、HEADのファイル内容が表示されます。

索引(右手側)を幸せになるまで編集します。 必要に応じて保存してください。

完了したら、meldを閉じると、git-meld-indexは、編集したばかりのmeldの右側にある一時ディレクトリの内容と一致するようにインデックスを更新します。


Intellij IDEA (と私はシリーズの他のすべての製品を推測します)は、v2018.1以降の部分コミットのサポートを組み込んでいます


git add --patch <filename> (または-p )を使用するとgitはあなたのファイルを分かりやすい "hunks"(ファイルの一部)とgit add --patch <filename>始めます。 それから、この質問が表示されます:

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

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

  • このコミットを次のコミットのためにステージングする
  • n次のコミットにこのハンクをステージングしない
  • q終了する。 この塊を残したり、残った狩猟をしたりしないでください
  • ファイルの中のこの塊と後のすべての塊
  • dこのファイルを後で処理しないでください
  • g行きたい服を選んでください
  • /与えられた正規表現にマッチする塊を検索する
  • jはこの塊を未定にしておき、次の未確定塊を見てください
  • Jはこの塊を未定にしておき、次の塊を見てください
  • kこの塊を未定にしておく、前の未確定塊を参照
  • Kはこの塊を未定にしておきます、前の塊を見てください
  • 現在のハンクをより小さなハンクに分割する
  • 現在のハンクを手動で編集する
  • 印刷幹ヘルプ

ファイルがまだリポジトリにない場合は、まずgit add -N <filename>ます。 その後、 git add -p <filename>実行することができgit add -p <filename>

その後、以下を使用できます。
あなたが正しい変更を行ったことを確認するためにgit diff --staged
git reset -pは間違って追加されたハンクをステージングしない
git commit -vコミットメッセージの編集中にコミットを表示する。

これは、コミットデータを.patchファイルに解析するためのgit format-patchコマンドとは大きく異なります。

将来の参考資料: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging : https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


git add --patchを使って新しいファイルを作成するには、最初にファイルをgit add --intent-to-add索引付けする必要があります。

git add -N file
git add -p file


Git拡張機能を使用する人には:

[コミット]ウィンドウで、部分的にコミットするファイルを選択し、右ペインでコミットするテキストを選択して右クリックし、コンテキストメニューから[選択された行をステージングする]を選択します。


それはWindowsプラットフォーム上では、私の意見では、 git guiは、 stage / unstagedファイルから数行をcommitための最良のツールです

1.賢者:

  • [ unstagged Changesれていunstagged Changesセクションからファイルを選択する
  • ステージングする必要があるコードのチャンクを右クリック
  • Stage Hunk for commit選択Stage Hunk for commit

2.ラインワイズ:

  • [ unstagged Changesれていunstagged Changesセクションからファイルを選択する
  • ステージされる行を選択する
  • Stage Lines for commit選択Stage Lines for commit

3. 2行以外の完全なファイルをステージングする場合は、次のようにします。

  • [ unstagged Changesれていunstagged Changesセクションからファイルを選択する
  • Ctrl+T (Stage file to commit)押しCtrl+T (Stage file to commit)
  • 選択したファイルがStaged Changesセクションに移動するようになりました
  • ステージされる行を選択する
  • UnStage Lines for commit選択

上の答えの1つとして、 git add --patch filename.txt使うことができgit add --patch filename.txt

または短い形式のgit add -p filename.txt

...あなたが既にリポジトリに入っているファイルの場合は、コミットコマンドに--patchフラグを直接使用するほうがずっと良い(gitの最新バージョンを使用している場合): git commit --patch filename.txt

...またはもう一度、短い形式のgit commit -p filename.txt

...そして、コミットに含める行を選択するために、上記のキー(y / nなど)を使用します。


私は多くの変更があり、変更からいくつかのコミットを作成することになります、私は物事をステージングする前に私の出発点を一時的に保存したいです。

このような:

$ 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回目のパスで落ちることができます。







git-commit