dotfiles/m/eg/.eg_custom/git.md
2022-08-24 04:07:33 -04:00

152 lines
3.3 KiB
Markdown

Git Cheat Sheet
===============
## Subtree Example
### Add sub-project as remote
```bash
git remote add -f RemoteName RemoteUrl
```
### Run `git subtree` command
```bash
git subtree add --prefix Path/To/Put/Code NameOfRemote master --squash
```
#### Pull subtree as needed
```bash
git fetch NameOfRemote master
git subtree pull --prefix Path/To/Put/Code NameOfRemote master --squash
```
### Reference
* http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree
## Create a branch without a parent
Very useful when you are updating a project that you are rewriting. For example,
say you are using semantic versioning and are wanting to start a new major
version.
```bash
git checkout --orphan BRANCH
```
## Delete All Branches that have been merged
Great for cleaning up local branches that aren't being used any more.
```bash
git checkout master
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
```
## Ignore changes to a file that is being tracked
### Ignore
```bash
git update-index --assume-unchanged [directory|file]
```
### Unignore
```bash
git update-index --no-assume-unchanged [directory|file]
```
## How to ignore dirty submodules
Edit your ``.git/config`` and add ``ignore = dirty``.
```text
[submodule "path/to/submodule"]
path = path/to/submodule
url = git://github.com/username/repo.git
ignore = dirty
```
## Clone a repo and give name other than origin
```bash
git clone -o upstream https://repo.git
```
## Ignore Files for Repository without using `.gitignore`
Add the file `.git/info/exclude` and fill it with the contents you want to ignore. This will ONLY apply to the
repository and will not be tracked by git.
## Squash Commits
```bash
git log
```
Count the number of commits that you have made, let's say the previous 5 are your commits.
```bash
git rebase -i HEAD~5
```
The first commit leave as `pick` the rest will need to be changed to `squash`. After that you will be able to
leave a new commit message or just leave as is to keep the commit messages from all previous commits.
## Search for a specific line of code/file in the history
```bash
git log -S[search term]
```
Example:
```bash
git log -SThatOneFile.php
```
## Copy file from one branch to current branch
Copy a file from `branch` and put into staging.
```bash
git checkout BRANCH path/to/file.ext
# Real Life Examples
git checkout origin/featureBranch web/js/random.js
# Pulls into your current branch web/js/random.js from
# origin/featureBranch
```
## Git Grepping for fun and profit!
```shell
# Basic grep (case sensitive)
$ git grep 'search term'
# Case Insensitive search
$ git grep -i 'search term'
# Search within a directory
$ git grep 'search term' src/
# Search only files with `php` extension
$ git grep 'search term' -- '*.php'
# Grep in the 'src/` directory, only yml files
$ git grep 'search term' -- 'src/**.yml'
```
## Push Branch to Remote Repository to a different branch name
```shell
git push origin localBranchName:remoteBranchName
```
Use Case: I will often use rebase, I will cut a branch off the branch I want to rebase and
do the rebase on the newly created branch. Once I am done, I will check the diff and see if
I screwed up. If it's all good, `git push -f` **NOTICE**: DO NOT `git push -f` unless you know
what you are doing.