2014-02-19 2 views
1

У меня есть филиал master и филиал es. es был реконструирован в местном масштабе:Как восстановить ветку Git?

git checkout master 
git checkout -b es2 
git cherry-pick A C E D 
git branch -D es 
git checkout master 
git branch -m es2 es 

где А, С, D и Е являются некоторые выбранные фиксаций в es филиала.

После этого я должен был заставить толчок:

git push --all -f 

С самого начала до этого момента никто не толкнул или вытащил из репо.

Но все прошло хорошо. Проблема возникла, когда я попытался переустановить ветку на другом компьютере. Пользователь имеет эту отраслевую структуру:

master - es - dev 

dev имеет только один фиксации (скажем, X). Это проблематично последовательность команд GIT:

git checkout master 
git pull 
git branch -f es origin/es 
git checkout dev 
git rebase es 

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

git checkout es 
git checkout -b dev2 
git cherry-pick X 
git branch -D dev 
git checkout es 
git branch -m dev2 dev 

Это заставляет меня думать, что проблема заключается в том, что «старый» dev филиала имеет некоторые ссылки или ссылку на old es, и поэтому rebase пытается добавить к ветке dev больше, чем X commit. Мне интересно, есть ли еще один более чистый способ заставить резидентную папку пользователей реплицироваться с ветвями репозитория.

Примечание: пользователи никогда изменение es или master, просто dev.

ответ

2

В первый раз вы пытались сделать rebase, вам необходимо использовать --onto флаг сказать ублюдка, чтобы rebase в dev ветви на новый es отрасли. Использование регулярного rebase могло бы работать только в том случае, если ветвь es все еще имела оригинальные коммиты, потому что это то, что rebase использует в качестве контрольной точки, чтобы выяснить, как переделать ветку dev сверху es.

Так что простой способ сделать то, что вы хотели бы

git rebase --onto <new-base> <old-base> <branch> 
git rebase --onto origin/es es dev 

Это говорит мерзавцу взять dev ветку и перебазировать его на версию es от origin, и он говорит, чтобы использовать местные , исходная версия es в качестве ориентира для определения того, что следует исключать в rebase (т. е. он будет принимать все фиксации между es и dev, но не включая es).

Обратите внимание, что если у вас уже есть dev отделение проверили, то вы можете оставить его из команды rebase:

git rebase --onto origin/es es 
Смежные вопросы