Создайте ветвь git и верните исходное состояние в исходное состояние

Недавно я испортил свой репозиторий git и хотел бы узнать, есть ли у него какое-либо средство.

Моя настройка такова:

Central repo on github.
Personal repo on github (which is a fork of Central)
   +Central is setup as remote (upstream/master)
   +Master branch (origin/master)
   +Feature branch (origin/feature)

Мой рабочий процесс был таким:

Need to fix something in Central:
   1. checkout Master
   2. Make changes
   3. Pull from upstream/master and merge
   3. Commit, push to upstream/master

Need to work on a New Feature:
   1. Checkout/Create Feature branch
   2. Work work work
   3. Pull from upstream/master and merge
   4. Commit, push to upstream/master

Таким образом, у меня всегда было первозданное состояние Центрального в моей мастерской.

Теперь то, что я сделал, вместо этого начало работать над ветвью мастера. Поэтому я внес изменения в своего хозяина и больше не могу от него отрываться, чтобы получить копию Центрального. Всякий раз, когда мне нужно сделать и направить некоторые исправления в Central, я должен клонировать Central в другой каталог и работать оттуда.

Мой вопрос: есть ли способ "вернуть" моего мастера, чтобы он был идентичной копией Центра, перемещая все изменения, которые я сделал на моем Мастере, в другую ветку (например, "Функция" )?

Я знаю, что это сбивает с толку, и я был бы признателен за любую помощь. Я уточню, если что-то неясно.

Ответ 1

Хорошо, решение было довольно простым, намекнул Пат Нотц и Бомбе.

#Make sure we're on the master branch
$ git checkout master

# Make a new branch to hold the work I've done
$ git branch old_master
# Save this branch on my remote repo (for backup)
$ git checkout old_master
$ git push origin old_master

# Reset my local master back to match the commit just before I started 
# working on my new feature
$ git checkout master
$ git reset --hard 2aa93842342342
# Get it to be the same as my Central
$ git pull upstream master

# Now DELETE my master on my remote repo
$ git push origin :master
# And recreate it
$ git push origin master

# Branch created!
#* [new branch]      master -> master

#

Теперь у меня есть две хорошие ветки: master и old_master. С мастером, являющимся копией моего Центра, для исправлений для производства, и old_master, выполняющим всю работу, которую я делал ранее!

Спасибо!

Ответ 2

# Make sure we're on the master branch
$ git checkout master

# Make a new branch to hold the work I've done
$ git branch old_master

# Reset my local master back to match origin/master
$ git reset --hard origin/master

Теперь вы можете проверить old_master и использовать его так же, как вы сделали ветвь feature

Ответ 3

Что именно вы подразумеваете под

Я испортил [мой] мастер и больше не могу от него отступать.

Вы всегда можете создать новую ветку из любой фиксации в вашем репозитории, независимо от того, как это может быть "испорчено" - к слову, что-то Git не имеет понятия.

В принципе, вы можете вернуть свой репозиторий в любое состояние, которое оно ранее имело, потому что Git не будет явно удалять какие-либо объекты, он будет только мусор собирать неучтенные (оборванные) объекты время от времени. Поэтому вам просто нужно выяснить, как выглядел ваш репозиторий. gitk или git log могут вам помочь.

После того, как вы восстановили локальный репозиторий в состоянии, которое вам нравится, вы можете просто вернуть его в центральный публичный репозиторий. Если это приводит к немедленному переходу вперед, вам может потребоваться указать флаг --force при нажатии.