An open API service indexing awesome lists of open source software.

https://github.com/xandkar/git-cheat-sheet

How to do nonobvious (to me) stuff with git
https://github.com/xandkar/git-cheat-sheet

Last synced: 6 months ago
JSON representation

How to do nonobvious (to me) stuff with git

Awesome Lists containing this project

README

          

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
```sh
$ git clone old new
$ cd new
$ git clean -dfx
$ git gc --aggressive --prune=now
$ git remote rm origin
$ git filter-branch \
--prune-empty \
--index-filter '
git ls-tree -r --name-only HEAD \
| grep -v file_i_want_to_keep_1 \
| grep -v file_i_want_to_keep_.. \
| grep -v file_i_want_to_keep_n \
| xargs git rm --cached -r --ignore-unmatch
' \
HEAD
$ git gc --aggressive --prune=now
```

##### 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 \
| xargs git rm --cached -r --ignore-unmatch
' \
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
```