Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git Merge - Incomplete, Missing files and Folders

Tags:

git

file

merge

pull

I was trying to merge a dev branch into master.

git checkout master    
git pull . dev

Everything seemed to go well, although there were conflicts I fixed these and commited. But when I checked this newly merged working tree is missing a lot of folders and files from 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

Produces:

D       folders/lm.gif
D       folders/lmh.gif
...

So the files/folders that didn't show up on 'git status'. It also didn't show up at the end when I fixed the merged conflicts.

Also when I try to merge again it says:

git merge dev    
Already up-to-date.

Yet the master branch clearly is missing files/folders from the dev branch. Why is that? Shouldn't that folder and all it's contents be added? 'folders' is being tracked on the dev branch, so shouldn't it have gotten pulled over when I did the merge?

When there was a merge conflict earlier did git stop the merge process and skipped a bunch of files/folders?

The dev branch had quite a lot of changes, could I have messed something up with git in the past that now certain files/folders wouldn't have merged?

(When I first created the dev branch I didn't know what I was doing and did crazy things like reset, reverts etc.)

Hoping one of you git guru's here on stack overflow knows the answer. :)

Thanks, Quang


Answer

Thanks Walter, Yes this is what happened.

After doing some investigating I found out it was a little complicated what happened. It turned out that.

  1. dev branched from master, it had all the files.
  2. A third branch, lets call it "cleaned", branched off of dev.
  3. cleaned branch deleted all the files.
  4. cleaned branch merged (or something?) with master. At this point the files were deleted off of master. And the 'cleaned' branch disappeared.
  5. on dev, the files are still there and I continued adding to this branch, editing files for quite some time.
  6. dev merged with master and all the files that was deleted previously by cleaned were gone.

Hope this helped someone besides me who learned quite a lot about how to use git log, git show, git reflog trying to debug what happened.

Thanks!

How to Fix

So this is what I did to merge all of the contents in dev that was previously deleted back onto master.

  1. Got all the files/folders that was deleted (on dev but not on the newly merged master) git diff dev --name-status | grep D > deleted_files
  2. Output list of all files and folders git log --name-status > file_history Gonna be using this to figure out the last updated version of the deleted file.
  3. Go through the list of deleted_files one by one, find the the most updated version in file_history and restore it. Example: git checkout 25b8a44 view.php 25b8a44... was the commit with the last updated version of view.php. I tried cherry-pick and just a straight git checkout dev view.php but i found explicitly using the commit id, it merge more of it's history. (Including the commit that cause the file to be deleted in the first place.)
  4. Once all the deleted files are back a quick check git diff dev --name-status | grep D shows that all files are copied over. Then like Walter said an ammend commit git commit --amend :)
like image 871
Quang Van Avatar asked Aug 12 '10 23:08

Quang Van


1 Answers

It sounds like git thinks that the missing files were deleted on the master at some point between where it branches from dev and the pre-merge head. That's the only reason I can think of for why git would silently drop tracked files during a merge.

Unfortunately, I don't know a good way to fix that. I'd probably just re-add all the deleted files from the dev branch manually (or with a little bit of bash scripting), and then to a git commit --amend to revise the merge commit to include them.

like image 87
Walter Mundt Avatar answered Oct 17 '22 21:10

Walter Mundt