Git ошибка или неправильное использование ветвления? - PullRequest
1 голос
/ 14 сентября 2009

У меня есть большой проект, который я обновлял до пограничных Rails. Я сделал копию всего каталога проекта и реорганизовал там в качестве меры предосторожности доверие к git (или, по крайней мере, как я мог бы использовать / использовать его неправильно). После завершения большей части работы я вернулся в исходную директорию проекта и на консоли (это из памяти и поэтому свободно основано на том, что на самом деле произошло):

git branch edge
git checkout edge
git rm vendor/plugins
git commit -m "wiped out old plugins"

затем я вручную скопировал последние версии плагинов, которые я обновил в своем скопированном проекте.

git add vendor/plugins
git commit -m "re-added in plugins, some unchanged, some later versions"

Насколько я понимаю, вышеупомянутое добавление является рекурсивным. Чтобы получить некоторое доверие к git, я переключался взад и вперед между веткой master и пограничной ветвью в разное время во время моей работы, просто чтобы убедиться, что он справлялся со свопингом.

git checkout master
git checkout edge

Что я заметил, так это то, что (после некоторых перестановок) в пограничной ветви некоторые из плагинов вернулись к основным версиям. Много раз я пытался зафиксировать последнюю версию проблемного плагина, но после замены он в конечном итоге возвращался.

Я подозреваю, что, возможно, возникла проблема с тем, как я добавлял файлы после их перемещения вручную. (Был ли необходим git add vendor / plugins / *?) Кто-нибудь имел проблемы с переключением между ветками, когда две ветви содержат одни и те же подкаталоги? Как бы вы справились с объединением изменений, найденных в копии приложения, найденной в одном каталоге, обратно в оригинал? Исходный репозиторий является чистым, в то время как копия довольно испорчена из-за попытки заставить некоторые плагины оставаться измененными в пограничной ветви.

Ответы [ 2 ]

5 голосов
/ 14 сентября 2009

Это кажется странным способом сделать то, что вы хотели.

Более "мерзкий" способ сделать то, что вы предложили, был бы:

$ git checkout -b edge
... #make your modifications for the port.
$ git commit -m'ported plugins to rails edge' -a
$ git checkout master # original code is there untouched
$ git checkout edge # ported code is there just as you commited it.

Оттуда, в зависимости от цели, вы можете:

$ git checkout master # make sure you are on the master branch
$ git merge edge # merge the edge branch into master
... # fix any errors
$ git branch -d edge # remove the edge branch since you don't need it anymore.

Или поддерживать две ветви. Один перенесен на край, другой не перенесен. Это, вероятно, не то, что вы хотите. Ветви в git дешевы и просты, и их вполне можно выбросить, когда вы закончите.

2 голосов
/ 14 сентября 2009

git checkout не удалит файлы, не входящие в коммит. Вы должны использовать git clean -f, чтобы удалить все ненужные файлы в текущем рабочем каталоге. Вы также можете просто удалить папку и git checkout -f снова.

кроме этого, действительно лучше создать ветку для работы с edge функциями, а затем объединить ветку обратно, как упомянуто Джереми Уоллом

...