Git
развязывание
Поиск…
Отмена слияния
Отмена слияния еще не нажата на удаленный
Если вы еще не нажали свое слияние в удаленный репозиторий, вы можете выполнить ту же процедуру, что и в отмене фиксации, хотя есть некоторые тонкие отличия.
Сброс - это самый простой вариант, поскольку он отменяет как фиксацию слияния, так и любые фиксации, добавленные из ветки. Тем не менее, вам нужно будет знать, что SHA для возврата обратно, это может быть сложно, так как ваш git log
теперь будет показывать фиксации из обеих ветвей. Если вы переустановите неверную фиксацию (например, одну на другой ветке), она может уничтожить совершенную работу.
> git reset --hard <last commit from the branch you are on>
Или, предполагая, что слияние было вашим последним фиксатором.
> git reset HEAD~
Возврат более безопасен, поскольку он не уничтожит совершенную работу, но требует больше работы, так как вам нужно вернуть реверс, прежде чем вы сможете снова объединить ветку (см. Следующий раздел).
Отмена слияния, нажатого на удаленный
Предположим, вы слились в новую функцию (add-gremlins)
> git merge feature/add-gremlins
...
#Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
501b75d..17a51fd master -> master
После этого вы обнаружите, что функция, которую вы только что объединили, нарушила систему для других разработчиков, ее нужно немедленно отменить, и исправление самой функции займет слишком много времени, поэтому вы просто хотите отменить слияние.
> git revert -m 1 17a51fd
...
> git push
...
17a51fd..e443799 master -> master
На данный момент гремлины вышли из системы, и ваши коллеги-разработчики перестали кричать на вас. Тем не менее, мы еще не закончили. Как только вы устраните проблему с помощью функции add-gremlins, вам нужно будет отменить это возвращение, прежде чем вы сможете снова объединиться.
> git checkout feature/add-gremlins
...
#Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
На данный момент ваша функция теперь успешно добавлена. Однако, учитывая, что ошибки этого типа часто вводятся конфликтами слияния, иногда бывает более полезным несколько иной рабочий процесс, поскольку он позволяет исправить конфликт слияния в вашей ветке.
> git checkout feature/add-gremlins
...
#Merge in master and revert the revert right away. This puts your branch in
#the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
#Now go ahead and fix the bug (various commits go here)
> git checkout master
...
#Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
Использование reflog
Если вы испортите rebase, один из вариантов начать снова - вернуться к фиксации (pre rebase). Вы можете сделать это с помощью reflog
(который имеет историю всего, что вы делали за последние 90 дней - это можно настроить):
$ git reflog
4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo
4a5cbb3 HEAD@{1}: rebase: fixed such and such
904f7f0 HEAD@{2}: rebase: checkout upstream/master
3cbe20a HEAD@{3}: commit: fixed such and such
...
Вы можете увидеть фиксацию до того, как rebase будет HEAD@{3}
(вы также можете проверить хэш):
git checkout HEAD@{3}
Теперь вы создаете новую ветку / удаляете старую / снова пытаетесь переустановить.
Вы также можете вернуться обратно к точке вашего reflog
, но только сделайте это, если вы на 100% уверены, что это то, что вы хотите сделать:
git reset --hard HEAD@{3}
Это приведет к тому, что ваше текущее дерево git будет соответствовать тому, как оно было в этот момент (см. «Отмена изменений»).
Это можно использовать, если вы временно видите, насколько хорошо работает ветка, когда она переустанавливается на другую ветку, но вы не хотите сохранять результаты.
Возврат к предыдущему фиксации
Чтобы вернуться к предыдущей фиксации, сначала найдите хеш фиксации, используя git log
.
Чтобы временно вернуться к этой фиксации, отделите голову:
git checkout 789abcd
Это помещает вас в фиксацию 789abcd
. Теперь вы можете совершать новые коммиты поверх этой старой фиксации, не затрагивая ветку, на которой находится ваша голова. Любые изменения могут быть внесены в правильную ветку с использованием branch
или checkout -b
.
Чтобы вернуться к предыдущему фиксации при сохранении изменений:
git reset --soft 789abcd
Откат последнего фиксации:
git reset --soft HEAD~
Чтобы навсегда отказаться от любых изменений, сделанных после определенного фиксации, используйте:
git reset --hard 789abcd
Чтобы окончательно отказаться от любых изменений, сделанных после последнего фиксации:
git reset --hard HEAD~
Остерегайтесь: хотя вы можете восстановить отброшенные коммиты с использованием reflog
и reset
, незафиксированные изменения не могут быть восстановлены. Используйте git stash; git reset
вместо git reset --hard
- безопасно.
Отмена изменений
Отменить изменения в файле или каталоге рабочей копии .
git checkout -- file.txt
Используется во всех путях файлов, рекурсивно из текущего каталога, он отменяет все изменения в рабочей копии.
git checkout -- .
Для отмены только частей изменений используйте --patch
. Вас спросят, для каждого изменения, если оно должно быть отменено или нет.
git checkout --patch -- dir
Чтобы отменить изменения, добавленные в индекс .
git reset --hard
Без --hard
это сделает мягкий сброс.
С локальными фиксациями, которые вы еще должны нажать на удаленный компьютер, вы также можете выполнить мягкий сброс. Таким образом, вы можете переделать файлы, а затем совершить.
git reset HEAD~2
В приведенном выше примере будут разматываться ваши последние две коммиты и возвращать файлы в вашу рабочую копию. Затем вы можете внести дальнейшие изменения и новые коммиты.
Остерегайтесь: все эти операции, помимо мягких сбросов, навсегда удалит ваши изменения. Для более безопасного варианта используйте git stash -p
или git stash
, соответственно. Позднее вы можете отменить stash pop
или удалить навсегда с stash drop
.
Отменить некоторые существующие коммиты
Используйте git revert, чтобы вернуть существующие коммиты, особенно когда эти коммиты были перенесены в удаленный репозиторий. Он записывает некоторые новые коммиты, чтобы отменить эффект некоторых более ранних коммитов, которые вы можете безопасно продвигать без перезаписи истории.
Не используйте git push --force
если вы не хотите сбить оппортунизм всех других пользователей этого репозитория. Никогда не переписывайте публичную историю.
Если, например, вы только что подтолкнули коммит, содержащий ошибку, и вам нужно сделать это, выполните следующие действия:
git revert HEAD~1
git push
Теперь вы можете повторно отменить фиксацию фиксации локально, исправить свой код и нажать хороший код:
git revert HEAD~1
work .. work .. work ..
git add -A .
git commit -m "Update error code"
git push
Если фиксация, которую вы хотите вернуть, уже возвращается в историю, вы можете просто передать хеш фиксации. Git создаст контр-фиксацию, отменив вашу первоначальную фиксацию, которую вы можете безопасно нажать на свой пульт.
git revert 912aaf0228338d0c8fb8cca0a064b0161a451fdc
git push
Отменить / Повторить серию коммитов
Предположим, вы хотите отменить десяток коммитов, и вы хотите только некоторые из них.
git rebase -i <earlier SHA>
-i помещает rebase в «интерактивный режим». Он начинается, как обсуждаемый выше, но, прежде чем повторять какие-либо коммиты, он приостанавливается и позволяет вам мягко модифицировать каждую фиксацию по мере ее повторного воспроизведения. rebase -i
откроется в текстовом редакторе по умолчанию со списком применяемых коммитов:
Чтобы удалить фиксацию, просто удалите эту строку в своем редакторе. Если вам больше не нужны плохие коммиты в вашем проекте, вы можете удалить строки 1 и 3-4 выше. Если вы хотите объединить две коммиты вместе, вы можете использовать команды squash
или fixup