rebase --onto
может помочь здесь, особенно если у вас есть ряд обязательств по возврату.
Не забудьте указать git stash
, чтобы сохранить любые текущие незафиксированные изменения, имеющие отношение к «wrongBranch
» (тот, где обязательства были применены надлежащим образом), чтобы вывести их обратно в конце процесса.
В принципе, вы должны применить фиксацию или диапазон совершает to another branch (называемый здесь «rightBranch
»):
# Checkout the right branch where the commit should have been applied
git checkout rightBranch
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the rightBranch branch to the head of patchset which should have been on rightBranch
git branch -f rightBranch last_SHA-1_of_commits_for_rightBranch
# Rebase the patchset onto tmp, the old location of rightBranch
git rebase --onto tmp first_SHA-1_of_commits_for_rightBranch~1 rightBranch
(first_SHA-1_of_commits_for_rightBranch~1
является родительской фиксацией first_SHA-1_of_commits_for_rightBranch
, то есть фиксации на вершине которой все коммиты для rightBranch были неправильно применены)
rightBranch
будет снова в верхней части:
- все старые фиксаций правой ветви (указываемым
tmp
ветви)
- плюс все соответствующие коммиты в диапазоне от
wrongBranch
, которые только что были переигран на вершине tmp
(tmp
быть предыдущий rightBranch HEAD
).
Затем вы можете установить wrongBranch
в некоторые предыдущие коммиты.
git checkout wrongBranch
git reset --hard some_older_commit
# if needed, re-apply what you were working on vefore this all proccess
git stash pop
Оговорка:
- вишневого сбор или перебазироваться --onto имеют последствия (см this question)
- если
wrongBranch
уже опубликован (толкнул на публичное репо), что может быть неудобным для людей, которые тянут за это репо (чтобы переупаковать все свои изменения поверх этой «новой» ветки)
Если вы постоянно забыли, в какой ветке вы находитесь, и используете оболочку bash, возможно, проверьте это: http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt -with-git-info/ – whaley