---
# System prepended metadata

title: "How to Git \U0001F500"
tags: [yotta, git]

---

# How to Git 🔀

###### tags: `yotta` `git`

[TOC]

## Best Practices

- Be confident about what you commit: never commit something that just doesn't compile/run
- Use process-oriented tools like Github, Gitlab
- Have clear general guidelines/rules that you apply consistenly, whether with yourself or within a team

As much as possible:
- Sync regularly with the master branch
- Don't create too complex branching structures


## Create a Project
```bash
mkdir ~/code/new_project
cd ~/code/new_project
git init

git add README.md
git add .gitignore

git branch -M main

# sync with a remote repo
git remote add origin "https://github.com/.../myrepo.git"

git push -u origin main
```

### Branching
Create a new branch
```bash
git checkout -b new_branch
```

going back to the master
```bash
git checkout master
```

### Merging
While in a branch, see what are the differences with another branch
```bash
git diff otherbranch
```
Merge
```bash
# typically while in master
git merge other_branch
```

Rebase
```bash
git rebase new_branch

# cancel
git rebase --abort
```

### Remove / Modify a commit
```bash
# reset to a specific head from the commit id
git reset HEAD HEAD_ID

# or, to just restore the previous commit as the current
git reset --hard HEAD~1

# modify a commit
git commit --amend
```

## Remote

### Setup
```bash
# setup remote
git remote add origin <repo_url>
 
# change the url
git remote set-url origin <new_repo_url>
```

### Push
```bash
# current branch sync status 
git status

# add file/directory to what is commited (staging)
git add .

# to unstage something
git reset HEAD file.py

# commit
git commit -m "message on this commit"
git push
```

### Pull
```bash
# inside local directory
git pull 
```




## Get a project
```bash
git clone "https://github.com/.../somerepo.git"
```

## Info
```bash
# see past commits
git log
git reflog

# add tags
git tag -n 'v0.0.1'
git push <repo> <tag>

# see cached files
git ls-files

# see remote address
git remote -v

# current branch sync status 
git status
```

