Я только что сделал отличную фиксацию не на той ветке. Как мне отменить последний коммит в моей основной ветке, а затем принять те же самые изменения и перенести их в мою ветку обновления?
Я только что сделал отличную фиксацию не на той ветке. Как мне отменить последний коммит в моей основной ветке, а затем принять те же самые изменения и перенести их в мою ветку обновления?
Ответы:
Если вы еще не отправили свои изменения, вы также можете выполнить программный сброс:
git reset --soft HEAD^
Это вернет фиксацию, но внесенные изменения вернутся в ваш индекс. Предполагая, что ветки относительно современны по отношению друг к другу, git позволит вам оформить заказ в другой ветке, после чего вы можете просто зафиксировать:
git checkout branch
git commit
Недостатком является то, что вам необходимо повторно ввести сообщение коммита.
git reset --soft HEAD\^
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
Теперь ваша ветка master равна origin/master
и все новые коммиты включены my_feature
. Обратите внимание, что my_feature
это локальная ветвь, а не удаленная.
master
, а затем сбрасывается master
в origin/master
.
origin/master
уже на коммите, который вы хотите сбросить! Кредит на кончике однако эту страницу: github.com/blog/...
Чтобы откатить один коммит (обязательно запишите хеш коммита для следующего шага):
git reset --hard HEAD^
Чтобы перетащить этот коммит в другую ветку:
git checkout other-branch
git cherry-pick COMMIT-HASH
Также обратите внимание, что git reset --hard
это убьет любые неотслеживаемые и измененные изменения, которые вы можете иметь, поэтому, если у вас есть такие, вы можете предпочесть:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
чтобы получить ша.
git reflog show <branch>
!
git stash
выполнить сброс до сброса и git stash pop
впоследствии использовать его для восстановления, поэтому не нужно бояться --hard
части
Если вы уже выдвинули свои изменения, вам нужно будет выполнить следующий толчок после сброса ГОЛОВКИ.
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
Предупреждение: полный сброс отменяет любые незафиксированные изменения в вашей рабочей копии, в то время как принудительное нажатие полностью перезаписывает состояние удаленной ветви на текущее состояние локальной ветви.
На всякий случай, в Windows (с использованием командной строки Windows, а не Bash) их на самом деле четыре ^^^^
вместо одного, поэтому
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
Я недавно сделал то же самое, где я случайно совершил смену мастера, когда я должен был совершить переход в другой филиал. Но я ничего не толкал.
Если вы только что перешли на неверную ветку и с тех пор ничего не изменили и не продвинулись в репо, вы можете сделать следующее:
// 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/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_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/
another-branch
уже существовал. В этом случае он просто обнажил коммиты, которые я сделал, чтобы освоить, и не надевал их another-branch
.
Чтобы уточнить этот ответ, в случае , если у вас есть несколько коммитов , чтобы перейти от, например , 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
Если для вас это всего лишь 1 коммит, то есть множество других более простых решений сброса. Для меня у меня было случайно сделано около 10 коммитов master
вместо, давайте назовем этоbranch_xyz
, и я не хотел терять историю коммитов.
То, что вы могли сделать, и что спасло меня, было использовать этот ответ в качестве ссылки, используя 4-х шаговый процесс, который -
master
branch_xyz
master
Вот вышеупомянутые шаги в деталях -
Создать новую ветку из master
(где я случайно совершил много изменений)
git checkout -b temp_branch_xyz
Примечание: -b
флаг используется для создания новой ветви.
Просто чтобы проверить, правильно ли мы это поняли, я бы сделал быстрое, git branch
чтобы убедиться, что мы находимся в temp_branch_xyz
ветви, и a, git log
чтобы проверить, правильно ли мы получили коммиты.
Объединить временную ветвь в филиал первоначально предназначался для фиксаций, то есть branch_xyz
.
Во-первых, переключитесь на исходную ветвь, т. Е. branch_xyz
(Вам может понадобиться, git fetch
если у вас нет)
git checkout branch_xyz
Примечание. Не используйте -b
флаг.
Теперь давайте объединим временную ветку с веткой, которую мы сейчас извлекаем.branch_xyz
git merge temp_branch_xyz
Возможно, вам придется позаботиться о некоторых конфликтах здесь, если они есть. Вы можете нажать (я бы) или перейти к следующим шагам, после успешного объединения.
Отмените случайные коммиты, master
используя этот ответ в качестве ссылки, сначала переключитесь наmaster
git checkout master
затем отмените его полностью, чтобы соответствовать удаленному (или конкретному коммиту, если хотите)
git reset --hard origin/master
Опять же, я бы сделал git log
до и после, чтобы убедиться, что предполагаемые изменения вступили в силу.
Стирание улик, то есть удаление временной ветки. Для этого сначала вам нужно проверить ветку, в которую был добавлен темп, т.е. branch_xyz
(если вы останетесь master
и выполните команду ниже, вы можете получить error: The branch 'temp_branch_xyz' is not fully merged
), так что давайте
git checkout branch_xyz
а затем удалите доказательство этой неудачи
git branch -d temp_branch_xyz
Вот и ты.
Если ветвь, к которой вы хотели применить ваши изменения, уже существует (например, ветвь разработки ), следуйте инструкциям, предоставленным 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 если хотите.
Также, если применимо, откладывайте всплывающее окно (применять) до тех пор, пока вы не объединитесь с целевой веткой.
Для меня это было решено путем возврата коммита, который я нажал, затем выбора вишни для коммита в другой ветке.
git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH
Вы можете использовать, git log
чтобы найти правильный хеш, и вы можете отправить эти изменения, когда захотите!