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

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

としてこの質問で尋ねられたまた、すべての変更をコミットに追加せずに競合を解決する方法も知りたいですgit stash pop(競合のない「git stash pop」と同じように)。

私の現在のアプローチは、次のように行うため、非常にクールではありません。

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: 例に「third」という新しいファイルを追加しました。これは、scy のソリューションのような回避策は空の HEAD に対してのみ機能し、git stash pop競合がない場合のように HEAD が同じコンテンツを持たないという初期の問題は修正されないことを示しています。

ベストアンサー1

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

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

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

:restore指示Gitに導入されましたバージョン 2.23.0git reset HEAD <file>.... Gitの古いバージョンでは、 の代わりにコマンドを使用することが推奨されてgit restore --staged <file>...いました。git resetステージングエリア(索引)。復元コマンドの同等のコマンドは ですgit restore --staged .(ドットは必須で、任意のファイルを指定します)。現在、これらのコマンドのどれを使用しても結果は同じです。これらのコマンドの違いを知りたい場合は、ドキュメンテーション

それでは、Git の提案に従って (無意味なコミットを作成したり元に戻したりせずに) 実行してみましょう。

  1. 手動で(または理想的には何らかのマージ ツールを使用する、下記参照)、競合を解決します。
  2. git restore --staged .競合を解決済みとしてマークし、ステージング領域内のすべてのファイルをステージ解除するために使用します。特定のファイルのみステージ解除する場合は、代わりに コマンドを使用しますgit restore --staged <file>。事前に実行する必要はありませんgit add
  3. 最後に、 でスタッシュを削除しますgit stash drop。Git は競合時にこれを自動的に実行しないためです。

コマンドラインコマンドに翻訳すると次のようになります。

$ git stash pop

# ...resolve conflict(s)

$ git restore --staged .

$ git stash drop

デフォルトの動作の説明

git add競合を解決済みとしてマークする方法はとの 2 つがありますgit restore --staged <file>...git restore --staged <file>...は競合を解決済みとしてマークし、インデックスからファイルを削除しますが、git addも競合を解決済みとしてマークしますが、ファイルはインデックスに保持されます。

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

マージツール

ぜひ使用することをお勧めします3方向マージツール紛争解決のため、例えば翻訳メルドなど、手動で行う代わりに、自動的に実行します。通常、競合のすべてまたは大部分が自動的に解決されます。時間の節約になります。

おすすめ記事