Git - приведение в порядок репо - PullRequest
4 голосов
/ 06 мая 2010

Я сделал репо в каком-то состоянии и хочу уйти из него.

Репо выглядит примерно так (A1, B1, C1 и т. Д., Очевидно, являются коммитами)

                  A1 ---- A2 ---- A3 ---- A4 ---- A5 ---- A6 ---- A7 ---- A8
                                                                  /
(from a remote repo)  B1 ---- B2 ---------------------------------  
                              | \
                              \  C1 ---------------------------------C2 
                               \                                     /
                                D1 --- D2 --- D3 --- D4 --- D5 --- D6

В идеале я хотел бы иметь возможность удалить все ревизии (с ребазой?) В строках B, C и D (мне не хочется говорить ветви просто потому, что теперь нет локальныхразветвляется в этих строках, кроме ref веток к удаленному репо) и пытается снова объединиться в удаленном репо, возможно, лучше.

Буду благодарен за любые предложения относительно того, как избавиться от всехэти коммиты.Могу ли я попросить, чтобы в любых ответах использовались версии SHA1, а не имена ветвей?Я думал, что каким-то образом смогу вернуть слияние в A7, но не могу понять, как это сделать

Надеюсь, этого достаточно.Многие, спасибо

Саймон

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Перебазирование веток - это, скорее всего, то, что вы хотите сделать, как предложил xyld.

Прежде чем сделать это, я бы порекомендовал прочитать команду rebase из главы 3 книги Pro Git . Это должно помочь объяснить, как работает этот процесс и какие "ошибки" вам необходимо знать. (Например, вы никогда не должны перебазировать коммиты, которые вы уже добавили в публичный репозиторий, или которые испортили бы это для всех остальных ... но это не так, как здесь.)

1 голос
/ 06 мая 2010

В порядке, я предполагаю, что вы имеете в виду линеаризацию ваших изменений.

Вы должны быть в состоянии сделать что-то вроде:

git rebase A B
git rebase 'A C
git rebase ''A D

A B C и D представляют коммиты / ссылки, связанные с перебазированием. Фактически передача A B C и / или D для ребазирования, вероятно, ничего не сделает . Вы должны сделать что-то вроде этого:

git rebase master branchname

Это помогает?

0 голосов
/ 06 мая 2010

Когда я выполню

git rebase -f 557b29ecc0ec c96769ef2f

Он явно выполняет ребаз. Тем не менее, он сообщает

Falling back to patching base and 3-way merge...
error: Your local changes to 'Client/WebDataEntry/temp.txt' would be overwritten by 
merge.  Aborting.
Failed to merge in the changes.
Patch failed at 0004 Initial Source Load

Я ранее добавил / совершил какие-либо изменения, поэтому не уверен, почему он должен сообщать об этом, за исключением некоторой циклической ситуации или ситуации, в которой он не может разрешить конфликт автоматически, так как он заканчивается

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Поэтому я пытаюсь запустить ребаз в интерактивном режиме

git rebase -i 557b29ecc0ec c96769ef2f

но я получаю ошибку

Invalid branchname: c96769ef2f

Возможно, мне следует добавить, что вполне возможно, что мое мышление / понимание неверно. Я надеялся, что, поскольку между А1 и В1 нет общего предка, если я перебазирую В1 (или любой из его последующих коммитов) на А1, это будет эффективно разрушать линии В1 / С1 / D1.

Спасибо еще раз

...