Yubikey: Manual pair a PIV Yubikey with OSX

Every now and then things does not work as intended. For example: when putting a new Yubikey that has certificates, PIN and PUK installed into a slot on your Mac, a pairing dialog should appear. This does not always happen and in this case we need to do a “manual pairing”.
I will here explain how:

1. Insert the Yubikey into the Mac
2. Open a terminal
3. Run the sc_auth command below

sc_auth identities

This will output something like this:

SmartCard: com.apple.pivtoken:2B20E9654D142033695ADEC481CFD11EBA45EC00
Unpaired identities:
C28BE4EC86FAAC4B5EFE825947240B2CE03BA4F2       Certificate For PIV Authentication (<username>)

4. Now run the following comman to start the pairing process

sudo sc_auth pair -f -u<username> -hC28BE4EC86FAAC4B5EFE825947240B2CE03BA4F2

<username> – is the username of the identity that you want to pair with your Yubikey
“C28BE4EC86FAAC4B5EFE825947240B2CE03BA4F2” – is the Yubikey hash for the identity above (the CN of the authentication certificate)

The process will now begin with asking for the Yubikey PIN

5. If all goes well you should now see a message “Pairing Successful”

You are now ready to use your Yubikey on your Mac

Tested on OSX Catalina 10.15.4 and Yubikey firmware 4.4.5

Git: Remove a rebase that has not yet been pushed

Every now and then I find myself in a situation were I want to completly remove a rebase I just did. Maybe the application does not build anymore and I want another shoot at doing that rebase or squash

I’m here going to describe one way using git reflog and git reset

We start with the git reflog to find the place we want to return HEAD to.

git reflog

Below is an example of a reflog with a recent rebase (squash):

d21df0dd1 HEAD@{44}: rebase -i (squash): # Combination of 5 commits.
2b8f61237 HEAD@{45}: rebase -i (squash): # Combination of 4 commits.
049fdd05e HEAD@{46}: rebase -i (squash): # Combination of 3 commits.
a3c59ce01 HEAD@{47}: rebase -i (squash): # Combination of 2 commits.
1029f7e05 HEAD@{48}: rebase -i (start): checkout HEAD~19
5d870be58 (origin/MyBranch) HEAD@{49}: commit: Moved border to window
5d870be58 (origin/MyBranch) HEAD@{50}: commit: Added submit btn
5d870be58 (origin/MyBranch) HEAD@{51}: commit: Removed CSS class one
56f962c08 HEAD@{52}: commit (merge): Fixed conflicts with main branch

We are here looking for the entry just before the ‘rebase -i (start)‘, which in this case is HEAD{49} (HEAD{48} is the ‘rebase -i (start)’ entry)

After this all we need to do to return HEAD to that place is to run

git reset --hard HEAD{49}



Tested on Git v2.25.0 on a Windows 10

My Git cheat sheet


Init an empty Git repository or reinitialize an existing one

git init

Clone a repository

git clone https://mygitbucket.com/niklas/my_project.git

Pull in new changes from remote

git pull

Do a dry-run fetch to see what is comming

 git fetch --dry-run


Create a branch locally and checkout the branch

git checkout -b <name of branch>

Push the branch to remote

 git push origin <name of branch>

Delete local branch

git branch -d <name of branch>

Delete remote and local

git branch -D <name of branch>

Show all branches

 git branch -a

List all remotes

git remote -v

Rename a local branch that you have checked out

git branch -m <new name>

Rename a branch you have not checked out

git branch -m <old name> <new name>


Add a remote subtree to your project. ‘common’ is here the name of the subtree

git remote add common https://mygitbucket.com/niklas/my_project.git

Do a ‘common pull’ i.e. pull a remote branch into to subtree. ‘common’ is here the name of the subtree (and folder)

git subtree pull -P common common my-subtree-branch --squash


Pretty print log with oneline

git log --pretty=oneline

Check commits only in the current branch (descendent to master)

git log master..

Check commits only in the current branch (descendent to other branch)

git log master..<name of branch>


Create patch files for every commit in a interval of SHA’s

git format-patch <start SHA>..<stop SHA>

HEAD and other short codes work too
Create ONE patch file for all commits in the last 10 commits (from HEAD and back)

git format-patch -10 HEAD --stdout > my.patch

Apply a patch

git apply my.patch


Stash all uncommited modifications

git stash

Apply last saved stash to your current code

git stash apply

Apply last saved stash to your current code AND delete the stash

git stash pop

Manually delete the stash

git stash drop


List all tags

git tag

Create a “lightweight” tag

git tag <tag name> <SHA*>

* SHA is optional. Without it you will tag the place you are at
Create a “heavyweight” tag

git tag -a <tag name> -m <message> <SHA*>

* SHA is optional. Without it you will tag the place you are at
Remove a tag

git tag -d <tag name>


List all commits waiting to get pushed

git cherry -v