web-dev-qa-db-ja.com

Gitマージ-不完全なファイルとフォルダーがありません

開発ブランチをマスターにマージしようとしていました。

git checkout master    
git pull . dev

私はこれらを修正してコミットしましたが、衝突はありましたが、すべてがうまくいくように見えました。しかし、私がこの新しくマージされた作業ツリーをチェックしたとき、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
...

したがって、「git status」で表示されなかったファイル/フォルダー。マージされた競合を修正したときにも、最後には表示されませんでした。

また、私が再びマージしようとすると、それは言う:

git merge dev    
Already up-to-date.

しかし、マスターブランチには明らかにdevブランチからのファイル/フォルダーがありません。何故ですか?そのフォルダーとそのすべての内容を追加する必要はありませんか? 'folders'はdevブランチで追跡されているので、私がマージしたときにプルされてはいけませんか?

以前にマージの競合があったとき、gitはマージプロセスを停止し、ファイル/フォルダーの束をスキップしましたか?

Devブランチにはかなり多くの変更がありましたが、過去にgitを台無しにして、特定のファイル/フォルダーがマージされなかった可能性はありますか?

(私が最初にdevブランチを作成したとき、自分が何をしているのかわからず、リセット、復帰などのクレイジーなことをしました)

あなたの1人がスタックオーバーフローでgit guruがここにいることを願って答えがわかっています。 :)

おかげで、クアン


回答

ウォルターさん、ありがとうございます。これが起こったことです。

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

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

Git log、git show、git reflogを使用して何が起こったのかをデバッグしようとする方法について多くのことを学んだ私以外の誰かの助けになれば幸いです。

ありがとう!

直し方

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

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

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

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

21
Walter Mundt