Hi Bill,
> Being able to list the reflog and view previous commit messages doesn't restore my history, or allow me to see the changes made to that history.
One of the things which (still) excites me about git is that, actually, you can restore history using the reflog, and you can see the history leading up to each commit.
First off, git stores history as a linked list of working copy snapshots. To display the history for a commit, git log takes the latest commit, follows its parent reference to get the previous commit, then finds the next parent, etc, and prints out the commit message for each one. It can start from any commit, including ones in the reflog. Here is what it looks like:
git log master
git log master@{1}
The first line gets the log starting at the commit which the master branch currently points to, that is, the most recent commit to master.
The second line uses reflog syntax to start logging from where master most recently pointed to, that is, one step back in the reflog. master@{0} points to the current master, master@{2} points further back etc.
Next, restoring history with the reflog. First off, a branch in git is a reference to a commit, which gets updated whenever you commit to a branch. Using git reset, you can change which commit a branch points to. So, if you know the sha1 for a commit, say, from the reflog, you can change the branch to point to that. All together, if you are on the master branch (check git status) you can reset to a different commit like this:
git reset master@{1}
Finally, what is the gitx bug? Well, it sounds like you are left looking at a commit with no history, which looks like it contains a snapshot of the whole working copy. Diffs in the log diff the snapshot from one commit with the snapshot from the previous one, so if it can't find any previous commits there will be nothing to diff with, so the log will show everything as new. Since commits always reference full snapshots, that means the snapshot itself is good. The problem is finding the previous commit. GitX has probably not set the parent commit properly, so git log can't follow the history back.
HTH,
Douglas