私たちは何か悪いことをしました。
git stash save
マージの競合中に実行したため、作業を復元できません。
私たちが試したこと:
git pull -Xours origin master
git stash apply --index
と:
git pull origin master
git stash save --keep-index "merge conflicts"
git stash apply stash@{1}
助けてください!
私たちは何か悪いことをしました。
git stash save
マージの競合中に実行したため、作業を復元できません。
私たちが試したこと:
git pull -Xours origin master
git stash apply --index
と:
git pull origin master
git stash save --keep-index "merge conflicts"
git stash apply stash@{1}
助けてください!
問題はgit stash
、マージしようとしていたブランチへの参照が保存されていないようです。マージ中、これは という名前の ref に保存されMERGE_HEAD
ます。
それを修正して以前の状態に戻すには、マージしようとしていたリビジョン (d7a9884a380f81b2fbf002442ee9c9eaf34ff68d のふりをしましょう) を見つけ、スタッシュを適用した後に MERGE_HEAD をそれに設定する必要があります。
次に、スタッシュを適用して ( --index を使用して、以前にステージングされたすべてのものを再ステージングします)、次のように設定しますMERGE_HEAD
。
git stash apply --index
git update-ref MERGE_HEAD d7a9884a380f81b2fbf002442ee9c9eaf34ff68d
私は今日も同じことを行い、(試行錯誤の末) 別のアプローチを取り、競合の解決を続けてマージを完了することができるように、スタッシュの直前の状態に戻しました。
まず、宛先ブランチで部分マージをアンスタッシュした後、競合が残っているファイルのリスト (テキスト ファイルまたはエディター タブ) を取得しました。競合が解決済みのファイルは stash の前にステージングされているため、これは unstash 後のステージングされていないファイルのリストにすぎません。
$ git status
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: myproject/src/main/java/com/acme/package3/Class3.java
# modified: myproject/src/main/java/com/acme/package3/Class4.java
#
次に、パッチを作成し、ブランチをマージ前の状態にリセットします。
$ git diff HEAD > ~/merge-with-resolved-conflicts.patch
$ git reset --hard HEAD
次に、一時的なブランチ (マージ先ブランチから派生) を作成し、パッチを適用しました。
$ git checkout -b my-temp-branch
$ git apply ~/merge-with-resolved-conflicts.patch
$ git commit -a -m "Merge with resolved conflicts"
そのため、my-temp-branch の HEAD には、競合が解決されたファイルや競合が残っているファイルなど、マージされたすべてのものが含まれるようになりました。
その後、元のブランチに戻り、再度マージして、git のステータスを確認しました。
$ git checkout my-branch
$ git merge other-branch
$ git status
ステータスには、競合のあるファイルの完全なリストが表示されます。
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: myproject/src/main/java/com/acme/package1/Class1.java
# both modified: myproject/src/main/java/com/acme/package2/Class2.java
# both modified: myproject/src/main/java/com/acme/package3/Class3.java
# both modified: myproject/src/main/java/com/acme/package3/Class4.java
#
ここで、これら 2 つのファイル リストを比較する必要がありました。最初のリストではなく 2 番目のリストにあるファイルはすべて解決済みです (この例では、Class1.java と Class2.java)。したがって、これらの各ファイルについて、一時ブランチから競合が解決されたバージョンを取得しました (cherry-pick と同様ですが、コミット全体ではなく個々のファイルに対して):
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package1/Class1.java
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package2/Class2.java
これを行うと、スタッシュの前の状態に戻ったので、残りの競合の解決を再開し、マージをコミットすることができました。
競合状態(インデックスと作業ディレクトリ)にある場合は、実行できません。マージされていないgit stash
エントリの設定でエラーが発生します。
あなたが本当に隠しをしたことを確認してください。git stauts
およびの出力を参照してくださいgit stash show
これ(マージ競合中のgit stash pop)から抜け出すための私の解決策は次のとおりです。
新しい (ローカル) ブランチを作成してチェックアウトする
git ブランチ mytemporarybranch && git checkout mytemporarybranch
このmytemporarybranchにコミットします
git commit -m "私の厄介なマージとスカッシュ"
myoriginalbranchをチェックアウト
git チェックアウト myoriginalbranch
正しくマージします (今回はスカッシュ ポップ/適用はありません!)
mytemporarybranchをmyoriginalブランチにスカッシュマージする
git merge --squash mytemporarybranch
あなたの最後のコメントを考えると:あなたは使うことができます
git stash megre --no-commit <branch>
変更をコミットせずにインデックスを「マージ」状態にする
次に、必要なもので変更します:
stash で既にマージを実行している場合:
git reset #to remove the "conflicts" flags
git checkout <initial commit> -- ./ #to revert everything to the previous working state,
git stash apply #apply your changes
すべてが望ましい状態になったら、git commit
bukzorのコメントについて: 実際には と の間には大きな違いがgit checkout <tree-ish>
ありgit checkout <tree-ish> -- <files>
ます。
の参照からgit checkout
:
git checkout <branch>
: このフォームは、指定されたブランチまたはコミットを反映するために、インデックス、作業ツリー、および HEAD を更新することによってブランチを切り替えます。
git checkout [-p|--patch] <tree-ish> -- <pathspec>
: <paths> または --patch が指定されている場合、git checkout はブランチを切り替えません。作業ツリー内の名前付きパスをインデックス ファイルまたは名前付き <tree-ish> (ほとんどの場合コミット) から更新します。
git checkout <initial commit>
実際にマージ情報を破棄します。
git checkout <initial commit> -- ./
(余分-- ./
な<initial commit>
.