違い - git 部分 マージ
Gitで落とした隠しを回復するには? (13)
私は頻繁にgit stash
とgit stash pop
を使用して作業ツリーの変更を保存して復元します。 昨日、私は自分の働く木に何か変更を加えて、私が隠していたところを突き止めました。そして私は自分の働く木にもっと多くの変更を加えました。 私は戻って、昨日の隠された変更を見直したいが、 git stash pop
は関連するコミットへのすべての参照を削除するように見える。
git stash
を使用すると、 .git / refs / stashにstashを作成するために使用されたコミットのリファレンスが含まれていることがわかります。 そして、 .git / logs / refs / stashには隠し文字が含まれています。 しかし、これらの参照はgit stash pop
後になくなっています。 私はコミットがどこかのリポジトリにまだ残っていることを知っていますが、私はそれが何であったのか分かりません。
昨日のstash commit referenceを回復する簡単な方法はありますか?
今日の私にとっては、毎日のバックアップがあり、昨日の作業ツリーに戻って変更を加えることができるので、これは私にとっては重要ではないことに注意してください。 簡単な方法が必要なので私は頼んでいる!
git v2.6.4を使用しているOSXでは、誤ってgit stashを実行しただけで、ステップの下にトラフがあります
ひな形の名前を知っているなら、
$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>
それ以外の場合は、結果から手動でIDを検索します:
$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show
あなたがコミットIDを見つけたら、ちょうどgit stashを適用するapply {commit-id}
これが誰かを素早く助けてくれること
gitkを使用したWindows PowerShellの同等機能:
gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })
1つのパイプでこれを行うより効率的な方法がおそらくありますが、これは仕事です。
あなたのリポジトリにまだ残っていて、もう到達可能ではないスラッシュのリストを取得するには:
git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP
stashにタイトルをつけた場合は、コマンドの最後にある-grep=WIP
"WIP"をメッセージの一部と-grep=Tesselation
ます(例: -grep=Tesselation
。
stashのデフォルトコミットメッセージは、 WIP on mybranch: [previous-commit-hash] Message of the previous commit.
の形式になっているため、コマンドは "WIP"のためのWIP on mybranch: [previous-commit-hash] Message of the previous commit.
これを受け入れられたソリューションに加えたことについて言及したかっただけです。 私がこのメソッドを試したときには、すぐにはわかりませんでしたが(おそらくそれはあったはずです)、ハッシュ値からstashを適用するには、単に "git stash apply"を使用してください:
$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219
私がgitを初めて使った時、これは私には分かりませんでした。私は "git show"、 "git apply"、 "patch"などのさまざまな組み合わせを試していました。
なぜ人々はこの質問をしますか? 彼らはまだreflogについて知りませんし、理解していないからです。
この質問へのほとんどの答えは、誰も覚えていないオプションで長いコマンドを与える。 だから、人々はこの質問に来て、彼らが必要と思っているものをそのままコピーして、すぐにそれを忘れる。
私はこの質問で皆にアドバイスして、reflog(git reflog)を確認するだけで、それ以上のことはしません。 すべてのコミットのリストを見ると、何を求めているのかを知り、チェリーを選んだり、そこからブランチを作成したりする百の方法があります。 このプロセスでは、reflogと様々な基本的なgitコマンドに対する有用なオプションについて学んでいます。
アリストテレスの受け入れられた答えは、非隠しのようなコミットを含むすべての到達可能なコミットを表示します。 ノイズを除去するには:
git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
--grep="WIP on" --min-parents=3 --max-parents=3
これには、厳密に3つの親コミット(隠されている)とメッセージに "WIP on"が含まれているコミットだけが含まれます。
stashをメッセージ(例えば、 git stash save "My newly created stash"
ように保存)で保存すると、これはデフォルトの "WIP on ..."メッセージよりも優先されます。
コミットに関する詳細を表示することもできます(例えば、コミットメッセージを表示することも、 git stash show
渡すこともできます)。
git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
--grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
git log -1 --format=medium --color=always '{}'; echo; \
git stash show --color=always '{}'; echo; echo" | \
less -R
別の一般的な使用例: 間違ったブランチにポップして衝突が発生しましたか?
あなたが望むのは、ポップを元に戻すだけですが、正しいブランチ上にポップアップできるように、スティッシュリストに残しておきます。
これを修正するには、次のようにします。
git reset HEAD --hard
git checkout my_correct_branch
git stash pop
完了!
到達不能なすべてのコミットを表示するには、このコマンドをterminal-
git fsck --unreachable
到達不能なコミットハッシュをチェックする -
git show hash
最後に、隠しアイテムが見つかった場合に適用します。
git stash apply hash
次の手順を使用して回復しました。
削除されたstashハッシュコードを特定する:
gitk --all $(git fsck --no-reflog | awk '/ダングリングコミット/ {print $ 3}')
チェリーピック・ザ・ステッシュ:
git cherry-pick -m 1 $ stash_hash_code
いずれかを使用している場合、競合を解決する:
git mergetool
さらに、gerritを使用している場合は、コミットメッセージに問題がある可能性があります。 次の代替案に従う前に、あなたの変更を隠しておいてください:
- 以前のコミットにハードリセットを使用し、この変更を再開します。
- また、変更を隠して、リベースして再コミットすることもできます。
私がここに来たのは、私がチェックアウトしたものにかかわらず、隠し場所を実際に戻す方法です。 特に、私は何かを隠してから、古いバージョンをチェックアウトしてからポップしましたが、以前の時点では隠していなかったため、隠しが消えました。 スタックに戻すためにgit stash
を実行することはできませんでした。 これは私のために働いた:
$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/[email protected]{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^ # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.
振り返ってみると、 git stash apply
を使わずにgit stash pop
を使わないでください。 私はbisect
をしていて、 bisect
ごとに適用したい小さなパッチを持っていました。 今私はこれをやっている:
$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.
私はアリストテレスのアプローチが好きでしたが、GITKの使い方は好きではありませんでした...私はコマンドラインからGITを使用することに慣れています。
代わりに、私はダングリングコミットを取り、私のコードエディタでレビューのためにDIFFファイルにコードを出力しました。
git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff
これで得られたdiff / txtファイル(ホームフォルダ内の)をtxtエディタにロードし、実際のコードとその結果のSHAを見ることができます。
それからちょうど使用する
git stash apply ad38abbf76e26c803b27a6079348192d32f52219
私は単純なコマンドウィンドウ(私の場合はWindows 7)でWindows上で動作する答えを得ることができませんでした。 awk
、 grep
、 Select-string
はコマンドとして認識されませんでした。 だから私は別のアプローチを試みました:
- 最初の実行:
git fsck --unreachable | findstr "commit"
git fsck --unreachable | findstr "commit"
- 出力をメモ帳にコピーする
- find
start cmd /k git show
と "unreachable commit"を置き換えてください。
次のようになります。
start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e
- .batファイルとして保存して実行する
- スクリプトは一連のコマンドウィンドウを開き、各コミットを表示します
- あなたが探しているものを見つけたら、
git stash apply (your hash)
実行します。
最高の解決策ではないかもしれないが、私のために働いた
私は誤ってGitUPアプリの隠しを削除しました。 Ctrl + Zを押して元に戻します。
多分それは誰かを助ける;)