13

git add -p私は完全に大好きですgit stashが、次の問題が発生することがあります。これは、次の一連のコマンドによって再現されます。

  • git add -p my_file:次に、gitが提案する分割が私に適していないため、(を使用して)手動でハンクを編集しますe
  • git stash --keep-index:それから私はいくつかのテストを行います、そしてテストが合格した場合私はコミットしません
  • git stash pop:問題が発生しました:ファイルmy_file は競合していると見なされ、gitは編集したハンクを完全に混乱させたため、ファイルを編集し、不要なマージマークを削除して、実行してから実行する必要がありgit add my_fileますgit reset HEAD

これはハンクを手動で編集するときにのみ発生するため、私は困惑しています。これがどのように違いを生むのか、私にはわかりません。


問題を再現するには:

  • touch newfile
  • git add newfile
  • git commit -m 'newfile'
  • ファイルに2行追加します
  • git add -p newfile
  • ハンクを編集し(e)、ハンクの行の1つを削除してから、git add(q)を終了します。
  • git stash --keep-index
  • git stash pop

これで、ファイルnewfileはマージされていない状態になります。繰り返しになりますが、この問題は手動で編集されたハンクでのみ発生することに注意してください。ハンクを手動で編集しなくても、上記のコマンドに問題はありません。

ちなみに、ファイルの前の状態は第3段階(git show :3:newfile)にあり、前に段階化されたバージョンは第2段階(git show :2:newfile)にあります。だから、私はいくつかのgit black magicによって、このインデックスに2番目のステージを入れ、作業リポジトリに3番目のステージを入れることができました...しかし、それを行う方法がわからないので、手作業で行います。:-(

4

3 に答える 3

9

手動で編集されたハンクを含む、作業ツリーの変更の一部を含むインデックスを作成してテストするには、次の手順を実行します。

git add --patch <files>

git stash --keep-index

<test the indexed changes>

git reset --hard

git stash pop --index

この時点では競合はなく、リポジトリ、インデックス、および作業ディレクトリはの直前の状態になっていgit stashます。git commitこれで、変更のインデックスを作成できます。

もちろん、これはかなり奇妙で直感的ではありません。これを行うためのより簡単な方法があるかどうかを本当に知りたいと思います。

于 2011-03-14T16:37:03.057 に答える
4

gitメーリングリストで質問しました。私が説明するのは、予想される動作です。バグではありません。:-(

これが私が得た答えです:

ハンクを手動で編集しなかった場合、各ハンクは状態HEADまたは状態Aのいずれかになり、HEADとAの差分をそのようなファイルに適用すると、no-op(ハンクはすでに適用されています)または正常なアプリケーションになります。 。

私にとって、これはの厳しい制限でありgit add --patch、この動作がどのように誰にとっても役立つかはわかりませんが、私はそれと一緒に暮らすことを学びます。

于 2010-11-03T11:14:06.813 に答える
2

git stash --keep-indexインデックスは保持されますが、それでもインデックスの内容がstashの一部として追加されます。

試してみてくださいgit stash save -p-隠し場所を保存するのはもう少し面倒ですが、おそらくあなたが望むことをするでしょう。

于 2010-10-31T01:58:20.530 に答える