How to do it...

The diff utility reports the differences between two files.

  1. To demonstrate diff behavior, create the following files:

File 1: version1.txt

         this is the original text 
         line2 
         line3 
         line4 
         happy hacking ! 

File 2: version2.txt

       this is the original text  
       line2 
       line4 
       happy hacking !  
       GNU is not UNIX 
  1. Nonunified diff output (without the -u flag) is:
        $ diff version1.txt version2.txt 
        3d2
        <line3
        6c5
        > GNU is not UNIX
  1. The unified diff output is:
        $ diff -u version1.txt version2.txt
        --- version1.txt  2010-06-27 10:26:54.384884455 +0530 
        +++ version2.txt  2010-06-27 10:27:28.782140889 +0530 
        @@ -1,5 +1,5 @@ 
        this is the original text 
        line2
        -line3
        line4    
        happy hacking ! 
        -
        +GNU is not UNIX

 The -u option produces a unified output. Unified diff output is more readable and is easier to interpret.

In unified diff, the lines starting with + are the added lines and the lines starting with - are the removed lines.

  1. A patch file can be generated by redirecting the diff output to a file:
        $ diff -u version1.txt version2.txt > version.patch

The patch command can apply changes to either of the two files. When applied to version1.txt, we get the version2.txt file. When applied to version2.txt, we generate version1.txt.

  1. This command applies the patch:
        $ patch -p1 version1.txt < version.patch
        patching file version1.txt

We now have version1.txt with the same contents as version2.txt.

  1. To revert the changes, use the following command:
        $ patch -p1 version1.txt < version.patch 
        patching file version1.txt
        Reversed (or previously applied) patch detected!  Assume -R? [n] y
        #Changes are reverted.

As shown, patching an already patched file reverts the changes. To avoid prompting the user with y/n, we can use the -R option along with the patch command.