'git add --patch' to include new files?


104

を実行するとgit add -p、新しく作成したファイルをgitが選択するハンクとして選択する方法はありますか?

という名前の新しいファイルを作成してからfoo.javagit add -pを実行すると、インデックスに追加するファイルのコンテンツをgitが選択できなくなります。

回答:


77

すべての新しいファイルでこれを行うには、次を実行します。

git add -N .
git add -p

頻繁に使用する場合は、次の場所にエイリアスを作成できます~/.bashrc

alias gapan='git add --intent-to-add . && git add --patch'

注意:空の新しいファイルでこれを使用すると、gitはパッチを適用できず、次のファイルにスキップできません。


13
何をしているのかと思っている人git add -Nは、指定された追跡されていないファイルをインデックスに追加するだけで、コンテンツはありません。
オーディン、

112

git add -p someNewFile.txt新しいファイル(追跡されていないファイル)を試すと、gitは単に出力No changes.して停止しました。最初に新しいファイルを追跡するつもりであるとgitに伝えなければなりませんでした。

git add -N someNewFile.txt
git add -p

ただし、ファイルは追跡されていないため、分割できない1つの巨大なハンクとして表示されます(すべて新しいため)。それで、私はハンクをより小さなビットに編集する必要がありました。これに慣れていない場合は、このリファレンス参照して始めてください。

更新-ハンク編集情報 上記の参照がなくなる場合に備えて、これを更新したかった。新しいファイルは追跡されないため、ファイルのgit add -pすべての行が1つのハンクの新しい行として表示されます。次に、そのハンクで何をしたいかを尋ね、次のプロンプトを表示します。

Stage this hunk [y,n,q,a,d,/,e,?]?

ハンク全体(つまり、ファイル全体をコミットしたくないので、なぜこのようなgit add -p場合に使用するのかわからないため)を想定してe、編集することをgitに伝えるオプションを指定する塊。

ハンクを編集することをgitに伝えると、選択したエディターにドロップされ、変更を加えることができます。すべての行の先頭にa +を付ける必要があり、gitには#ファイルの末尾にいくつかの説明コメント(プレフィックスは)があります。ファイルの最初のコミットで不要な行を削除するだけです。次に、エディターを保存して終了します。

gitのハンクオプションに関するGitの説明:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
誰かが要約してこれに答えてください。
Inanc Gumus 2016

5
要約すると、git add -N someNewFile.txt続くgit add -p
CatShoes

7

git add -p 本当に追跡済みのファイルに変更を加えることです。

追加するファイルを対話的に選択するコマンドはgit add -iです。例えば:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(実際のコマンドには、ここではカットアンドペーストできない色があるため、見た目よりも優れています)

実際には、p atchコマンドgit add -iはと同じようgit add -pに機能するため、2番目は最初のサブセットです(私add -padd -i自分が好きで嫌いだと認めていますが)。


「自分はadd -pが好きで、add -iは自分が嫌いだと認めます!」これがgit add then patchが私が大好きなソリューションである理由です:追加する新しいファイル(空のバージョンと比較するため)と編集したパッチファイルの内容をチェックすることができます!
Ulysse BN

私が間違っている場合は修正してください。ただし、対話モードでも、パッチはNo changes.新しいファイルに出力されます。OPは、ファイル全体ではなく、新しいファイルからハンクを追加する方法を尋ねていました。--intent-to-addここでもまだ必要だと思います。
Jeff Puckett、2018年

add -p単独では機能しませんが、この回答はを示唆add -iしています。
Matthieu Moy

について知らなかったので賛成していgit add -iます。ただし、を使用して非対話的に同じことを行うことができますgit add -N
Mad Physicist

4

--cachedフラグを利用する非常に類似したアプローチもあります...

1)追加したファイルと同じように、ステージングされていない変更をステージングされた変更に変換します。

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2)差分を確認します(注:編集と新しいファイルの両方を含めることができます)。

git diff --cached

3)パッチを作成します。

git diff --cached > my_patch_file.patch

残念ながらそれは同じ目的を達成しません。私が好きなのgit add -pは、それがすべてを追加するわけではないということですが、追加したいものを選んで選択しましょう。このソリューションは盲目的にすべてを追加します。
アレクサンダーバード

さて、あなたはあなたが追加するものを選ぶことができます!答えを更新します。
doublejosh 2016

1
ありがとうございます:allthethings:これは私にとって驚くほどうまくいきます
macool
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.