Как мне загрузить вторую или последнюю подтвержденную версию моего проекта, используя git? - PullRequest
0 голосов
/ 09 января 2020

Предположим, что я внес некоторые изменения и сделал это:

git add -A
git commit -m "comment commit_1"

Теперь я сделал больше изменений и сделал это снова:

git add -A
git commit -m "comment commit_2"

Теперь я в основном хочу отказаться от commit_2 и начать модифицировать мой проект снова с момента commit_1.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

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

git reset --hard HEAD~

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

git checkout HEAD~
git reset --soft the-branch
git commit -m "Taking back changes from the last revision"
# And if you like the result of this:
git branch -f the-branch
git checkout the-branch

Там вы go.

0 голосов
/ 09 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...