git add--interactive「編集したハンクは適用されません」


86

を使用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

私はsplitで応答し、続いて「no」で最初のハンクを適用します。2番目の塊、私は編集しようとします。私はもともと収益を削除しようとしました-それはうまくいきませんでした。塊をそのままにしておくことも完全には機能せず、その理由がわかりません。


ここで確認する-のは、最初からファイルに存在しない行の先頭に 'を追加していないことです。これは差分であり、まだ存在していない行を削除することはできません。それで、diffの行がで始まり、+それを-gitに変更すると、WTFになりますか?なぜなら、削除のマークが付けられた行が最初から存在しないためです(代わりに、その行が追加のマークが付けられ、追加のマークが付けられた行が削除のマークが付けられている場合、gitはまだファイルにない行を削除できません) 。
leeand00 2016

1
私の場合、CRLFの代わりに1つのLFに適用されなかった場合は、行末(LF、CRLF)も確認してください。
アルベルトリヴェリ2016年

回答:


37

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

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

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

@@ -2,7 +2,8 @@

16
少し調べてみると、これらの行に「ファイルからの範囲」と「ファイルからの範囲」が表示されていることがわかりました。1を2に変更する背後にあるロジックを本当に理解していません。試してみましたが、機能しますが、「ファイルからの範囲」が変更される理由がわかりません。パッチ全体を適用する場合でも、編集したハンクだけを適用する場合でも、元のファイルは同じです。さらに明確にするか、統一されたdiff形式の降下リファレンスを教えてください。私は1つを見つけることに失敗しました。
Josh

9
@Josh:stackoverflow.com/questions/2529441/…完全に統合フォーマットのハンクを取得していなくても、役に立ちます。@William +1
VonC 2010

5
@Josh:調べてみると、バグのようです。ハンクを編集した後、gitはすべてのハンクが適用されることを確認してパッチの検証を試みます(これは過剰な場合があります)。残念ながら、この場合、それは前のハンク(適用していない)がチェックされていることを意味し、git apply--checkが失敗する原因となるいくつかのオーバーラップがあります。エレガントな解決策はわかりません。gitは、ここで過度に用心深くすることで正しいことをしている可能性があります。
William Pursell 2010

22
行番号の変更に関する詳細情報を教えてください。なぜ私たちはそれをしなければならないのですか?そしてどうやって?それぞれの数字はどういう意味ですか?
ビル

4
@WilliamPursellどのバージョンのgit?新しいコンピューターに切り替えてgitv2.17.0を実行しましたが、突然パッチの編集が無効になりました。
デニス

105

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

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

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

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

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

そしてそこにトリックがあります。これまでにこれを行ったことがない場合、Gitは「編集したハンクは適用されません。もう一度編集しますか?」と表示します。非常に簡単に思えますが(または、Gitが必要なものを理解できないため)、これを理解できないことを嫌うことがよくあります

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

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

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

Ortomala Lokni回答は、JoaquínWindmüllerのブログ投稿「gitでコミットする変更を選択的に選択する(またはImmaがハンクを編集する)」を参照しています

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

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


5
リンクをありがとう、しかし私はすでにこれを見ました。私は追加の行を追加/削除していませんでした。問題は行番号にありましたが、私はまだ修正を理解していません。
Josh

9
削除された「-」を空白に置き換えていなかったので、インデントを台無しにしました。どうも!!
pedorro 2015年

空白部分を誤解しないように注意してください。変更されていないすべての行は、単にインデント文字ではなく、黒の行である必要があると思いました...理由を理解するまで、1時間の「編集されたハンクは適用されません」:-/
オリゴフレン2016

@oligofren私はあなたを理解しているかどうかわかりません:編集したハンクを適用するために何をしなければなりませんでしたか?
vonC 2016

1
@VonC:私は最初- foo に ``に変更する必要があると考えました(「空白スペース行全体」ではなく、単なる空白スペース)。それが `foo`であるべきだと理解するのに少し時間がかかりました。
オリゴフレン2016

48

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

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

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

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

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

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

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


6
おかげで、これは実際に行番号をいじるよりもはるかに簡単です。
michiakig 2012

3
これが私の問題でした。私の塊を小さくする必要がありました。インタラクティブで分割を実行しました。分割は私が望んでいたものではなかったので、手動で編集してみることにしました。エラーが発生し続けました。最初からやり直して、最初に試しました。
カイルの

これがこのスレッドのベストアンサーです。分割して編集しないでください。編集するだけです。
Dr_Zaszuś

私の場合、^Mdiffファイルに示されているWindowsの行末から余分な問題が発生していました。CRエンディングでファイルを保存すると、インタラクティブ編集パッチが適用されました。
Dr_Zaszuś

おかげで、これは私のためにトリックをしました。私は巨大な塊に取り組む必要があったので、それを分割しました、そしてすべてが壊れました。分割しないでおくと、すべてが正常に機能します。
マティアスフィッシャー

16

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

 first line
-second line
 third line

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


1
これは私にはわかりませんでした。Gitがラインを単一のスペースにするように言っていると思いました。
JackHasaKeyboard 2016年

15

ハンクヘッダーを正しく変更することも重要@@ -1,6 +1,9 @@です(例)。Joaquin Windmullerは、彼のブログ投稿の1つでハンクヘッダー編集の秘密を明らかにしています。

ハンク編集の秘訣

ハンクの編集は最初は混乱する可能性があります。gitが提供する手順は助けになりますが、始めるには十分ではありません。

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

秘密のソースは…行を数えることです:

  • +で始まる行を削除した場合は、新しい行数(ハンクのヘッダーの最後の桁)から1を引きます。
  • -で始まる行を削除した場合は、新しい行数(ハンクのヘッダーの最後の桁)に1を追加します。
  • 他の行(参照行)は削除しないでください。

これにより、ハンクをすばやく変更して、必要なパーツを選択できるようになります。


1
ハンクヘッダーの編集を自動化する方法や、適切な行数を決定するようにgitを構成する方法はありますか?
デニス

これを自動化するために、おそらくお気に入りのエディターをスクリプト化することができます。たぶん、これにはすでにいくつかのプラグインがありますが、これはエディターに依存します。
Ortomala Lokni 2018年

13

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

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

+ 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

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


2
どうもありがとうございました!私は少なくとも1時間は+にに変更しようとしていました' '
soumer 2017年

ご存知のように、狂気は同じことをしていて、異なる結果を期待しています。私は自分自身に20分間、私はちょうど:)を削除するために必要なことを考え出した前と言ってきた
solidak

7

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

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


6

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


これは本当に答えになるはずです。 git-colaLinux、Windows、MacOSで動作するようです。
leeand00 2017

5

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

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

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

git config --global core.editor "notepad++"

1
これは私のために働いた。しかし、私はnotepad ++へのフルパスが必要であり、それを正しく行うには時間がかかりました:( git config --global core.editor '"C:/Program\ Files\ \(x86\)/Notepad++/notepad++.exe"' notepad ++がPCのどこにインストールされているかに応じてこれを適応させてください)
Annabel

1
私にとってもまったく同じ問題です。問題を引き起こしていたのはメモ帳でした。デフォルトのエディタをNotepad ++に切り替えると、すべてが再び機能し始めました。
ジョニー・牡鹿

4

奇妙な「編集したハンクが適用されません」というメッセージ(「エラー:行にヘッダーのないパッチフラグメント...」などが伴う可能性があります)の理由の1つは、末尾の空白を削除するように構成されている場合のエディターである可能性があります。パッチが空の行を1つのスペースを持つ行としてエンコードするため、このようなエディターで保存した場合、空の行を含むハンクは適用できないため、これは明らかに大きな問題を引き起こします。したがって、事実上、変更されていない空の行を含むハンクは、末尾の空白の削除がオンになっている場合、編集後に適用できません。


0

参考までに、わずかに相互に関連するエラーが発生していました...上記の推奨手順に従ってパッチを追加すると...エラーは表示されませんでした。同じハンクをステージングするように繰り返し求められていました...古いバージョンのVim7.4を実行していることに気づきました... vimをアップグレードしたところ、期待どおりに機能しています。うまくいけば、これは誰かを助けるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.