94

インデックスにいくつかの変更を選択的に追加しようとしてgit add --interactiveいますが、「編集したハンクは適用されません。もう一度編集してください...」というメッセージが継続的に表示されます。e オプションを選択してもこのメッセージが表示され、すぐにエディターを保存/閉じます。つまり、ハンクをまったく編集しないと、パッチは適用されません。

これが私が使用している正確な例です(私は小さなデモをまとめようとしています):

元のファイル:

first change
second change off branch
third change off branch
second change
third change
fourth change

新しいファイル:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

git add --interactive「バグ修正 1」行のみをインデックスに追加する方法を紹介しようとしています。ファイルに対してインタラクティブな追加を実行し、パッチ モードを選択します。それは私に

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

私は分割で応答し、その後に「いいえ」を続けて最初のハンクを適用します。2番目のハンク、編集してみます。私は最初に最終行を削除しようとしましたが、うまくいきませんでした。ハンクを完全に放っておくのもうまくいかず、その理由がわかりません。

4

13 に答える 13

116

これはこの git-add 投稿のようなものですか?

ハンクを手動で編集することは非常に強力ですが、これまでに行ったことがない場合は少し複雑です。
心に留めておくべき最も重要なこと: diff は、他のインデントに加えて、常に 1 文字でインデントされます。
文字は次のいずれかです。

  • スペース (変更されていない行を示す)、
  • -行が削除されたことを示す
  • または行+が追加されたことを示す 。

他には何もありません。スペース、-、または + のいずれかでなければなりません。それ以外の場合は、エラーが発生します
(古い行を削除し、変更された行を新しい行として追加することで処理されるため、変更された行に文字はありません)。

お気に入りのテキスト エディターで diff を開いたので (お気に入りのテキスト エディターを使用するように Git を構成しましたよね?)、結果の diff が適切に適用されることを確認する限り、好きなことを行うことができます。

そしてそこに秘訣があります。これまでにこれを行ったことがない場合、Git は「編集したハンクは適用されません。もう一度編集しますか?」と表示します。非常に簡単に思えても (または、Git はあなたが望むものを理解できないため)、これを理解できないことで自分自身を憎み始めることがよくあります。

よくつまずいたのは、1 文字のインデントを忘れていたことです。
削除する - で行をマークしますが、 を挿入するほとんどのテキスト エディターで-は、以前にあったスペースは上書きされません。これは、行全体に追加のスペースを追加していることを意味します。これは、差分アルゴリズムが元のファイルの行を見つけられない/一致しないことを意味し、Git があなたに怒鳴ることを意味します

もう 1 つのことは、差分が意味を成さなければならないということです。「センス」とは、きれいに塗れることを意味します。賢明な差分を作成する正確な方法は、少し暗い芸術のように思えますが (少なくとも今の私には)、元のファイルがどのように見えるかを常に念頭に置いて、それに応じて -s と +s を計画する必要があります。ハンクを頻繁に編集すれば、最終的にコツをつかむことができます。

git add -p に関するこのコミットも参照してください。

Ortomala Lokni回答は、Joaquín Windmüllerのブログ投稿「git (または Imma edit your hunk) でコミットする変更を選択して選択する」を参照しています。

行数を数える代わりに、Git がやりたいことは、編集されたハンクを適用する前に (1 つが編集されたときに) 重複するハンクを結合することです。
これは2018 年半ばに議論され、次のようなシナリオを回避します。

ハンクを分割し、最初のサブハンクを編集し、末尾のコンテキスト行を削除に変換してから、2 番目のサブハンクをステージングしようとすると失敗します。

于 2010-07-16T20:39:19.090 に答える
54

もちろん、私はこれに遅れていますが、それでも、この問題は昨年gitメーリングリストで議論されており、それ以来あまり変わっていないようです。

この特定の問題は、同じハンクを分割して編集しようとすることに起因します。ジェフ・キングによって最初に投稿された根本的な問題の分析は、本質的に次のとおりです。

うーん。なるほど、分かりました。「この差分は適用されますか」チェックは、分割パッチの両方の部分をgit-applyにフィードします。ただし、もちろん、コンテキストが最初の部分と重複しているため、2番目の部分が正しく適用されることはありませんが、それは考慮されていません。

編集したパッチだけでチェックを行うとうまくいきます。ただし、分割パッチの残りの半分を受け入れるかどうかによっては、編集したパッチが長期的に適用できない可能性があることは考慮されていません。そして、ユーザーが私たちに言っていない可能性があるため、まだそれを知ることはできません(彼らは前半をスキップし、編集ステップの後で後で戻ってくる可能性があります)。

ジェフは、常に成功する非常に実用的な回避策で自分の投稿を締めくくっています。したがって、次のことを強くお勧めします。

したがって、一般的に、同じハンクを分割して編集することは本質的に危険であり、この種の問題につながると思います。また、編集は機能のスーパーセットを提供するため、編集して、ハンクの最初の部分を適用できるようにするか、好みに応じて適用しないようにする必要があると思います。

以前に分割されていないハンクを編集することを選択するだけで、行番号を処理する必要がなくなります。

于 2010-12-21T14:45:43.660 に答える
37

この特定の例では、ハンクの行番号を微調整する必要があります。行を変更します。

@@ -1,6 +2,8 @@

代わりに次のようにします。

@@ -2,7 +2,8 @@
于 2010-07-17T08:44:58.963 に答える
19

次のように、削除のためにステージングされた行を削除したくない場合

 first line
-second line
 third line

2 行目を残したい場合は、-行全体を削除するのではなく (追加された行を削除する場合と同様)、 を必ずスペースに置き換えてください。Git はコンテキストに行を使用します。

于 2013-03-24T22:18:15.017 に答える
17

私は最近、このスレッドを読んで手動編集の方法を理解しました。

私が使用したトリックは、次のような差分がある場合です。

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

秘訣は、不要な 2 行を完全に削除して、結果の差分を次のようにすることです。

+ Line to add
+ Line to add

これはほとんどの人にとって明らかなことですが、今日まで私にはそうではなかったので、自分の経験を共有する必要があると思いました. この方法に危険性があるかどうか教えてください。

于 2011-04-07T08:06:36.020 に答える
7

行番号を手動で編集できます。これは、場合によっては間違いなく便利です。ただし、最初にハンクを分割しないことで、この特定の問題を回避できた可能性があります。

Git が自動的に選択したハンクで後で何かを編集する必要があることがわかった場合は、分割して半分をステージングし、残りの半分を編集するのではなく、ハンク全体を編集することをお勧めします。Git はそれを理解するためにより良い仕事をします。

于 2012-03-20T18:05:24.717 に答える
6

私は同じ問題の解決策を探してこの質問に来ましたが、ハンクの行番号を変更して(上記のように)、私の場合はgitがそれを受け入れるようにする方法がわかりませんでした。しかし、それを使用してそれを行うためのはるかに良い方法を見つけましたgit gui。そこで、ステージングする差分の行を選択し、右クリックして「コミットから行をステージング」を選択します。git-colaにも同じ機能があることを覚えています。

于 2011-10-06T08:14:31.727 に答える
5

このエラーが発生したときに発生した追加の問題は、編集ファイルを保存したときに行末が変更されたことです。

私はWindowsを使用し、編集にメモ帳を使用していました(Windowsの行末でのみ保存します)。私のコードはNotepad++で書かれており、Unix/Linuxスタイルの行末を持つように設定しました。

設定を変更してNotepad++をデフォルトのgitエディターとして使用すると、ハンクを編集できました。

git config --global core.editor "notepad++"
于 2012-11-12T21:03:18.430 に答える