Создайте ветку git и верните оригинал в исходное состояние - PullRequest
30 голосов
/ 21 апреля 2009

Я недавно облажался с моим 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

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

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

Мой вопрос: есть ли способ «превратить» моего мастера в идентичную копию Central, перенося все изменения, которые я сделал на своем мастере, в другую ветку (скажем, Feature)?

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

Ответы [ 3 ]

47 голосов
/ 21 апреля 2009

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

#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, содержащий всю работу, которую я делал ранее!

Спасибо!

16 голосов
/ 21 апреля 2009
# 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 голосов
/ 21 апреля 2009

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

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

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

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

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

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