Search code examples
gitgit-show

How can I get "git show" to show diffs with full context?


I am reviewing a very old commit. I want to see the changes a particular commit made but I want to see that in full context, i.e. I want to see whole file and the changes that person had made. The following command,

git show -w <commit-id>

is not showing me full context. Any suggestion?


Solution

  • git-show comes with the following flag

    -U<n>, --unified=<n>
        Generate diffs with <n> lines of context instead of the usual
        three. Implies -p.
    

    See the git-show man page for more details. By specifying a large enough <n>, e.g.

    git show -U1000 <object>
    

    you will get full context.

    Example

    Clone some repository for the sake of this example (e.g. the Git project's repo):

    $ git clone https://github.com/git/git
    $ cd git
    

    Try running the command in question on some committed file (e.g. Documentation/RelNotes/2.3.0.txt):

    $ git show -U100 -- Documentation/RelNotes/2.3.0.txt
    commit 1e6f5b22ad318446500fbd3b94b733eddd5b6414
    Author: Junio C Hamano <gitster@pobox.com>
    Date:   Wed Jan 7 13:12:54 2015 -0800
    
        Fourth batch for 2.3 cycle
    
        Signed-off-by: Junio C Hamano <gitster@pobox.com>
    
    diff --git a/Documentation/RelNotes/2.3.0.txt b/Documentation/RelNotes/2.3.0.txt
    index 1b1dcbb..7f25bbf 100644
    --- a/Documentation/RelNotes/2.3.0.txt
    +++ b/Documentation/RelNotes/2.3.0.txt
    @@ -1,165 +1,247 @@
     Git v2.3 Release Notes
     ======================
    
     Updates since v2.2
     ------------------
    
     Ports
    
      * Recent gcc toolchain on Cygwin started throwing compilation warning,
        which has been squelched.
    
    
     UI, Workflows & Features
    
      * It was cumbersome to use "GIT_SSH" mechanism when the user wanted
        to pass an extra set of arguments to the underlying ssh.  A new
        environment variable GIT_SSH_COMMAND can be used for this.
    
      * A request to store an empty note via "git notes" meant to remove
        note from the object but with --allow-empty we will store a
        (surprise!)  note that is empty.
    
      * "git interpret-trailers" learned to properly handle the
        "Conflicts:" block at the end.
    
      * "git am" learned "--message-id" option to copy the message ID of
        the incoming e-mail to the log message of resulting commit.
    
    + * "git clone --reference=<over there>" learned the "--dissociate"
    +   option to go with it; it borrows objects from the reference object
    +   store while cloning only to reduce network traffic and then
    +   dissociates the resulting clone from the reference by performing
    +   local copies of borrowed objects.
    +
      * "git send-email" learned "--transfer-encoding" option to force a
        non-fault Content-Transfer-Encoding header (e.g. base64).
    ...
    

    Sanity check

    Compare the output of that command to the contents of Documentation/RelNotes/2.3.0.txt.

    $ cat Documentation/RelNotes/2.3.0.txt
    Git v2.3 Release Notes
    ======================
    
    Updates since v2.2
    ------------------
    
    Ports
    
     * Recent gcc toolchain on Cygwin started throwing compilation warning,
       which has been squelched.
    
    
    UI, Workflows & Features
    
     * It was cumbersome to use "GIT_SSH" mechanism when the user wanted
       to pass an extra set of arguments to the underlying ssh.  A new
       environment variable GIT_SSH_COMMAND can be used for this.
    
     * A request to store an empty note via "git notes" meant to remove
       note from the object but with --allow-empty we will store a
       (surprise!)  note that is empty.
    
     * "git interpret-trailers" learned to properly handle the
       "Conflicts:" block at the end.
    
     * "git am" learned "--message-id" option to copy the message ID of
       the incoming e-mail to the log message of resulting commit.
    
     * "git clone --reference=<over there>" learned the "--dissociate"
       option to go with it; it borrows objects from the reference object
       store while cloning only to reduce network traffic and then
       dissociates the resulting clone from the reference by performing
       local copies of borrowed objects.
    
     * "git send-email" learned "--transfer-encoding" option to force a
       non-fault Content-Transfer-Encoding header (e.g. base64).
    
     * "git send-email" normally identifies itself via X-Mailer: header in
       the message it sends out.  A new command line flag --no-xmailer
       allows the user to squelch the header.
    
     * "git push" into a repository with a working tree normally refuses
       to modify the branch that is checked out.  The command learned to
       optionally do an equivalent of "git reset --hard" only when there
       is no change to the working tree and the index instead, which would
       be useful to "deploy" by pushing into a repository.
    
     * "git new-workdir" (in contrib/) can be used to populate an empty
       and existing directory now.