2016-08-04 3 views
1

Я знаю, что если я хочу, чтобы принудительно перезаписать локальный репозиторий с файлами из удаленного репозитория, я делаю это:Как я могу принудительно выполнить локальное репо с изменениями из удаленного репо, сохраняя при этом историю?

git fetch --all 
git reset --hard origin/master 

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

Есть ли способ, которым я могу сделать эту насильственную перезапись, сохраняя при этом историю?

Например, если у меня есть файл в локальном репо со следующим содержанием:

- ContentA 
- ContentB 
- ContentC 

И у меня есть один и тот же файл в удаленном репозитории со следующим содержанием:

- ContentA 
- ContentC 
- ContentD 

После извлечения из удаленного репо я хочу, чтобы история показывала это для файла:

Version #1 
- ContentA 
- ContentB 
- ContentC 

Version #2 
- ContentA 
- ContentC 
- ContentD 

Я не знаю, т хочет, чтобы показать это (с принудительной перезаписи):

Version #1 
- ContentA 
- ContentC 
- ContentD 

И я не хочу, чтобы показать это (от слияния):

Version #1 
- ContentA 
- ContentB 
- ContentC 

Version #2 
- ContentA 
- ContentB 
- ContentC 
- ContentD 

Возможно ли это?

+0

Вы можете посмотреть на свой собственный драйвер git merge. – DavidN

+0

Кроме того, ваш сброс --hard to origin/master перемещает вашего локального мастера на этот коммит, поэтому я думаю, что вы просто потеряли работу там. Похоже, вы хотите слиться, но особым образом. Мне просто интересно, не используете ли вы git так, как это делают все остальные, потому что вы можете легко увидеть обе версии с git. Обычно люди не хотят конкатенировать файлы, когда они объединяют их. Они хотят объединить их в слияние. – DavidN

+0

Вы можете переустановить удаленный доступ на локальный, или вы можете потянуть пульт в отдельную ветвь, а затем сбросить --soft, stash и pop, или вишневое выделение отдельных коммитов с пульта. –

ответ

1

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

Вы можете выполнить слияние с опцией -no-commit, а затем выбрать, какие файлы вы хотите с помощью git checkout - -ours или git checkout - theirs, затем git добавьте эти файлы и, наконец, git commit, чтобы завершить слияние, чтобы выбрать, какие изменения файла вы хотите. Что касается истории, которую вы хотите, вы можете редактировать фактические комментарии коммита, если это то, что вы хотите.

+0

Вы можете объединиться с '--strategy ours' или' --strategy theirs' вместо того, чтобы беспокоиться о слиянии без фиксации, если вы хотите сделать то же самое во всем репо. – hobbs

+0

Я думаю, что это -X ours или -X их, когда -strategy является рекурсивным (это стратегия по умолчанию. – DavidN

Смежные вопросы