Я хочу отменить все изменения, сделанные после коммита <commit-hash>
. Так я и сделал:
git reset --hard <commit-hash>
Теперь я хочу сделать то же самое с моим пультом. Как я могу это сделать? Я сделал некоторые коммиты (и подтолкнул) после, <commit-hash>
и я просто хочу отказаться от них всех. Есть только что - то пошло ужасно неправильно в пути , и я не хочу , чтобы сделать его хуже , чем это уже. ; (
Я в принципе хочу , чтобы перемотать мой origin/master
To<commit-hash>
origin/master
пользователи не тянули и не давили? Изменение истории общедоступного (то есть нелокального) хранилища - это то, чего вы хотите избегать всегда.Ответы:
Предполагая, что ваша ветка вызывается
master
как здесь, так и удаленно, и что ваш удаленный вызывается,origin
вы можете сделать:Однако вам следует избегать этого, если кто-то еще работает с вашим удаленным репозиторием и извлек ваши изменения. В этом случае было бы лучше отменить коммиты, которые вам не нужны, а затем нажать как обычно.
Обновление: вы объяснили ниже, что другие люди извлекли изменения, которые вы выдвинули, поэтому лучше создать новый коммит, который отменит все эти изменения . В этом ответе от Якуба Наребски есть хорошее объяснение ваших возможностей сделать это . Какой из них наиболее удобен, зависит от того, сколько коммитов вы хотите вернуть, и какой метод имеет для вас наибольшее значение.
Поскольку из вашего вопроса ясно, что вы уже использовали
git reset --hard
для сбросаmaster
ветки, вам может потребоваться начать с использования,git reset --hard ORIG_HEAD
чтобы переместить ветку туда, где она была раньше. (Как всегдаgit reset --hard
, убедитесь, чтоgit status
он чистый, что вы находитесь на правильной ветке и что вы знаете,git reflog
как инструмент для восстановления явно потерянных коммитов.) Вы также должны проверить,ORIG_HEAD
указывает ли правильный коммит, с помощьюgit show ORIG_HEAD
.Поиск проблемы:
Если вы получаете сообщение типа " ! [Удаленный отклонен] a60f7d85 -> master (обработчик предварительного получения отклонен) "
тогда вы должны разрешить переписывание истории ветки для конкретной ветки. Например, в BitBucket говорится: «Переписывание истории ветвей запрещено». Есть флажок с именем,
Allow rewriting branch history
который вы должны проверить.источник
git update-ref
вместоreset --hard
; это позволит вам сделать то же самое, не имея рабочего дерева / проверенной веткиrevert
но допустим, я хочу отменить последние 4 коммита, так что я должен сделатьgit revert comit1; git push; git revert comit2; git push; ...
или простоgit revert commit4; git push
?git revert commit4
создание создает новый коммит, который отменяет только те изменения, которые были внесены в негоcommit4
. Тем не менее, в ответе, на который я ссылаюсь, вы можете свернуть их в один коммит.git reset --hard
но я удалил свой локальный и снова вытащил из источника, так чтоgit revert ...
теперь я могу сомневаться: мне нужно отменить каждый коммит и нажать (один за другим) или просто отменить первый коммит после только правильно совершить?.git
каталог ссылками, которые они не собирались создавать. Я был неправ, говоря, что нет никаких проверок безопасности. Вы можете найти классификацию команд "plumbing" и "porcelain" на странице руководства git .Используйте другие ответы, если вы не против потерять локальные изменения. Этот метод все еще может разрушить ваш пульт, если вы выберете неверный коммит хеш для возврата.
Если вы просто хотите, чтобы удаленное соответствие было зафиксировано в любом месте вашего локального репо:
git log
чтобы найти коммит, на котором вы хотите быть удаленным.git log -p
чтобы увидеть изменения илиgit log --graph --all --oneline --decorate
увидеть компактное дерево.Запустите команду как:
например
или
Я использую удобный псевдоним (
git go
) для просмотра истории, как на шаге 2, который можно добавить следующим образом:источник
git config --global alias.graph 'log --graph --all --decorate --oneline'
менее запутанна , и вы все еще можете ограничить его, например:git graph -5
q
для выхода из журнала git. 2 минуты я никогда не вернусь.less
иq
является нормальным способом выхода из нее. Git Bash похож на * nix терминал.Я решил проблему, подобную вашей, с помощью следующих команд:
источник
На GitLab вам, возможно, придется установить незащищенную ветку перед тем, как сделать это. Вы можете сделать это в [repo]> Настройки> Репозиторий> Защищенные ветви. Тогда метод из ответа Марка работает.
источник
Если вам нужна предыдущая версия файла, я бы порекомендовал использовать git checkout.
Это вернет вас в прошлое, это не повлияет на текущее состояние вашего проекта, вы можете перейти на mainline git checkout mainline
но когда вы добавляете файл в аргумент, этот файл возвращается вам из предыдущего времени в текущее время вашего проекта, т.е. ваш текущий проект изменяется и должен быть зафиксирован.
Преимущество этого в том, что он не удаляет историю и не отменяет определенные изменения кода (git revert)
Проверьте больше здесь https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
источник
Мои два цента на предыдущие ответы: если
все еще не работает, вы можете отредактировать
<your-remote-repo>.git/config
секцию приема файла:источник
Если ваша ветвь не является разработкой или производством, самый простой способ добиться этого - сбросить локально до определенного коммита и создать оттуда новую ветку. Ты можешь использовать:
git checkout 000000
(где 000000 - это идентификатор коммита, куда вы хотите перейти) в вашей проблемной ветке, а затем просто создайте новую ветку:
git remote add [name_of_your_remote]
Тогда вы можете создать новый пиар, и все будет работать нормально!
источник
Сделай одну вещь, получи SHA комита нет. такие как 87c9808, а затем,
git push --force origin master
источник
Sourcetree: сброс пульта до определенного коммита
Нажмите эту фиксацию для нового источника / feature / 1337_MyAwesomeFeature
Ваша локальная ветвь функций и ваша удаленная ветвь функций теперь находятся на предыдущем (на ваш выбор) коммите
источник