Как отменить коммит и зафиксировать изменения в другой ветке в Git? - PullRequest
4 голосов
/ 20 января 2010

Обычная ошибка, которую я совершаю в git:

  1. не проверяю, на какой я ветке
  2. зафиксировать изменения в неправильной ветке (в ветке B, думая, что я на A, фиксирую изменение для функции A)

Как мне вернуться назад и зафиксировать изменения в соответствующей ветке?

Ответы [ 3 ]

4 голосов
/ 20 января 2010

rebase --onto может помочь здесь, особенно если у вас есть диапазон коммитов для возврата.

Не забудьте git stash, чтобы сохранить любые текущие незафиксированные изменения, которые имеют отношение к "wrongBranch" (то, где коммиты были применены соответствующим образом), чтобы вернуть их обратно в конце процесса.

По сути, вам нужно применить коммит или диапазон коммитов к другой ветке (называемой здесь "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

Оговорка:

  • Вишня или перебазирование - иметь последствия (см. этот вопрос )
  • , если wrongBranch уже опубликовано (перенесено в публичное репо), это может быть неудобно для людей, тянущих за это репо (вынуждены отменить все свои изменения поверх этой "новой" ветви)
0 голосов
/ 26 сентября 2011

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

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

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

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

0 голосов
/ 26 сентября 2011

Оформить неправильную ветку, где фиксация

git checkout wrong_branch

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

git reset --hard HEAD^

ПРИМЕЧАНИЕ: оператор ^, указывающий предыдущий коммит, для удаления нескольких коммитов используйте ~ N, где N - количество коммитов

Оформить заказ на ветку, где коммит должен быть

git checkout right_branch

Повторно применить коммит с помощью cherry-pick

git cherry-pick wrong_branch@{1}

ПРИМЕЧАНИЕ: error_branch @ {1} - это последний коммит неправильно_branch перед была выполнена команда git reset, например, HEAD @ {2} также может использоваться в этом случае

Для перемещения нескольких коммитов вы можете использовать несколько вызовов git cherry-pick или только одно выполнение git rebase:

git rebase --onto right_branch wrong_branch@{1}~N wrong_branch@{1}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...