Как исправить фиксацию в неправильной ветке Git? - PullRequest
551 голосов
/ 31 мая 2010

Я только что сделал отличную фиксацию на неправильной ветке. Как мне отменить последний коммит в моей основной ветке, а затем принять те же самые изменения и перенести их в мою ветку обновления?

Ответы [ 9 ]

849 голосов
/ 31 мая 2010

Если вы еще не отправили свои изменения, вы также можете выполнить программный сброс:

git reset --soft HEAD^

Это вернет фиксацию, но внесенные изменения вернутся в ваш индекс. Предполагая, что ветки относительно современны по отношению друг к другу, git позволит вам оформить заказ в другой ветви, после чего вы можете просто зафиксировать:

git checkout branch
git commit

Недостатком является то, что вам необходимо повторно ввести сообщение коммита.

109 голосов
/ 31 мая 2010

Если у вас есть чистая (неизмененная) рабочая копия

Чтобы откатить один коммит (обязательно запишите хеш коммита для следующего шага):

git reset --hard HEAD^

Чтобы вывести этот коммит в другую ветку:

git checkout other-branch
git cherry-pick COMMIT-HASH

Если вы изменили или не отслеживали изменения

Также обратите внимание, что git reset --hard будет уничтожать любые неотслеживаемые и измененные изменения , которые вы можете иметь, поэтому, если у вас есть те, которые вы предпочитаете:

git reset HEAD^
git checkout .
106 голосов
/ 06 февраля 2014

4 года опаздывают на эту тему, но это может кому-то пригодиться.

Если вы забыли создать новую ветку перед фиксацией и зафиксировали все на master, независимо от того, сколько коммитов вы сделали, следующий подход проще:

git stash                       # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop                   # skip if all changes were committed

Теперь у вас есть основная ветвь, равная origin/master, и все новые коммиты на my_feature. Обратите внимание, что my_feature является локальной, а не удаленной ветвью.

20 голосов
/ 31 мая 2010

Если вы уже выдвинули свои изменения, вам нужно будет выполнить следующий толчок после сброса ГОЛОВКИ.

git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force

Предупреждение: При аппаратном сбросе отменяются любые незафиксированные изменения в вашей рабочей копии, а принудительное нажатие полностью перезаписывает состояние удаленной ветви с текущим состоянием локальной ветви.

На всякий случай, в Windows (с использованием командной строки Windows, а не Bash) на самом деле четыре ^^^^ вместо одного, поэтому

git reset --hard HEAD^^^^
13 голосов
/ 31 мая 2017

Я недавно сделал то же самое, когда я случайно совершил изменение в master, когда я должен был совершить в другой ветке. Но я ничего не толкал.

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

// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes. 
git reset HEAD~1 

// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash

// create other-branch (if the other branch doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// take the temporary commit you created, and apply all of those changes to the new branch. 
//This also deletes the temporary commit from the stack of temp commits.
git stash pop

// add the changes you want with git add...

// re-commit your changes onto other-branch
git commit -m "some message..."

ПРИМЕЧАНИЕ: в приведенном выше примере я перематывал 1 коммит с git reset HEAD ~ 1. Но если вы хотите перемотать n коммитов, вы можете выполнить git reset HEAD ~ n.

Кроме того, если вы в конечном итоге зафиксировали неправильную ветвь, а также написали еще немного кода, прежде чем поняли, что зафиксировали неправильную ветку, вы можете использовать git stash для сохранения текущей работы:

// save the not-ready-to-commit work you're in the middle of
git stash 

// rewind n commits
git reset HEAD~n 

// stash the committed changes as a single temp commit onto the stack. 
git stash 

// create other-branch (if it doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// apply all the committed changes to the new branch
git stash pop

// add the changes you want with git add...

// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."

// pop the changes you were in the middle of and continue coding
git stash pop

ПРИМЕЧАНИЕ: я использовал этот сайт в качестве ссылки https://www.clearvision -cm.com / блог / что-к-делать-когда-вы фиксации-к-неправильности мерзавца-ветви /

7 голосов
/ 08 апреля 2016

Итак, если ваш сценарий заключается в том, что вы зафиксировали master, но намеревались зафиксировать another-branch (который может или не может уже существовать), но вы еще не нажали, это довольно легко исправить.

// if your branch doesn't exist, then add the -b argument 
git checkout -b another-branch
git branch --force master origin/master

Теперь все ваши коммиты на master будут на another-branch.

Источник любви: http://haacked.com/archive/2015/06/29/git-migrate/

4 голосов
/ 18 октября 2018

Чтобы уточнить этот ответ, если у вас есть несколько коммитов, например develop до new_branch:

git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
2 голосов
/ 05 апреля 2017

Если вы столкнулись с этой проблемой, и у вас есть Visual Studio, вы можете сделать следующее:

Щелкните правой кнопкой мыши свою ветку и выберите View History:

enter image description here

Щелкните правой кнопкой мыши на коммите, к которому вы хотите вернуться. И вернуть или сбросить при необходимости.

enter image description here

1 голос
/ 24 августа 2016

Если ветвь, к которой вы хотели применить свои изменения, уже существует (например, ветка development ), следуйте инструкциям, предоставленным fotanus ниже, затем:

git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature

И, очевидно, вы можете использовать tempbranch или любое другое имя ветви вместо my_feature , если хотите.

Кроме того, если это применимо, откладывайте всплывающее окно (применимо) до тех пор, пока вы не объединитесь с целевой веткой.

...