docs:git:creating_and_applying_patch_files

If you are not the maintainer for a project, but still want to contribute, you can clone the repo and modify files. You might fix a bug or add a feature. Then you can email a “patch” file containing your changes to the actual maintainer of the project. You might try to work on a specific bug or feature ticket.

Make sure your working copy is at the point you want as your final state. Create a new branch if this point is somewhere behind where your current HEAD is. Then create a patch file with the following, where “master” can be any branch name or sha-1 hash as a starting point.

git format-patch master --stdout > your-patch-file.diff

Make sure you are on a clean working copy, then apply the patch to the working copy (no commits are added, only working copy files are updated):

git apply their-patch-file.diff

Now you can review the changes as necessary.

Note that the above method is a git patch file, suitable for using git am. This is not the same as a standard patch file created with diff. Git patch files contain author's, commit messages and metadata, etc…

This will add consecutive commits to your current branch, including the commit messages. At the end of the patch, your working copy should be clean with a history of all applied commits. First create a new branch:

git checkout -b new-branch-name

Then apply the patch:

git am < their-patch-file.diff

Note that the above method is a git patch file, suitable for using git am. This is not the same as a standard patch file created with diff. Git patch files contain author's, commit messages and metadata, etc…

  • ::!:: this will change your SHA-1's, so don't do it if you care about those who track your project
  • create a patch file for the entire project
    git format-patch --root --stdout > allcommits.patch
  • create a new project folder, and copy the patch file into it
    mkdir newproject
    cd newproject
    cp ../oldproject/allcommits.patch .
  • edit the allcommits.patch file as necessary (change dates, commit messages, author, etc…)
    • to help with figuring out the correct date string used in patch files, you can use the unix date command to convert (you can add the time with similar parameters, but it is easy enough to type it by hand):
      date -v2m -v4d -v2008y +"%a, %d %b %Y %H:%M:%S %z"
  • apply all patches
    git am < allcommits.patch
  • also consider if filter-branch is a better alternative for your situation
  • docs/git/creating_and_applying_patch_files.txt
  • Last modified: 2014/09/29 17:09
  • by billh