43

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がスタックオーバーフローに参加していることを願って、答えを知っています。:)

ありがとう、クアン


答え

ウォルターに感謝します、はい、これが起こったことです。

調査を行った結果、何が起こったのかが少し複雑であることがわかりました。それは明らかになった。

  1. devはmasterから分岐し、すべてのファイルがありました。
  2. 3番目のブランチは、開発から分岐した「クリーン」と呼びましょう。
  3. クリーンなブランチはすべてのファイルを削除しました。
  4. クリーニングされたブランチがマスターとマージされました(または何か?)。この時点で、ファイルはマスターから削除されました。そして、「きれいにされた」枝は消えました。
  5. 開発では、ファイルはまだそこにあり、私はこのブランチに追加し続け、かなり長い間ファイルを編集しました。
  6. devはmasterとマージされ、cleanedによって以前に削除されたすべてのファイルがなくなりました。

これが、git log、git show、gitreflogの使用方法について多くのことを学んだ私以外の誰かが何が起こったのかをデバッグするのに役立つことを願っています。

ありがとう!

直し方

これが、以前に削除されたdevのすべてのコンテンツをマスターにマージするために行ったことです。

  1. 削除されたすべてのファイル/フォルダーを取得しました(開発では、新しくマージされたマスターではありません)git diff dev --name-status | grep D > deleted_files
  2. すべてのファイルとフォルダの出力リストgit log --name-status > file_historyこれを使用して、削除されたファイルの最後に更新されたバージョンを把握します。
  3. 削除されたファイルのリストを1つずつ確認し、file_historyで最新バージョンを見つけて復元します。例:git checkout 25b8a44 view.php25b8a44 ...は、view.phpの最後に更新されたバージョンでのコミットでした。私は試しcherry-pickgit checkout dev view.phpみましたが、コミットIDを明示的に使用していることがわかりました。これにより、より多くの履歴がマージされます。(最初にファイルが削除される原因となるコミットを含みます。)
  4. 削除されたすべてのファイルが戻ったら、クイックチェックgit diff dev --name-status | grep Dですべてのファイルがコピーされていることが示されます。それからウォルターが修正コミットを言ったようにgit commit --amend:)
4

1 に答える 1

23

gitは、欠落しているファイルがdevから分岐した場所とマージ前のヘッドの間のある時点でマスター上で削除されたと考えているようです。それが、マージ中にgitが追跡されたファイルをサイレントにドロップする理由について私が考えることができる唯一の理由です。

残念ながら、それを修正する良い方法がわかりません。おそらく、devブランチから削除されたすべてのファイルを手動で(または少しのbashスクリプトを使用して)再追加し、次にgit commit --amendそれらを含めるようにマージコミットを修正します。

于 2010-08-12T23:54:23.347 に答える