To differ and to patch up
We all use some kind of source control to maintain the code. But we developers still use mail/IM to share some changes/snippets with each other. Where you usually send the changed file, original file to your friend. There could also be a case where you have read only access to source control. It usually happens when you are working FOSS project and you are supposed prove yourself before you get check in access.
Most of us have best in class GUI based products comparing and merging these files. I, like others, send both the files. I send the old file to make sure that my friend knows on which version I have worked on.
But when I know my friend works on Linux or CygWin, or at least uses GNU Utils. Then I go for diff and patch. The simplicity and usefulness of diff n patch beats any other tool.
Contents of org.txt : looks like somebody doesn't like me.
This is an important notice! It should therefore be located at the beginning of this document! Thejesh GN can't do anything and everything. He doesnt know. can't you do it?? This is third line from can you do it My end of file Bye
I had to update it. So here is new.txt
This is an important notice! It should therefore be located at the beginning of this document! Thejesh GN can do anything and everything. can you do it?? This is third line from can you do it My end of file Bye
So now I take a diff and send it to my manager to update the actual and check in. So at my shell I run
diff org.txt new.txt > diff.txt
--- org.txt 2009-07-31 21:44:46.233518700 +0530 +++ new.txt 2009-07-31 21:43:44.889768700 +0530 @@ -4,10 +4,10 @@ the beginning of this document! -Thejesh GN can't do anything -and everything. He doesnt know. +Thejesh GN can do anything +and everything. -can't you do it?? +can you do it?? This is third line from can you do it
Patch or diff file will have
- org file name preceded by "---"
- new file name preceded by "+++"
- change hunks (chunks of 3 lines per change. Unified diff) that contain the line differences
- chunk begins with range information
- line additions begine with +
- line deletions begin with -
- contextual lines begin with space
Now you can update the org.txt file just by using diff.txt. At your shell
$ patch < diff.txt
You patch knows what to do. All it needs is original file and diff file. It has all the details need to patch. Since the diff file has context lines surrounding the actual change. It doesn't need you to mention the version of old file (or send it to your friend). If it cant find the context it will fail. And hence if your friend has worked on the same lines before you sent a diff, the patch will fail. Otherwise it will update your org.txt.
Isn't that easy and elegant?