devブランチをmasterにマージしようとしていました。
git checkout master
git pull . dev
競合があったものの、すべてうまくいったようでしたが、これらを修正してコミットしました。しかし、この新しくマージされた作業ツリーを確認したところ、開発者から多くのフォルダーとファイルが欠落しています。
git status // Shows conflicts & doesn't list some files/folders.
git commit -a
Created commit 55ffdd1: Merge branch 'dev' into master
git diff dev --name-status
生産:
D folders/lm.gif
D folders/lmh.gif
...
したがって、「gitstatus」に表示されなかったファイル/フォルダー。また、マージされた競合を修正したときに、最後に表示されませんでした。
また、もう一度マージしようとすると、次のように表示されます。
git merge dev
Already up-to-date.
それでも、masterブランチには明らかにdevブランチからのファイル/フォルダーがありません。何故ですか?そのフォルダとそのすべてのコンテンツを追加するべきではありませんか?'folders'はdevブランチで追跡されているので、マージを行ったときにプルオーバーされるべきではありませんか?
以前にマージの競合が発生したとき、gitはマージプロセスを停止し、多数のファイル/フォルダーをスキップしましたか?
devブランチにはかなり多くの変更がありましたが、過去にgitで何かを台無しにして、特定のファイル/フォルダーがマージされなかった可能性がありますか?
(私が最初に開発ブランチを作成したとき、私は自分が何をしているのかわからず、リセット、復帰などのクレイジーなことをしました)
git guruがスタックオーバーフローに参加していることを願って、答えを知っています。:)
ありがとう、クアン
答え
ウォルターに感謝します、はい、これが起こったことです。
調査を行った結果、何が起こったのかが少し複雑であることがわかりました。それは明らかになった。
- devはmasterから分岐し、すべてのファイルがありました。
- 3番目のブランチは、開発から分岐した「クリーン」と呼びましょう。
- クリーンなブランチはすべてのファイルを削除しました。
- クリーニングされたブランチがマスターとマージされました(または何か?)。この時点で、ファイルはマスターから削除されました。そして、「きれいにされた」枝は消えました。
- 開発では、ファイルはまだそこにあり、私はこのブランチに追加し続け、かなり長い間ファイルを編集しました。
- devはmasterとマージされ、cleanedによって以前に削除されたすべてのファイルがなくなりました。
これが、git log、git show、gitreflogの使用方法について多くのことを学んだ私以外の誰かが何が起こったのかをデバッグするのに役立つことを願っています。
ありがとう!
直し方
これが、以前に削除されたdevのすべてのコンテンツをマスターにマージするために行ったことです。
- 削除されたすべてのファイル/フォルダーを取得しました(開発では、新しくマージされたマスターではありません)
git diff dev --name-status | grep D > deleted_files
- すべてのファイルとフォルダの出力リスト
git log --name-status > file_history
これを使用して、削除されたファイルの最後に更新されたバージョンを把握します。 - 削除されたファイルのリストを1つずつ確認し、file_historyで最新バージョンを見つけて復元します。例:
git checkout 25b8a44 view.php
25b8a44 ...は、view.phpの最後に更新されたバージョンでのコミットでした。私は試しcherry-pick
てgit checkout dev view.php
みましたが、コミットIDを明示的に使用していることがわかりました。これにより、より多くの履歴がマージされます。(最初にファイルが削除される原因となるコミットを含みます。) - 削除されたすべてのファイルが戻ったら、クイックチェック
git diff dev --name-status | grep D
ですべてのファイルがコピーされていることが示されます。それからウォルターが修正コミットを言ったようにgit commit --amend
:)