X-Git-Url: https://git.xandkar.net/?p=git-cheat-sheet.git;a=blobdiff_plain;f=README.md;h=61f2b7a6c5953c4d383f0584fb2cd4999dd0b02a;hp=2e13e3d3d795359f3c1521f4766af6b8c20af894;hb=HEAD;hpb=3fd4f97336fb90332b450544ccb8249c029e26ca diff --git a/README.md b/README.md index 2e13e3d..86f8e41 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,35 @@ git-cheat-sheet How to do stuff with git +Staging a subset of changes in a file +------------------------------------- + + git add -p + + y - stage this hunk + n - do not stage this hunk + q - quit; do not stage this hunk or any of the remaining ones + a - stage this hunk and all later hunks in the file + d - do not stage this hunk or any of the later hunks in the file + g - select a hunk to go to + / - search for a hunk matching the given regex + j - leave this hunk undecided, see next undecided hunk + J - leave this hunk undecided, see next hunk + k - leave this hunk undecided, see previous undecided hunk + K - leave this hunk undecided, see previous hunk + s - split the current hunk into smaller hunks + e - manually edit the current hunk + ? - print help + +https://git-scm.com/docs/git-add#Documentation/git-add.txt-patch + Splitting a repo ---------------- -### Remove history of all but select files in cloned repo +##### Remove history of all but select files in cloned repo ```sh -$ cp -Rp old new +$ git clone old new $ cd new $ git clean -dfx $ git gc --aggressive --prune=now @@ -27,13 +49,14 @@ $ git filter-branch \ $ git gc --aggressive --prune=now ``` -### Remove history of previously-removed (not in current tree) files +##### Remove history of previously-removed (not in current tree) files ```sh $ git log --pretty=format: --name-status \ | awk '$0 != "" {print $2}' \ | sort -u > /tmp/tree.old $ git ls-tree -r --name-only HEAD > /tmp/tree.new $ git filter-branch \ + --force \ --prune-empty \ --index-filter ' grep -Fvxf /tmp/tree.new /tmp/tree.old \ @@ -41,3 +64,66 @@ $ git filter-branch \ ' \ HEAD ``` + + +Inserting a new root commit +--------------------------- +```sh +git checkout --orphan $TEMP_BRANCH +git rm -rf * +git commit --allow-empty -m $INIT_COMMIT_MSG +git rebase --onto $TEMP_BRANCH --root $MAIN_BRANCH +git branch -d $TEMP_BRANCH +``` + + +Deleting all tags, locally and remotely +--------------------------------------- +```sh +for tag in `git tag`; +do + git tag -d $tag + git push $REMOTE_NAME :refs/tags/$tag +done +``` + + +Get an older version of a file +------------------------------ + +```sh +git cat-file -p $COMMIT_DIGEST:$FILE_PATH +``` + + +Splitting a commit +------------------ + +From [docs](https://git-scm.com/docs/git-rebase#_splitting_commits): + +- Start an interactive rebase with `git rebase -i ^`, where `` + is the commit you want to split. +- Mark the commit you want to split with the action "edit". +- When it comes to editing that commit, execute `git reset HEAD^`. The effect + is that the HEAD is rewound by one, and the index follows suit. However, the + working tree stays the same. +- Now add the changes to the index that you want to have in the first commit + (`git add`) +- Commit the now-current index with whatever commit message is appropriate now. +- Repeat the last two steps until your working tree is clean. +- Continue the rebase with `git rebase --continue`. + + +Merge 2 repos +------------- + +```sh +$ ls -1 +repo_A +repo_B +$ cd repo_B +$ git remote add repo_A ../repo_A +$ git fetch repo_A --tags +$ git merge --allow-unrelated-histories repo_A/$BRANCH +$ git remote remove repo_A +```