Use a git patch file
How to apply a git patch file.
Good resource here: https://www.devroom.io/2009/10/26/how-to-create-and-apply-a-patch-with-git/
# see the changes in the patch file
git apply --stat the-patch-file.patch
# test if ther's going to be issues
git apply --check the-patch-file.patch
# no issues, cool
git apply the-patch-file.patch
Change the git init default branch name
Don’t want to have the default branch called master?
Loading...
mkdir -p ~/.config/git/template
echo 'ref: refs/heads/main' > ~/.config/git/template/HEAD
git config --global init.templateDir ~/.config/git/template/
Since version 2.28
of Git
this can be done using this command:
git config --global init.defaultBranch main
For more info: Highlights from Git 2.28
Add a repo from your machine to GitHub
Create a new repo and push it to GitHub.
echo "# name-of-your-awesome-repo" >> README.md # add repo name to README.md
git init # init the repository
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/your-username/name-of-your-awesome-repo.git
git push -u origin master
The first four commands can be ignored if you have a repo you’re already working on (git)committing to.
Latest changes from repo to your machine
git pull
Add tracking information to your work
Assuming that you are working on the master branch then
git branch --set-upstream-to=origin/master
You can set it to whatever branch you want to track changes for
git branch --set-upstream-to=origin/<branch>
This will mean you can just do git pull
and the latest changes will
be pulled to your origin
What branch
git branch # shows what branch you're on
git branch -r # shows remote branches
git branch -a # shows all branches
Create a local branch and push it to GitHub
Want to make your feature branch and get it on GitHub?
Make your branch first then:
git push --set-upstream origin <branch-you-just-created>
Create a PR [Pull Request]
Fork other users repo in GitHub, then clone to your machine.
git clone https://github.com/your-username/awesome-awesome-repo
Add the remote repo:
git remote add upstream https://github.com/other-username/awesome-awesome-repo
Create your branch:
git branch your-awesome-branch
Check it out:
git checkout your-awesome-branch
If adding a folder use.
git add nameOfFolder/*
Make your commit and push to your new branch.
git add .
git commit -m 'initial commit'
git push origin your-awesome-branch
Manage the rest of the PR via GitHub
Check remotes
git remote -v
Sync a remote fork on your machine
First configure the local to point to the remote upstream
git remote -v
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
git remote -v
git fetch upstream
git checkout master
git merge upstream/master
You then use git merge
to update any branch on the upstream
repository:
git merge upstream/dev
Take a look at syncing a fork for more details.
Sync a remote fork on Github
- Open your fork on GitHub.
- Click on Pull Requests.
- Click on New Pull Request. By default, GitHub will compare the original with your fork, and there shouldn’t be anything to compare if you didn’t make any changes.
- Click on Try
switching the base
. Now GitHub will compare your fork with the original, and you should see all the latest changes. - Click on Click to create a pull request for this comparison and assign a predictable name to your pull request (e.g., Update from original).
- Click on Send pull request.
- Scroll down and click Merge pull request and finally Confirm merge. If your fork didn’t have any changes, you will be able to merge it automatically.
2fa
Using two factor authentication? Then use the following so you’re not
adding in your auth token each time you want to push
your code.
git remote set-url origin https://your-username:[email protected]/your-username/your-repo.git
Change origin
url
If you want to change the origin url you can use the set-url
command
git remote set-url origin https://github.com/username/new-repo-name
Add code on your machine to new repo
Via terminal navigate to your code folder.
git init
Add your files.
git add .
Adding a folder use the following syntax or it’ll get added as a BLOB.
git add nameOfFolder/*
Commit to local repo.
git commit -m 'some detailed message'
To add your files to the remote repo, first add your remote repo
git remote add origin [remote repository URL] # Sets the new remote
git remote -v # Verifies the new remote URL
git push origin master
For more info check out: adding an existing project to github using the command line
Delete branches
Delete local branch.
git branch -D branch-name
Remove local branches that are not on the remote
.
git remote prune origin --dry-run
# remove --dry-run if you're happy to delete
Remove local branches that were created from remote branches.
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
Merge master branch into feature branch
How to merge the master branch into the feature branch? This will come up often if you are working on a team with other devs and you want to update your feature branch to include the latest changes.
# checkout your feature branch
git checkout feature1
# merge master into it
git merge master
Merge two repos
If you want to merge project-a into project-b:
cd path/to/project-b
git remote add project-a path/to/project-a
git fetch project-a
git merge --allow-unrelated-histories project-a/master # or whichever branch you want to merge
git remote remove project-a
Stop tracking a file
If you have .env
files that are tracked by Git and want to ignore
them so your API keys don’t get added to GitHub use:
git update-index --assume-unchanged <file>
Stop tracking a previously tracked folder
First add the folder to your .gitignore
then remove the folder from
your local git tracking with:
git rm -r --cached <folder>
Start tracking a previously un-tracked file
git update-index --no-assume-unchanged <file>
Cloning a repo from someone else’s GitHub and pushing it to a repo on my GitHub
Loading...
So you make a clone of a repo that sin’t yours, make some changes then realise that you need to add it to your GitHub account to make a PR.
git remote -v
origin https://github.com/other-user/other-username/other-repo (fetch)
origin https://github.com/other-user/other-username/other-repo (push)
You just need to set the clone your working on as the downstream repo.
# add as downstream
git remote add downstream https://github.com/your-username/your-repo
# or as your username
git remote add your-username https://github.com/your-username/your-repo
Now it should look something like this:
git remote -v
origin https://github.com/other-username/other-repo (fetch)
origin https://github.com/other-username/other-repo (push)
downstream http://github.com/your-username/your-repo (fetch)
downstream http://github.com/your-username/your-repo (push)
You can then push your changes to the downstream repo and make a PR via GitHub.
Remove an upstream
repository
If you no longer need a reference to a forked repository then remove it with the following:
git remote rm upstream
Clone a repo and give it a different name
git clone https://github.com/your-username/repo-name new-repo-name
Using Husky?
If you are pushing right after a commit, you can use git push --no-verify
to avoid running all the tests again.
If you make a trivial change and want to commit git commit -m 'some detailed message' --no-verify
will skip your precommit
and prepush
scripts.
How to read last commit comment?
git show # is the fastest to type, but shows you the diff as well.
git log -1 # is fast and simple.
git log -1 --pretty=%B # if you need just the commit message and nothing else.
Remove commit from pull request
Read this for more detail on how to revert.
This was the simplest approach I found:
# Checkout the desired branch
git checkout <branch>
# Undo the desired commit
git revert <commit>
# Update the remote with the undo of the code
git push origin <branch>
Rather than use the last part I unstaged the changes in VSCode which I think did the same thing.
Show .gitconfig
details
There are three levels for Git config:
System level
# to view
git config --list --system
# to set
git config --system color.ui true
Global level
# to view
git config --list --global
# to set
git config --global user.name xyz
Repository level
# to view
git config --list --local
# to set
git config --local core.ignorecase true # (--local optional)
# to edit repository config file
git config --edit --local # (--local optional)
View All Settings
git config --list --show-origin
Conflicts between Windows Git and WSL Git?
If you are having issues with changes showing in Windows Git and not Windows Subsystem Linux Git (For a Windows WSL Dev set-up) then check the settings of each environment by using:
git config --list --show-origin
Remove any conflicting settings then try again.
If you want to rename a branch while pointed to any branch, do:
git branch -m <oldname> <newname>
If you want to rename the current branch, you can do:
git branch -m <newname>
A way to remember this, is -m
is for “move” (or mv
), which is how
you rename files.
Git ref log
Want to know what work you have done on a repo? Use git reflog
to
displpay all the commits.
# show all changes for the last 90 days
git reflog show -a
# show changes with a date
git reflog --date=iso
Use SSH in place of HTTPS
Get your SSH set up on your machine and add a key to GitHub, more on that here: https://egghead.io/lessons/javascript-how-to-authenticate-with-github-using-ssh
You will then need to pick your Clone with SSH option from the Clone or download section on your repo page.
Once you have taken the link from there you will need to set the repo remote to the SSH URL
git remote set-url origin [email protected]:username/repo-name-here.git
Where username is the username
of the repo owner and repo-name-here
is the name of that user’s repository.
How to authenticate with GitHub using SSH
Check that there are no rsa
files here before continuing, use (bash
or Git bash if you’re on Windows):
ls -al ~/.ssh
If there’s nothing there then generate a new keygen with:
ssh-keygen -t rsa -b 4096 -C [email protected] # add your email address 👍
If you decide to use a password for your SSH key see SSH Keys With Passwords
Now using ls -al ~/.ssh
will show our id_rsa.pub
file.
Add the SSH key to the SSH agent:
# for mac and Linux from bash, also from Windows Git Bash
eval "$(ssh-agent -s)"
# for Git Bash on Windows
eval `ssh-agent -s`
# fir Fish shell
eval (ssh-agent -c)
Add RSA key to SSH with:
ssh-add ~/.ssh/id_rsa
Copy your key to clipboard with one of the following:
clip < ~/.ssh/id_rsa.pub # Windows
cat ~/.ssh/id_rsa.pub # Linux
pbcopy < ~/.ssh/id_github.pub # Mac
Add a new SSH Key to your GitHub profile from the settings page by clicking the New SSH key button and paste in your key. Save it…
Then authenticate with:
ssh -T [email protected]
If you go back to the GitHub setting page and refresh the key icon should go from black to green. 🎉
SSH Keys With Passwords
If you add a password to your SSH key you will find yourself entering the password to authenticate on each [pull, push] operation. This can get tedious, especially if you have a long password in your keys.
Add the following line to your ~/.ssh/config/
file:
AddKeysToAgent yes
Open or create the ~/.ssh/config
file with:
nano ~/.ssh/config
The SSH agent will also need to be started on each terminal session
now to store the keys in, add the following to your ~/.bashrc
file:
[ -z "$SSH_AUTH_SOCK" ] && eval "$(ssh-agent -s)"
Open the ~/.bashrc
file with:
nano ~/.bashrc
Now the SSH agent will start on each terminal session and you will
only be prompted for the password on the first pull
, push
operation.
Use multiple SSH keys
If you have more than one GitHub account or if you have AWS code
commit account then you will need to set up a config
file, add your
SSH key the same as detailed in How to authenticate with GitHub using SSH and give the key a different name:
# ls ~/.ssh
~/.ssh/id_rsa_github_1
~/.ssh/id_rsa_github_2
~/.ssh/id_rsa_git_aws
You can delete all cached keys before, with:
ssh-add -D
You can check your saved keys, with:
ssh-add -l
Set up the SSH config file, check to see if you haven’t got a config
file already set up with:
ls -al ~/.ssh/
If you haven’t got a config
file there then:
cd ~/.ssh/
touch config
Use your text editor of choice, in this example we’ll use nano
:
nano config
Add your configuration:
AddKeysToAgent yes
# github_1 account
Host github.com-github_1
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_1
# github_2 account
Host github.com-github_2
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_2
# AWS code commit account
Host git-codecommit.*.amazonaws.com
User AWSUSERNAME
IdentityFile ~/.ssh/id_rsa_git_aws
Clone your repo and modify the config file of the repo as detailed here: Specify multiple users for myself in .gitconfig?
There’s a great Gist detailing this here for more detail if needed.
Re-use SSH keys, from one machine to another
If you want to avoid creating multiple SSH keys for different
environments and move your .ssh
folder from one machine to another
then you can do the following:
Copy your .ssh
and .gitconfig
files:
Copy from Linux to Windows
cp ~/.ssh/* /c/Users/Scott.Spence/.linuxFiles/.ssh/
cp ~/.gitconfig /c/Users/Scott.Spence/.linuxFiles/
Copy from Windows to Linux
cp /mnt/c/Users/Scott.Spence/.linuxFiles/.ssh/* ~/.ssh/
# Reset the permissions back to default:
sudo chmod 600 ~/.ssh/id_rsa
sudo chmod 600 ~/.ssh/id_rsa.pub
cp /mnt/c/Users/Scott.Spence/.linuxFiles/.* ~/
chmod 644 ~/.gitconfig
Start the SSH agent with:
eval "$(ssh-agent -s)" # for mac and Linux from bash, also from Windows Git Bash
Add your SSH key to the ssh-agent
with:
ssh-add ~/.ssh/id_rsa
Then authenticate with:
# GitHub
ssh -T [email protected]
# Bitbucket
ssh -T [email protected]
Using SSH over the HTTPS port
SSH can be tunnelled over HTTPS if the network you are on blocks the SSH port.
Test if SSH over HTTPS is possible with:
ssh -T -p 443 [email protected]
If you get a response then, edit your ~/.ssh/config
file and add
this section:
Host github.com
Hostname ssh.github.com
Port 443
Check that you have a key already added with:
ssh-add -l
If nothing is listed then add in your key with:
ssh-add ~/.ssh/id_rsa
Test that is has worked with:
ssh -T [email protected]
Change SSH key password
Tired of typing your SSH key password because you made it a 32 characters and can’t stand the monotony anymore?
Still want to have a SSH key password on your existing SSH key?
Use:
ssh-keygen -p -f ~/.ssh/id_rsa
Specify multiple users for myself in .gitconfig?
Want to have different git credentials for one specific repository?
You can configure an individual git repo to use a specific user/email address which overrides the global configuration.
To list out the config for the repo:
git config --list --local
From the root of the repo, run:
git config user.name 'Your Name'
git config user.email '[email protected]'
Whereas the default user / email is configured in your ~/.gitconfig
git config --global user.name 'Your Name'
git config --global user.email '[email protected]'
Cant remember what your last git commit said?
git show
Rebase changes
If you’re working on a team and there have been changes to the main branch you want to push your changes to, you can rebase before submitting a PR.
In this scenario we’re going to rebase our feature
branch off of the develop
branch
# switch from your feature to get latest develop changes
git checkout develop
git pull
# checkout the feature branch and rebase
git checkout feature
git rebase develop
Then use the prompts from there in conjunction with your text editor to add in the changes.
# add a change
git add
# continue the rebase
git rebase --continue
# have an unrelated change, nothing to correct
git rebase --skip
# oh DERP! Want to start over?
git rebase --abort
Rebase accept incoming in bulk
If you have a large file (like a package-lock.json
) that you want to
accept all the incoming changes from then.
Whilst you’re in rebase you’ll need to check out the file from your incoming branch then add it as the new file.
# checkout the file
git checkout temp-branch -- package-lock.json
# add the file whilst in rebase
git add package-lock.json
# continue with the things
git rebase --continue
See differences between two branches
If you want to see the difference between two branches then use the git built in diff tool.
git diff branch1..branch2
See differences between two files
If you want to see the difference between two file across different branches then use.
git diff branch1..branch2 package.json
Revert to a previous commit
Find the commit you want to revert to, then:
git reset hashOfCommit
Then reset to the branch on the origin:
# if I wanted to push back to the develop branch on GitHub say
git reset --soft origin/develop
Reference: https://stackoverflow.com/questions/11829911/push-changes-without-pull
Gitignore
You can automate the creation of your projects gitignore
file using
the gitignore API.
Setup the API:
git config --global alias.ignore '!gi() { curl -sL https://www.gitignore.io/api/$@ ;}; gi'
Add to your shell configuration:
Bash
echo "function gi() { curl -sL https://www.gitignore.io/api/$@ ;}" >> ~/.bashrc && source ~/.bashrc
checkout gi list
for the languages and editors supported. You can
issue the following command inside your project
gi linux,visualstudiocode,node >> ./.gitignore
If you find yourself using the same .gitignore
on your projects you
can create a global file (i.e. .gitignore_global
), and copy to your
new project.