365Git

  1. Search
  2. About
  3. Subscribe
  4. Archive
  5. Random

365Git

Regular small snippets and workflows for Git

My original plan of a post everyday turned out to be unrealistic, but I'll carry on posting as regularly as I can.

Find me @abizern on twitter if you have anything you'd like me to cover.

  • Getting a diff between the working tree and other commits

    I’ve previously written about how to get the diffs between your working tree, the index and the last commit. But you frequently need to see the difference between the code you’re working on and previous commits.

    Here’s a diagram that summarises the commands:

    Git diff commands summary

    If you’ve read the previous article then this should make sense I’ve used HEAD~ to represent the parent of the tip of the branch you’re working on, but this can be replaced with the any of the other methods of referring to commits specified in the gitrevisions documentation.

    However, when doing this, you usually only want to see changes between specific files. For this you can optionally pass in the paths that you want the diff between after a pair of dashes --. If you leave out the paths you’ll get the complete diff.

    1. git diff --cached HEAD~ -- somefile.py
      This will show the difference between the version of somefile.py in the index and the version in HEAD~

    2. git diff HEAD~ -- somefile.py
      This will show the difference between the version of somefile.py in the working tree and the version in HEAD~.

    If you are using an external viewer such as Changes or Kaleidoscope (for the Mac) or other tools for other platforms. These usually come with instructions for setting them up and calling them using the git difftool command rather than git diff. The good news is that the options and parameters are the same so you can still get pretty diffs with the same control.

    Tagged: git diff working tree gitrevisions ranges files head index

    Posted on February 23, 2011 with 14 notes ()

  • The four buckets — how Git considers content.

    A slightly longer post today but it’s important that the basics of git are covered.

    My first suggestion is to think of git as tracking content, not files. In the coming days I’ll cover the way that Git stores information and this should become a lot clearer. But it helps to realise that the contents of a file and the name of that file are not kept in the same place. Secondly, Git only tracks changes files that you tell it to track.

    I think of Git considering this content in 4 places. Here’s a simple diagram

    Simple view of git buckets

    This is a simple view of the four buckets. I’ve shown the simplified commands that move content between these buckets (leaving off the extra flags and parameters for simplicity).

    Commit

    This is the frozen state of the files that git is tracking at the time that it was created. These are the objects that are actually stored in a repository and are shared with other repositories

    Index

    This is the staging area for commits. This is the state of the tracked files that will be used to create the commit.

    Working tree

    This is the area where there are changes to tracked files, but these changes have not been added to the index and will not become part of the next commit. This needs some explanation.

    When you create a new repository, and as you add and remove files from your project, you need to tell git about the files that it is supposed to track. But that doesn’t mean that these files’ changes will automatically become part of a commit. The changes need to be in the index for them to become part of the commit. Some people don’t like having two steps to commit a file.But you don’t need to because git commit --all will take all changes to tracked files and make a commit from them in one step.

    Because branching, merging and changing history are easy with git, it encourages you to make many small commits rather than one large commit. So, imagine the scenario where you are working on a feature and add those changes to the index with git add. You can now make other changes to your files. If you think these changes are significant enough to go in their own commit, you can commit the changes that are staged in the index and then add the new changes to this index. Or, if you think you want to make all these changes one commit, just use git commit --all and the new changes and the staged changes will all become a single commit.

    When starting out with git, it’s easy to forget that all changes are not automatically made into a commit. So remember yesterday’s post about amending commits which will help to fix these ommissions.

    Untracked files

    If you add new files to your project they are not tracked by git. If you run git status you’ll see that these new files exist and that they are not tracked. This is a reminder that these may need to be added. Of course, there may be good reasons not to include a file, and if you don’t want to be constantly reminded to add the file, you can ask for it to be ignored. (I’ll cover this another day.)

    Summary

    Git tracks content in 3 places and doesn’t worry about anything it doesn’t track. You can move files between these areas, and if you use git status not only does it tell you what files belong to which area, but also how to move them out of those areas.

    Tagged: git fundamentals commit index working tree files day2 content

    Posted on March 25, 2010 ()

Field Notes Theme. Designed by Manasto Jones. Powered by Tumblr.