コミットせずにgit stashの競合を解決するにはどうすればよいですか?


495

なので この質問に尋ねた、私はまた、矛盾を解決する方法を知りたいgit stash pop(ない競合することなく、単に「gitのスタッシュポップ」のように)コミットにすべての修正を加えることなく。

私がこのように行うので、私の現在のアプローチは非常にクールです。

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[更新]それを再現する方法:

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27:scyからのソリューションのような回避策は空のHEADに対してのみ機能するが、HEADのような同じ内容がないという最初の問題を修正しないことを示すために、例に「third」という新しいファイルを追加しました以下のためのgit stash pop競合なし。


したがってgit add、解決した競合ファイルをインデックスに効果的にステージングし、それらをインデックスに含めないようにしますか?
ロメイン、

はい、そうです。git stash pop競合が発生しない場合の動作が必要です(ただし、どのファイルをマージする必要があるかを通知します)。
2011年

2
これに対する答えはここにあるようです:stackoverflow.com/questions/3945826/git-stash-questions。選ばれた答えの4番目のコメントで、Adamはgitがこれを行う理由を説明しています。
Patrick

@Patrickこの情報をお寄せいただきありがとうございます。「仕様による」ため、利用可能な解決策はないようです
Sven

回答:


509

他の回答には従わないでください

まあ、あなたはそれらに従うことができます:)。しかし、コミットを実行してからブランチをリセットしてそのコミットを削除することや、他の回答で提案されている同様の回避策がこの問題を解決するためのクリーンな方法だとは思いません。

クリーンなソリューション

次の解決策は私にははるかにクリーンであるように思われ、Git自体から提案さgit statusれています。競合のあるリポジトリで実行してみてください。

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

それでは、Gitが提案することをしましょう(無駄なコミットを行わずに):

  1. 手動で(またはいくつかのマージツールを使用して、以下を参照)、競合を解決します。
  2. git reset競合を解決済みとしてマークし、変更をステージング解除するために使用します。パラメータなしで実行でき、Gitはすべてをインデックスから削除します。git add以前に実行する必要はありません。
  3. 最後に、git stash dropGitは競合時にそれを行わないため、を使用して隠し場所を削除します。

コマンドラインに翻訳されます:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

デフォルトの動作の説明

そこに解決としてマーキング紛争の二つの方法があります:git addgit reset。しばらくgit resetマーク紛争などを解決し、削除したファイルのインデックスから、git addまたマーク紛争が解決などが、インデックス内のファイルを保持します。

競合が解決された後にインデックスにファイルを追加することは、意図的なものです。このようにして、以前のスタッシュからの変更と、競合の解決後に行った変更を区別できます。気に入らない場合はいつでも使用できますgit resetしてインデックスからすべてを削除ます。

マージツール

手作業ではなく、KDiff3Meldなどの3者間マージツール使用して競合を解決することを強くお勧めします。通常は、競合のすべてまたは大部分を自動的に解決します。それはだ巨大な時間の節約!


32
@kamalpal git stash popは、競合で失敗したときに必要となるようです。
Emile Bergeron、2016年

21
@kamalpalはい、Gitは衝突した場合にstashがドロップされなかったことを通知します。そして問題はそのようなケースに関するものだったので、その隠し場所を維持したくないのであれば、本当に実行する必要がありgit stash dropます。
David FerenczyRogožan2016年

@DavidFerenczyRogožanGitは、スタッシュエントリをドロップしなかったことをまったく通知しませんでした。バージョン2.17.1はこちら。
Robert Siemer

298

オリジンからプルするために変更を隠しておくこのシナリオがあるとします。ローカル変更がdebug: true一部の設定ファイルにあるためと考えられます。今、あなたはプルし、誰かがそこに新しい設定を導入し、衝突を引き起こしました。

git status 言う:

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

はい。私はGitの提案に従うことを決めました:競合を解決してコミットしました:

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

現在、作業コピーは希望の状態ですが、不要なコミットを作成しました。作業コピーを変更せずにそのコミットを削除するにはどうすればよいですか?待ってください、そのための人気のコマンドがあります!

git reset HEAD^

私の作業用コピーは変更されていませんが、WIPコミットはありません。それがまさに私が欲しかったものです!(私は--softここでは使用していません。stashに自動マージされたファイルがある場合、それらは自動ステージングされるため、これらのファイルが後で再びステージングされることになります。resetます。)

しかし、もう一つは、左があります:manページをためgit stash popていることを思い出させてくれる「競合で失敗する可能性がある状態を適用すると、この場合には、それはスタッシュリストから削除されていないあなたが手で競合を解決して呼び出す必要がありますgit stash drop。その後、手動」これがまさに私たちが今行っていることです。

git stash drop

そして完了。


34
作業ツリーにのみ影響を与えるものに対して、意図的にコミットリセットHEAD ^ ...を行わなければならない場合、継承の醜さはたくさんあります。

6
なぜ競合を解決してから、その後にgit add <resolved conflict files>続けgit reset HEADないのですか?
BoltzmannBrain

提案に感謝しますが、これはこれがgit stash pop競合なしのように同じ動作ではないという最初の問題を修正しません。競合git stash popを行う前に別のファイルをHEADにgit commit -a -m WIP追加するだけで、新しいファイルをコミットに追加することもできます。ただし、競合がなければ、新しいファイルだけがHEADに残り、ファイルは残りませんgit stash pop
Sven

7
最初にコミットしてからコミットを元に戻す必要はないと思います。Dawid Ferenczyからリセットするだけで答えは同じになります
vladkras

3
Windowsユーザーの場合、これ^は特別な行の継続として使用され、Moreに座ったままにしますか?コマンドを実行する代わりにプロンプ​​ト。代わりに:を使用してくださいgit reset --soft HEAD~1。参照してください-どのように行う-I-削除-unpushed-のgit-コミット?
mrfelis 2017

87

変更を追加して競合を解決する代わりに、を使用git reset HEAD fileして、変更をステージングせずに競合を解決できます。

ただし、このコマンドを2回実行する必要がある場合があります。1回は競合を解決済みとしてマークし、もう1回は競合解決ルーチンによってステージングされた変更をステージング解除します。

現在は1つはありませんが、これらの両方を同時に行うリセットモードが存在する可能性があります。


2
リセットモードは、私が検索するモードです。他の回避策は、私が説明したものと同様であり、5つを超えるファイルに対しては実用的ではありません。
2011年

25
その後、「git stash drop」を使用して「git stash pop」を終了します。
David Liu

2
質問ではこれを明示的に要求していませんが、競合が発生した場合にstashが自動的にドロップされないため、「git stash drop」を含めるように回答を更新すると役立つ場合があります。
Abhishek Pathak

29
git checkout stash -- .

私のために働いた。

:stashからの変更を作業コピーにマージしようとしないため、これは危険な場合がありますが、代わりにstashされたファイルで上書きされます。したがって、コミットされていない変更を失う可能性があります。


これは、「git pull --autostash」が不要なマージコミットとgit checkout stash-を導入するときに役立ちました。stashからの競合を無条件に上書きします
Alec Istomin

11
git add .
git reset

git add . 競合を解決したことをgitに伝えるすべてのファイルをステージングします

git reset コミットを作成せずに、ステージングされたすべてのファイルをアンステージングします


これは、それはかなりのようなものだ、実際に悪い答えではありませんgit add -u、その後git reset
ebob

4

これはあなたが探している答えのようですが、私はまだ個人的には試していませんが、うまくいくかもしれません。このコマンドを使用すると、GITは変更をすべてコミットしようとすることなく、以前と同じように変更を適用しようとします。

git stash apply --index

ここに完全な説明があります:

http://git-scm.com/book/en/Git-Tools-Stashing


このヒントをありがとう、しかし私がすでにそうしたときこれは助けにはなりませんgit stash pop-またはこれを元に戻して競合が発生git stash apply --indexすることgit stash popがわかったときに行う方法はありますか?
Sven

これを作成する方法の例を追加しました-10以上のファイルを編集しているので、スタッシュの外でどのファイルを変更したのかわからない場合を想像してください。
Sven

3
ここでこの投稿の下部を見ると、実行git stash popして競合が発生した場合、スタッシュは削除されないということを示しています...したがって、実行git reset --hardしてポップを元に戻し、提案した解決策を試すことができます。
Marco Ponti

これを試してみたところ、ファイルが競合状態になっていると機能しません。競合を手動で修正した場合でも。
Sam3k 14

2

git stash branchは機能し、新しいブランチを作成し、作業を隠したときに行っていたコミットをチェックアウトし、そこで作業を再適用し、それが正常に適用された場合はスタッシュを削除します。これをチェック


2

私が見つけた最速の方法は、競合を解決してから実行しgit add -ugit reset HEADコミットすることすらありません。


1

git stashの質問によると、競合を修正した後、git add <file>は正しい行動方針です。

このコメントを読んだ後、変更が自動的にインデックスに追加されることがわかりました(仕様による)。これがgit add <file>、競合解決プロセスを完了する理由です。


-1

それを行うための最良の方法ではありませんが、機能します。

$ git stash apply
$ >> resolve your conflict <<
$ >> do what you want to do with your code <<
$ git checkout HEAD -- file/path/to/your/file

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