Peter Boughton
Peter Boughton

Reputation: 112150

How should I use git diff for long lines?

I'm running git-diff on a file, but the change is at the end of a long line.

If I use cursor keys to move right, it loses colour-coding—and worse the lines don't line up—making it harder to track the change.

Is there a way to prevent that problem or to simply make the lines wrap instead?

I'm running Git 1.5.5 via mingw32.

Upvotes: 259

Views: 57089

Answers (15)

lindes
lindes

Reputation: 10240

With full credit to Josh Diehl in a comment to this answer, I nevertheless feel like this ought to be an answer unto itself, so adding it:

One way to deal with seeing differences in long lines is to use a word-oriented diff. This can be done with:

git diff --word-diff

In this case, you'll get a significantly different diff output, that shows you specifically what has changed within a line.

For example, instead of getting something like this:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

You might get something like this:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

Or, with colorization, instead of this:

result of just git diff

You might get this:

result of git diff --word-diff

Now, if you're comparing a really long line, you may still have issues with the pager situation you originally described, and which has been addressed, apparently to satisfaction, in other answers. Hopefully this gives you a new tool, though, to more easily identify what on the line has changed.

Upvotes: 72

Amin
Amin

Reputation: 241

When you are using "git diff" and it's showing several pages(you see ":" at the end of the page)in this case you can type "-S" and press enter.(S should be capital). it will toggle fold long lines.

Upvotes: 5

infoclogged
infoclogged

Reputation: 3997

Noone pointed out this till now. Its quite simple to remember and no extra configuration needs to be done in the git config

git diff --color | less -R

Upvotes: 6

Thomson Comer
Thomson Comer

Reputation: 3919

Eight years later I find a superior answer, from https://superuser.com/questions/777617/line-wrapping-less-in-os-x-specifically-for-use-with-git-diff:

git config core.pager `fold -w 80 | less`

Now you pipe the git diff through fold, first, then to less: wrapped, less page-height is correct, keep syntax highlighting.

Upvotes: 5

user5870226
user5870226

Reputation: 11

list the current/default config:

  $ git config --global core.pager  
    less -FXRS -x2

then update and leave out the -S like:

  $ git config --global core.pager 'less -FXR -x2'

the -S: Causes lines longer than the screen width to be chopped rather than folded.

Upvotes: 1

Zombo
Zombo

Reputation: 1

Since Git 1.5.3 (Sep 2007)

a --no-pager option has been available.

git --no-pager diff

How do I prevent git diff from using a pager?

Example

Starting with v2.1, wrap is the default

Git v2.1 Release Notes

Upvotes: 12

SpoonMeiser
SpoonMeiser

Reputation: 20397

The display of the output of git diff is handled by whatever pager you are using.

Commonly, under Linux, less would be used.

You can tell git to use a different pager by setting the GIT_PAGER environment variable. If you don't mind about paging (for example, your terminal allows you to scroll back) you might try explicitly setting GIT_PAGER to empty to stop it using a pager. Under Linux:

$ GIT_PAGER='' git diff

Without a pager, the lines will wrap.

If your terminal doesn't support coloured output, you can also turn this off using either the --no-color argument, or putting an entry in the color section of your git config file.

$ GIT_PAGER='' git diff --no-color

Upvotes: 131

Peter Boughton
Peter Boughton

Reputation: 112150

Not a perfect solution, but gitk and git-gui can both show this information, and have scrollbars.

Upvotes: 3

AnonTidbits
AnonTidbits

Reputation: 39

You could simply pipe the output of git diff to more:

git diff | more

Upvotes: 3

someone45
someone45

Reputation: 2429

Or if you use less as default pager just type -S while viewing the diff to reenable wrapping in less.

Upvotes: 242

Daniel Montezano
Daniel Montezano

Reputation: 309

To use less as the pager and make line wrapping permanent you can simply enable the fold-long-lines option:

git config --global core.pager 'less -+S'

This way you do not have to type it while using less.

Cheers

Upvotes: 30

John Lemberger
John Lemberger

Reputation: 2699

Mac OSX: None of the other answers except someone45's '-S' while less is running worked for me. It took the following to make word-wrap persistent:

git config --global core.pager 'less -+$LESS -FRX'

Upvotes: 19

Shoan
Shoan

Reputation: 4078

You can also use git config to setup pager to wrap.

$ git config core.pager 'less -r' 

Sets the pager setting for the current project.

$ git config --global core.pager 'less -r' 

Sets the pager globally for all projects

Upvotes: 122

singingfish
singingfish

Reputation: 3167

Just googled up this one. GIT_PAGER='less -r' works for me

Upvotes: 19

webmat
webmat

Reputation: 60556

When in trouble, I often resort to DiffMerge. Excellent diff tool that has in-line diff highlighting. Also, in the latest versions they added a mode to have an horizontal mode.

I haven't been able to configure git to use it, though. So I do have to muck around to get both versions of the file first.

Upvotes: -1

Related Questions