Difference between revisions of "How to do git tricks"
Line 39: | Line 39: | ||
===Undesirable changes from other commits=== | ===Undesirable changes from other commits=== | ||
− | Often git cherry pick will make more changes including those from other commits. Here is why: [https://stackoverflow.com/questions/7802252/why-cherry-pick-pick-change-more-than-one-commit Git goes back in the history until the cherry pick source matches the target and | + | Often git cherry pick will make more changes including those from other commits. Here is why: [https://stackoverflow.com/questions/7802252/why-cherry-pick-pick-change-more-than-one-commit Git goes back in the history until the cherry pick source matches the target and creates the patch based on this revision. That's why more changes might appear.] |
− | creates the patch based on this revision. That's why more changes might appear.] | ||
One more reason why it is important run <tt>git diff HEAD^</tt> and review carefully all changes to the files, not just the conflicts, and edit as needed. | One more reason why it is important run <tt>git diff HEAD^</tt> and review carefully all changes to the files, not just the conflicts, and edit as needed. |
Revision as of 16:59, 21 January 2019
Find last commit where line existed
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
https://stackoverflow.com/questions/2364147/how-to-get-just-one-file-from-another-branch
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
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.
- Be sure to do
git diff HEAD^
to review what changes are being made and to minimize them. git diff seems to produce misleading results.
Undesirable changes from other commits
Often git cherry pick will make more changes including those from other commits. Here is why: Git goes back in the history until the cherry pick source matches the target and creates the patch based on this revision. That's why more changes might appear.
One more reason why it is important run git diff HEAD^ and review carefully all changes to the files, not just the conflicts, and edit as needed.
Patch
Instead of cherry-pick
alternatively one can use patch
git log -p -1 <sha1-of-your-commit>
then
git log -p -1 <sha1> | git apply --3way -
But this can pull more changes too. And without --3way it fails.
To modify only one file
- Create a patch file for that individual file:
git show [commit hash] -- path/to/old/file > patchfile
- Manually edit the newly created patchfile and replace all occurrences of the old path with the new path.
- Apply the patch via
git apply --3way patchfile