Как исправить фиксацию в неправильной ветке Git?



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

974   8  

8 ответов:

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

git reset --soft HEAD^

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

git checkout branch
git commit

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

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

для отката одного коммита (убедитесь, что вы отметили хэш коммита для следующего шага):

git reset --hard HEAD^

чтобы вытащить эту фиксацию в другую ветку:

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

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

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

git reset HEAD^
git checkout .

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 является локальным филиалом, а не удаленным.

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

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

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

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

git reset --hard HEAD^^^^

недавно я сделал то же самое, где я случайно совершил изменение в 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 Голова~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/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

Итак, если ваш сценарий заключается в том, что вы совершили 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/

если ветвь, к которой вы хотели применить изменения, уже существует (ветвь разработки, например), следуйте инструкциям, которые были предоставлены 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 Если вы хотели.

кроме того, если это применимо, задержите Stash pop (apply) до тех пор, пока вы не объединитесь в своей целевой ветви.

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

правой кнопкой мышки и выберите View History:

enter image description here

Правой Кнопкой Мыши на фиксации вы хотите вернуться. И вернуться или сбросить по мере необходимости.

enter image description here

Comments

    Ничего не найдено.