Сравнение бит настолько просто, что это почти непонятно;) Проверьте это «nybble»
8 4 2 1
-------
0 1 1 0 = 6 (4 + 2)
1 0 1 0 = 10 (8 + 2)
=======
1 1 1 0 = 14 (8 + 4 + 2)
Побитовое ORing 6 и 10 даст вам 14:
alert(6 | 10); // should show 14
Ужасно сбивает с толку!
If you want to move your commits to an existing branch, it will look like this:
git checkout existingbranch
git merge master # Bring the commits here
git checkout master
git reset --keep HEAD~3 # Move master back by 3 commits.
git checkout existingbranch
The --keep
option preserves any uncommitted changes that you might have in unrelated files, or aborts if those changes would have to be overwritten -- similarly to what git checkout
does. If it aborts, git stash
your changes and retry, or use --hard
to lose the changes (even from files that didn't change between the commits!)
This method works by creating a new branch with the first command (git branch newbranch
) but not switching to it. Then we roll back the current branch (master) and switch to the new branch to continue working.
git branch newbranch # Create a new branch, containing all current commits
git reset --keep HEAD~3 # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch # Go to the new branch that still has the desired commits
# Warning: after this it's not safe to do a rebase in newbranch without extra care.
But do make sure how many commits to go back. Alternatively, instead of HEAD~3
, you can simply provide the hash of the commit (or the reference like origin/master
) you want to revert back to, e.g:
git reset --keep a1b2c3d4
WARNING: With Git version 2.0 and later, if you later git rebase
the new branch upon the original (master
) branch, you may need an explicit --no-fork-point
option during the rebase to avoid losing the commits you moved from the master branch. Having branch.autosetuprebase always
set makes this more likely. See John Mellor's answer for details.