How to do git tricks

From openwfm
Revision as of 23:32, 29 February 2020 by Jmandel (talk | contribs) (→‎Filter)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Find last commit where line existed

git blame --reverse START

Comparing files


git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt

How to link to such comparison view on github?

Compare and copy files from other branches

Include branches from an unrelated repository

git remote add rep2-git url_to_unrelated_repository
git fetch rep2-git
git checkout remotes/rep2-git/branch2
git checkout -b rep2/branch2
git push -u origin rep2/branch2:rep2/branch2

The resulting repository has another unrelated history. There is no need for the two repositories to have a common initial commit or anything. The commit hashes are preserved. You can even git cherry-pick commit from the other repostory and git will often do a pretty good job finding files to apply the commits to, even if the files have somewhat different names and are in somewhat different locations in the two file trees.

Using git cherry pick

Across unrelated histories

After importing branches from another unrelated repository as an unrelated history, git cherry pick can apply a commit from the unrelated history, but sometimes git cherry-pick will work across files having different paths and sometimes it just creates copies on new paths, which is not helpful. Not sure why. The same cherry-pick on different computers can do different things on the same repository and same commits for some reason.

Review changes before commit

Be sure to do

git diff HEAD


git diff <your base>

for multiple commits piled on top of <your base> to review what changes are being made and to minimize them. git diff seems to produce misleading results.

Undesirable changes from commits

One more reason why it is important to review changes before commit and edit as needed, not just resolve the conflict.

Using patch files

Instead of cherry-pick

  • Generate and use patch
git log -p -1 <sha1> | git apply --3way -

But this seems to make much the same changes and can pull more changes too. The --3way flag will mark conflicts, without --3way aplying the patch just failed for me.

  • Create a patch file
git log -p -1 <sha1-of-your-commit> > patch.file

edit it manually as desired and then apply the patch:

it apply --3way patch.file

To modify only one file

  1. Create a patch file for that individual file:
git show [commit hash] -- path/to/old/file > patchfile
  1. Manually edit the newly created patchfile and replace all occurrences of the old path with the new path.
  2. Apply the patch via
git apply --3way patchfile

Merging unrelated histories


Filter subdirectory

mkdir wrf-fire-filtered
cd wrf-fire-filtered
git clone --bare github:/openwfm/wrf-fire.git .git
git config --bool core.bare false
git reset --hard
git filter-branch --subdirectory-filter wrfv2_fire --prune-empty --tag-name-filter cat -- --all
git remote add filtered
git push filtered --mirror


See also