---
# System prepended metadata

title: Git Notes

---

# Git Notes
[TOC]

## Configure

```
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
```

## Typical worklfow

Starting on master, get changes from origin using `git pull <repository> <branch>`

```
git pull origin master
```

Create working branch

```
git checkout -b feature-branch
```
When ready to commit changes add files to commit  `git add file/path` then ` git commit`, make sure to add a meaningful commit message.


Push your changes to the repositry with `git push`
```
git push --set-upstream origin feature-branch
```

Log in to ado/github and navigate to repository you pushed changes to.  You should be prompted to open a pullrequest.  Once opened keep an eye on CI failures, fix it as needed.

### Merge Conflicts
If there are merge conflicts between your branch and master branch, rebase your branch on master, see [rebase-my-branch-with-master](https://hackmd.io/n1bgqM-gSK-annVrmDw_Pg#rebase-my-branch-with-master).

## Cherry pick changes from another local repo
Answer from https://stackoverflow.com/questions/5120038/is-it-possible-to-cherry-pick-a-commit-from-another-git-repository

```
git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k
```
for example, pull changes from hawkowl/ARO-Installer/ to openshift/ARO-Installer

```
git --git-dir=/home/tschneid/go/src/github.com/hawkowl/ARO-Installer/.git \
format-patch -k -1 --stdout 8bf92fbea179ebca5b3697f7ecbd3c96d9f94175 | \
git am -3 -k

git --git-dir=/home/tschneid/go/src/github.com/hawkowl/ARO-Installer/.git \
format-patch -k -1 --stdout 7fcd385070f5370240cb76151a2cd32f2e07aa3f | \
git am -3 -k


git --git-dir=/home/tschneid/go/src/github.com/hawkowl/ARO-Installer/.git \
format-patch -k -1 --stdout 70a2ef97e6bc9772701ca80e541b50b394c72b29 | \
git am -3 -k


```
## Tags
### Create/push a tag
```
git tag -a v20220729.01 -m 'Release v20220729 build 01'
git push upstream v20220729.01
```
### Checkout repo at tag
```
# fetch all tags
git fetch --all --tags

# checkout tag
git checkout tags/<tag> 
```
## Git workflow

### Show remotes
```
$ git remote -v
origin  https://github.com/tony-schndr/ARO-RP.git (fetch)
origin  https://github.com/tony-schndr/ARO-RP.git (push)
upstream        https://github.com/Azure/ARO-RP.git (fetch)
upstream        https://github.com/Azure/ARO-RP.git (push)
```
### create new branch
```
git checkout -b my-branch 
git commit -m "Test commit"
git push -u origin my-branch
```
### update origin with upstream (GitHub/Fork workflow)
```
git checkout <main/master>
git pull upstream master
git push origin master
```
```
git checkout master
git pull upstream master
git push origin master
```
### rebase my-branch with master
```
git checkout my-branch
git rebase master
git push --force-with-lease
```
### Squash
```
git rebase -i <after this commit>
git rebase -i HEAD~5
```

### Stash
```
git stash save "good description here"
```
```
git stash pop
```

### Fetch a pull request
Add to .bashrc 
```
function gitpr() {
	if [ -z "${1}" ]; then
		echo "PR is not valid"
	else 
		git fetch upstream pull/${1}/head:pr${1}
		git checkout pr${1}
	fi
}
```
then run `gitpr <pr num>` in the bash shell
## Revert Commit

```
git revert 13c3290ffcde7ef05bc447286b8c8b6731ecbd18 6e1acd4f13446276a09bb5f74125350bc69d58a8 b2273bdc6a42e4733cd21dc2c73ecc789bb323d9 
```
## Branches

Create branch from main, carry changes to new branch
```
git checkout $branch_name
```

To rename the current branch:

```
git branch -m <newname>
```

To rename a branch while pointed to any branch:

```
git branch -m <oldname> <newname>
```
-m is short for --move.

To push the local branch and reset the upstream branch:

```
git push origin -u <newname>
```
To delete the remote branch:

```
git push origin --delete <oldname>
```
To create a git rename alias:
```
git config --global alias.rename 'branch -m'
```
On Windows or another case-insensitive filesystem, use -M if there are only capitalization changes in the name. Otherwise, Git will throw a "branch already exists" error.

```
git branch -M <newname>
```

### Clone

Clone contents of repo to a directory
```
git clone https://github.com/Br35Ba56/ansible-datapower.git ansible_collections/community/datapower
```

---

## Working with Remotes
### Show remotes
```bash=
git remote -v
```

### refresh non-main branch from remote main
```bash=
git merge origin/master`
```

### Point an exsiting repo to a new one.
```bash=
git remote rename origin old-origin
git remote add origin https://<new repo>
```

### Remove a remote by name
```bash=
git remote remove <old-origin>
```
### Change the remote origin url
```bash=
git remote set-url origin <repo url>
```

### Setup a local branch to track a remote branch, this will point local "master" branch to the remote named "origin" "master" branch
```bash=
git branch --set-upstream-to=origin/master master
```
