On 10/8/2019 11:51 PM, wuzhouhui wrote: >> -----Original Messages----- >> From: "Junio C Hamano" <gitster@xxxxxxxxx> >> Sent Time: 2019-10-09 11:02:44 (Wednesday) >> To: wuzhouhui <wuzhouhui14@xxxxxxxxxxxxxxxx> >> Cc: git@xxxxxxxxxxxxxxx, cuifang@xxxxxxxxx >> Subject: Re: How to find the commit that erase a change >> >> wuzhouhui <wuzhouhui14@xxxxxxxxxxxxxxxx> writes: >> >>> I have a file which contains complicated change history. When I use >>> git log -p file >>> to see all changes made in this file, I found that a change disappeared >>> for no reason. >> >> "git log [-p] <pathspec>" is not about seeing *all* changes made to >> the path(s) that match the pathspec. Especially when your history >> has merges, the command is to give you _one_ simplest explanation as >> to how the contents of the path(s) came to be in the shape you see >> in HEAD. >> >> So for example, if you have a history like this (time flows from >> left to right): >> >> O-----A-----B----M-----N >> \ / >> \ / >> X----Y >> >> where A or B did *not* touch "file", X added a definition of func() >> to "file", Y reverted the change X made to "file", M made a natural >> merge between B and Y and N did not touch "file", "git log N file" >> would not even show the existence of commits X or Y. In the larger >> picture, at ancient time O, the file started without func(), and >> none of the commits A, B, M or N felt the need to add it and as the >> result, N does not need the unwanted func(). So "file's contents >> are the same since O throughout the history reaching N" is given as >> _one_ simplest explanation. >> >> The "--full-history" option may help, though. > > "--full-history" doesn't resolve my problem, but > git log -p -c file > does. I found that my change was erased in a merge commit. In these cases of erased merge commits, I find that git log --simplify-merges -- file works best for finding the merge responsible. Just the --full-history option may include many extra merges (if you work in a repo with many collaborators). Thanks, -Stolee