Теперь я в основном хочу отказаться от commit_2 и снова начать модифицировать мой проект в точке commit_1.
Если вы буквально хотите отказаться от commit_2
, тогда может случиться так, что вы можете использовать
git reset --hard HEAD^
(Обратите внимание, что в то время, когда я писал это, другой пост неправильно говорил вам использовать HEAD~2
; это отбросило бы оба коммита , что не то, о чем спрашивали.)
Существуют предостережения относительно использования команд, которые удаляют коммиты из ветви.
Во-первых, вы можете потерять изменения, внесенные вами в затронутые коммиты. Это может показаться странным предупреждением - вы спросили, как отменить изменения, - но, понимая, что ошибки случаются, нужно быть осторожным с этими командами. (Просто чтобы уточнить - если бы вы сделали что-то подобное случайно, изменения не были бы потеряны сразу навсегда; эти флажки предлагают немного безопасности net.)
Другие проблемы возникают, если в вашем репозитории есть пульты, а вы ' мы передали коммит (ы), о которых идет речь, на любой из пультов. Это не похоже на проблему здесь, но если это так, то есть еще кое-что, что вы должны рассмотреть, прежде чем удалять коммиты из ветви.
Но если вы просмотрели это и решили, что действительно делаете просто хотите отказаться от коммитов, выше должно работать. Обратите внимание: HEAD^
- это только одно из возможных выражений, которое относится ко второму-последнему коммиту. На данный момент это может быть самая простая вещь для использования, но она не всегда будет ссылаться на этот конкретный коммит. HEAD^
на самом деле означает «коммит, который является родителем проверенного в данный момент коммита».
Если вы находитесь в ветке master
, то master^
также будет работать - и не будет зависит от того, что в настоящее время проверено. Даже это меняется всякий раз, когда ветка master
движется; если по какой-то причине вам нужно выражение, которое будет продолжать ссылаться на конкретный коммит, вы можете создать тег
git tag mytag master^
и тогда mytag
будет работать; или вы можете посмотреть идентификатор фиксации рассматриваемого коммита (хотя это не будет удобное имя)
Но я отвлекся ...
Это отличается от - и больше drasti c чем - просто loading 2-ой к последнему коммиту, как предполагает название вопроса. Чтобы просто обновить ваше рабочее дерево с состоянием от 2-го до последнего коммита, вы можете
git checkout HEAD^
. Это перемещает HEAD
(то есть изменяет то, что было извлечено) и обновляет индекс и рабочее дерево, но это сохраняет фиксацию на master
на случай, если она понадобится вам позже. Тем не менее, он также переводит вас в состояние, называемое «оторванная голова», что означает, что git на самом деле не ожидает, что вы создадите новые коммиты отсюда.
Если вы хотите сохранить старый коммит, и быть в состоянии, когда вы можете добавить коммиты поверх commit_1
, тогда вам нужно создать новую ветку. Если вы выполнили предыдущую команду извлечения, вы могли бы
git checkout -b mybranch
, и новые изменения могли быть зафиксированы в новой ветви, оставив исходный commit_2
в master
. Или вы можете поместить ветку (или тег) на commit_2
, а затем переместить master
обратно на commit_1
.
git checkout master
git branch mybranch
git reset --hard HEAD^
Это может показаться запутанным числом вариантов; но на самом деле это потому, что каждый из них служит несколько иной цели, и только тот, кто участвует в вашем проекте, вероятно, будет иметь весь контекст, чтобы решить, что имеет смысл.
Итак, д-р - это звучит как Возможно, вы ищете git reset
, но делать это в одиночку можно только в том случае, если вы действительно намерены навсегда отказаться от изменений с commit_2
. Если вы действительно хотите сохранить их для использования в будущем (но, возможно, просто не уверены, так ли это), то есть способы сделать это тоже.