2010-01-20 1 views
4

Распространенная ошибкой я делаю в мерзавце являетсяКак отменить фиксацию и зафиксировать изменения в другой ветке в Git?

  1. не проверить на какую ветку я
  2. фиксируют изменения в неверную ветвь (на ветвь В, думая, что я на А, совершали изменения для признака А)

Как мне вернуться и внести изменения в правильную ветку?

+5

Если вы постоянно забыли, в какой ветке вы находитесь, и используете оболочку bash, возможно, проверьте это: http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt -with-git-info/ – whaley

ответ

4

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 уже опубликован (толкнул на публичное репо), что может быть неудобным для людей, которые тянут за это репо (чтобы переупаковать все свои изменения поверх этой «новой» ветки)
+0

@VonC, +1 для четкого воспроизведения. В команде git rebase -onto ... вы имели в виду first_SHA-1-of-commits-for-rightBranch ~ 1? –

+0

@Wayne: doh! right, диапазон фиксации переигрывается для 'rebase -onto' begin * after * указанного commit. Еще одна ошибка «один за другим». – VonC

0

заказа неправильной ветвь, где фиксация будет

git checkout wrong_branch 

В неправильной ветви, сброс к предыдущей фиксации:

git reset --hard HEAD^ 

Примечания: оператор^указует на предыдущий коммит, чтобы удалить несколько фиксаций использовать ~ N, где N является число фиксаций

Checkout в отрасли, где фиксации должен быть

git checkout right_branch 

Re применить фиксацию с помощью вишневого выбрать

git cherry-pick [email protected]{1} 

Примечание: wrong_branch @ {1} является последней фиксации из wrong_branch перед тем мерзавец команда сброса была выполнена, например, HEAD @ {2 } может быть использован тоже в этом случае

для перемещения нескольких коммитов можно использовать несколько вызовов мерзавцу вишневого выбрать или только одно исполнение мерзавца перебазироваться:

git rebase --onto right_branch [email protected]{1}~N [email protected]{1} 

(и в этом случае соответствующий параметр для сброса будет HEAD ~ N)

0

Простой ответ?

git checkout branch_with_wrong_tip 
git reset HEAD~1 (or whatever number of commits you want to go back) 
git checkout correct_branch 
git commit ...etc 

Примечание важная часть, которая является мягкой перезагрузки (с сохранением изменений), в отличие от любого жесткого сброса, который может позволить вам потерять место изменения.

Это также превратит все те коммиты, которые вы перезагрузите, в изменения, которые вам пришлось бы повторять по отдельности или в группе. Например. если вы сбросите HEAD ~ 10, вам нужно будет совершить фиксацию ко всем файлам, которые были зафиксированы в 10 коммитах, или же перевести их в совершенно новую фиксацию. Это просто, если вы используете этот подход, конечно.

 Смежные вопросы

  • Нет связанных вопросов^_^