Do not believe a thing because you read it in a book! Do not believe a thing because another has said it so! Find out the truth for yourself.
Bill Vaughan, according to the Internet
Don't believe all I say, RTFM.
Move your HEAD with Git
revert, checkout, reset
git revert
git revert
- Cancels a commit by creating an opposite commit
- Useful to "remove" commits already publicly published
- Cancel live breaking merge
git revert
Format: git revert <git-object>
example: git revert 123abc
git revert
Revert merges
git revert
- Special cases, merges have multiple parents
- Which part of the merge to revert
- In previous example: myBranch1, myBranch2 or both can be reverted
- -m # option specify the parent to revert
Revert merges
git checkout
git checkout
- Different behaviour depending on arguments
- git object and path can be provided or just git object
git checkout [gitObject] path
- Change state of given file
git checkout [gitObject] path
- Does NOT change HEAD
- If no object given, discards any unstaged changes
- If an object is given, changes the file to match the object. Stages the diff between the object and HEAD
git checkout gitObject
- Change the position of HEAD and the state of the working tree
- Links HEAD to targeted object
- If object is NOT a branch, HEAD is detached
- Used to switch between versions of the code
- Does NOT change the state of branches
"cd" for git
git checkout gitObject
git checkout gitObject
git reset
git reset
- Different behaviour depending on arguments
- git object and path can be provided or just git object
git reset [gitObject] path
- Set the staged state of given file at the state of the given object
- Sets the modified state of the file to keep the file unchanged
- Corollary: If no object is provided (HEAD used by default), the command unstages the file
git reset gitObject
- Moves HEAD to the provided object
- If HEAD was on a branch, moves the branch tip as well
- makes the commits from the branch's old position potentially unaccessible (unless using reflog, that is)
- Useful to "get rid of" the n last commits of a branch
git reset gitObject
git reset gitObject
git reset gitObject
git reset gitObject
What about changes in between?
- git reset --soft : keep difference staged
- git reset --mixed : keep differences in working tree (default)
- git reset --hard : discard differences
Conclusion
Know what you want to do to know what to do
Conclusion
If you want to:
- Cancel a published commit
git revert gitObject
Conclusion
If you want to:
- Go somewhere in your commit history
- Go to a specific branch
git checkout gitObject
Conclusion
If you want to:
- Create a new branch and switch on it
git branch theBranch
git checkout theBranch
or
git checkout -b theBranch
Conclusion
If you want to:
- remove local modifications in a file
- change a file to a desired point in the history
git checkout [gitObject] path
Conclusion
If you want to:
- move the tip of a branch to somewhere else (eg remove the last commits or take the remote version of a branch)
git reset --hard newPosition
Conclusion
If you want to:
- lose all local changes (staged or not)
- cancel an ongoing merge
git reset --hard
Conclusion
If you want to:
- unstage your changes
git reset
Move your HEAD with Git: Revert, Checkout, Reset
By Ghislain Rodrigues
Move your HEAD with Git: Revert, Checkout, Reset
Explanation of those three commands and when to use which
- 821