Show diff between commits

GitGit Diff

Git Problem Overview


I am using Git on Ubuntu 10.04 (Lucid Lynx).

I have made some commits to my master.

However, I want to get the difference between these commits. All of them are on my master branch.

For example:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

I want to get the difference between k73ud and dj374. However, when I did the following I couldn't see the changes I made in k73ud.

git diff k73ud..dj374 > master.patch

Git Solutions


Solution 1 - Git

Try

git diff k73ud^..dj374

to make sure to include all changes of k73ud in the resulting diff.

git diff compares two endpoints (instead of a commit range). Since the OP want to see the changes introduced by k73ud, he/she needs to difference between the first parent commit of k73ud: k73ud^ (or k73ud^1 or k73ud~).

That way, the diff results will include changes since k73ud parent (meaning including changes from k73ud itself), instead of changes introduced since k73ud (up to dj374).

Also you can try:

git diff oldCommit..newCommit
git diff k73ud..dj374 

and (1 space, not more):

git diff oldCommit newCommit
git diff k73ud dj374

And if you need to get only files names (e.g. to copy hotfix them manually):

git diff k73ud dj374 --name-only

And you can get changes applied to another branch:

git diff k73ud dj374 > my.patch
git apply my.patch

Solution 2 - Git

To see the difference between:

Your working copy and staging area:

% git diff

Staging area and the latest commit:

% git diff --staged

Your working copy and commit 4ac0a6733:

% git diff 4ac0a6733

Commit 4ac0a6733 and the latest commit:

% git diff 4ac0a6733 HEAD

Commit 4ac0a6733 and commit 826793951

% git diff 4ac0a6733 826793951

For more explanation see the official documentation.

Solution 3 - Git

If you want to see the changes introduced with each commit, try "git log -p"

Solution 4 - Git

  1. gitk --all
  2. Select the first commit
  3. Right click on the other, then diff selected → this

Solution 5 - Git

To see the difference between two different commits (let's call them a and b), use

git diff a..b
  • Note that the difference between a and b is opposite from b and a.

To see the difference between your last commit and not yet committed changes, use

git diff

If you want to be able to come back to the difference later, you can save it in a file.

git diff a..b > ../project.diff

Solution 6 - Git

I use gitk to see the difference:

gitk k73ud..dj374

It has a GUI mode so that reviewing is easier.

Solution 7 - Git

Simplest for checking the changes in the last 2 commits after pull:

git diff HEAD~2 

Solution 8 - Git

I wrote a script which displays diff between two commits, works well on Ubuntu.

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

#!/usr/bin/env python
import sys, subprocess, os

TOOLS = ['bcompare', 'meld']

def execute(command):
	return subprocess.check_output(command)

def getTool():
	for tool in TOOLS:
		try:
			out = execute(['which', tool]).strip()
			if tool in out:
				return tool
		except subprocess.CalledProcessError:
			pass
	return None

def printUsageAndExit():
	print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
	print 'Example: python bdiff.py <project> 0 1'
	print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
	print 'Example: python bdiff.py <project> 0 d78ewg9we'
	sys.exit(0)

def getCommitIds(name, first, second):
	commit1 = None
	commit2 = None
	try:
		first_index = int(first) - 1
		second_index = int(second) - 1
		if int(first) < 0 or int(second) < 0:
			print "Cannot handle negative values: "
			sys.exit(0)
		logs = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines()
		if first_index >= 0:
			commit1 = logs[first_index].split(' ')[0]
		if second_index >= 0:
			commit2 = logs[second_index].split(' ')[0]
	except ValueError:
		if first is not '0':
			commit1 = first
		if second is not '0':
			commit2 = second
	return commit1, commit2

def validateCommitIds(name, commit1, commit2):
	if not commit1 and not commit2:
		print "Nothing to do, exit!"
		return False
	try:
		if commit1:
			execute(['git', '-C', name, 'cat-file', '-t', commit1])
		if commit2:
			execute(['git', '-C', name, 'cat-file', '-t', commit2])
	except subprocess.CalledProcessError:
		return False
	return True

def cleanup(commit1, commit2):
		execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

def checkoutCommit(name, commit):
	if commit:
		execute(['git', 'clone', name, '/tmp/'+commit])
		execute(['git', '-C', '/tmp/'+commit, 'checkout', commit])
	else:
		execute(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
		execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

if __name__=='__main__':
	tool = getTool()
	if not tool:
		print "No GUI diff tools, install bcompare or meld"
		sys.exit(0)
	if len(sys.argv) is not 4:
		printUsageAndExit()

	name, first, second = None, 0, 0
	try:
		name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
	except IndexError:
		printUsageAndExit()

	commit1, commit2 = getCommitIds(name, first, second)

	if validateCommitIds(name, commit1, commit2) is False:
		sys.exit(0)

	cleanup(commit1, commit2)

	try:
		checkoutCommit(name, commit1)
		checkoutCommit(name, commit2)
		compare(tool, commit1, commit2)
	except KeyboardInterrupt:
		pass
	finally:
		cleanup(commit1, commit2)
	sys.exit(0)

Solution 9 - Git

Accepted answer is good.

Just putting it again here, so its easy to understand & try in future

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

I got the same diff for all the above commands.

Above helps in

  1. seeing difference of between commit c1 & another commit c2
  2. also making a patch file that shows diff and can be used to apply changes to another branch

If it not showing difference correctly
then c1 & c2 may be taken wrong
so adjust them to a before commit like c1 to c0, or to one after like c2 to c3

Use gitk to see the commits SHAs, 1st 8 characters are enough to use them as c0, c1, c2 or c3. You can also see the commits ids from Gitlab > Repository > Commits, etc.

Hope that helps.

Solution 10 - Git

I always love using the command line and have user friendly tools (with GUI) at my hand. Best of both worlds. Here is how I do it to compare two commits in Git.

You can show the diff between two commits like the following.

Edit your git config file in a TEXT EDITOR:

git config --global -e 

Set up a proper diff tool (user friendly) like Meld like this in Windows in the Git config file:

[difftool "meld"]
cmd = "C:/Program Files (x86)/Meld/Meld.exe" "LOCAL\" \"REMOTE" --label "DIFF (ORIGINAL MY)"
prompt = false
path = C:\Program Files (x86)\Meld\Meld.exe

Meld can be installed using Chocolatey like this from the COMMAND LINE:

choco install meld

Let's define a shell function to help us compare two sha-s (commits) under [alias] in the TEXT EDITOR:

[alias]
showchangesbetween = "!w() { git difftool \"$1\" \"$2\" --dir-diff --ignore-all-space; }; w"

To compare the commits with the help of Meld (or your other favorite diff tool, just type at the COMMAND LINE:

git showchangesbetween somesha123 somesha456

The commit sha-s are easily visible typing

 git log 

for example.

Solution 11 - Git

 1. git diff <commit-id> <commit-id>
 2. git diff HEAD^ HEAD     -(HEAD = current branch’s tip),( HEAD^ = version before the last commit)
 3. git diff HEAD^ HEAD — ./file     (comparison to specified file)
 4. git diff HEAD~5 HEAD           - (HEAD~5 refers to the last 5 commits.)

Solution 12 - Git

Command below perfectly works for me on Ubuntu 20.04 and git v2.25.1:

git diff <base-commit-id> <target-commit-id>

Solution 13 - Git

Let's say you have one more commit at the bottom (oldest), then this becomes pretty easy:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

Now, using below will easily server the purpose.

git diff k73ud oldestCommit

Solution 14 - Git

Use this command for the difference between commit and unstaged:

git difftool --dir-diff

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionant2009View Question on Stackoverflow
Solution 1 - GitVonCView Answer on Stackoverflow
Solution 2 - GitAlex YurshaView Answer on Stackoverflow
Solution 3 - GitcxregView Answer on Stackoverflow
Solution 4 - Gitgeekbytes0xffView Answer on Stackoverflow
Solution 5 - GitAldaronLauView Answer on Stackoverflow
Solution 6 - Gituser2647616View Answer on Stackoverflow
Solution 7 - GitFlowkapView Answer on Stackoverflow
Solution 8 - GitJacob AbrahamView Answer on Stackoverflow
Solution 9 - GitManohar Reddy PoreddyView Answer on Stackoverflow
Solution 10 - GitTore AurstadView Answer on Stackoverflow
Solution 11 - GitRitu GuptaView Answer on Stackoverflow
Solution 12 - GitMuhammed Bera KoçView Answer on Stackoverflow
Solution 13 - Gitbit_cracker007View Answer on Stackoverflow
Solution 14 - GitAnnaduraiView Answer on Stackoverflow