Как мне воспроизвести коммиты локального репозитория Git поверх проекта, который я развил на github.com?

StackOverflow https://stackoverflow.com/questions/1457248

  •  12-09-2019
  •  | 
  •  

Вопрос

Да, я знаю, что мне следовало просто разветвить проект с самого начала, но я сейчас в такой ситуации.:)

У меня на локальном компьютере есть локальный репозиторий Git, содержащий мой блог, с историей коммитов за несколько месяцев.Изначально я просто скачал файлы из репозиторияhttp://github.com/mojombo/mojombo.github.com, и я продолжил работу с моим локальным репозиторием Git, причем первый коммит выглядел как последние файлы из репозитория mojombo.

Теперь я хотел бы разветвить проект, и поверх него будут воспроизведены коммиты моего локального репозитория Git, поэтому похоже, что я разветвил проект с самого начала, а затем отправил его обратно в свою раздвоенную версию репозитория mojombo на своем GitHub. счет:

http://github.com/program247365/mojombo.github.com

Возможно, тогда история выглядела бы так:

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

Какие команды Git я могу использовать именно для этого?

я посмотрел этот вопрос.Придется ли мне добавить репозиторий mojombo в качестве удаленного к моему проекту, а затем подключить его, объединить, разрешить конфликты и затем отправить в свой раздвоенный проект на GitHub?

Это было полезно?

Решение 2

Когда я попробовал git pull это дало мне следующую ошибку:

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

В моем конкретном случае показалось, что git rebase это был путь для меня, как показано здесь:

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

Другие советы

Суммируя:

Одним из решений является использование трансплантаты чтобы связать историю, затем используйте git filter-branch переписать историю в соответствии с этими прививками, а затем, при желании, сделать слить.

Обратите внимание, что решение для воспроизведения ваших изменений (ваших коммитов) поверх новой разработки в исходном репозитории (файл перебазировать решение) является еще одним жизнеспособным решением.


Более длинная версия:

Предположим, вы либо помните, либо можете найти, изучив исходный код и/или используя команды git, версию репозитория, снимок которого вы загрузили, и начали локальную разработку.Назовем эту редакцию СТАРТ или А.

Предположим, что ваша локальная отключенная история находится в клоне исходного репозитория.Это означает, что ваша локальная автономная разработка находится в том же репозитории, что и полная история проекта.Предположим, что ваши локальные ветки находятся в ветке «master» (и для простоты существует только одна ветка).

Если вы не загрузили проект в репозиторий с помощью локальной отключенной работы, вы можете сделать это с помощью:

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

Теперь история выглядит следующим образом:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)

                                     x---y---*---*---*      <--- master (your local disconnected history)

Коммит с именем A на диаграмме выше — это коммит START, который вы скачали как снимок и начали локальную разработку.

Есть две возможности:вы зафиксировали снимок «A» в качестве первоначального коммита «x», или первый сделанный вами коммит был с вашими локальными изменениями.

В первом случае (вы зафиксировали исходное начальное состояние, напримеркак «Начальная фиксация» или «Импорт»), вы бы хотели, чтобы подключенная история выглядела следующим образом:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)
                                      \
                                        \-y---*---*---*       <--- master (your local disconnected history)

то естьваш первый исходный коммит «y» будет иметь «A» в качестве родителя.

Во втором случае (вы зафиксировали свои изменения) вы бы хотели, чтобы подключенная история выглядела следующим образом:

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)
                                      \
                                        \-x---y---*---*---*      <--- master (your local disconnected history)

то естьвы хотите, чтобы сначала зафиксировали «x», чтобы «A» было родителем.

В обоих случаях вам нужно найти полный идентификатор SHA-1 коммита «A» и полные идентификаторы SHA-1 коммитов «x» и «y».

Вы можете найти SHA-1 коммита «A» (при условии, что вы его еще не знаете) с помощью git rev-parse:

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(суффикс '^{commit}' может потребоваться, чтобы убедиться, что вы нашли совершить SHA-1, что важно, если вы, например, знаете «A» по его тегу, например'v0.99';в вашем случае это не обязательно, поскольку рассматриваемый репозиторий не использует теги).

Вы можете найти SHA-1 коммитов «x» и «y», используя список версий git (при условии, что ваша разработка выполнялась в ветке «master»):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

("| tail -2" здесь, чтобы найти два последних коммита в сгенерированном списке;вам не нужно использовать его, если у вас его нет).

Примечание: во всех приведенных выше примерах полный SHA-1 Примеры, и его не следует использовать как есть!

Давайте назовем коммит, который вы хотите иметь «A» (или «START») в качестве родительского, как FIRST (это будет «x» или «y», в зависимости от вашего случая, как указано выше).Теперь мы используем механизм трансплантата чтобы связать историю:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

Затем вам следует проверить, правильно ли вы теперь подключили (присоединились) историю, используя графический браузер истории, такой как gitk, или QGit, или GitX, если вы используете MacOS X, или даже "git log --graph", или "git show-branch", например:

$ gitk master origin/master    # or --all

(где gitk здесь только в качестве примера;если вы используете "git show branch"вы не всегда можете использовать"--all' вариант).

Наконец, мы, вероятно, захотим сделать эти изменения постоянными, чтобы любой, кто будет получать данные из нашего репозитория, также мог бы подключить историю.Мы можем сделать это, используя git-ветвь фильтра:

$ git filter-branch master

У вас будет исходная (отключенная) история в «refs/original/master».

Теперь вы можете удалить файл графтов:

$ rm .git/info/grafts

Теперь вы сможете объединить новую разработку для исходного репозитория:

$ git merge origin/master

Настройка конфигурации для каждой ветки, чтобы было достаточно просто выполнить «git pull», когда ветка «master» извлекает (объединяет) изменения в исходном (al) репозитории, остается в качестве упражнения для читателя...:-)


Примечание: тот решение для перебазирования приведет к следующей истории (при условии, что у нас есть случай, когда первая фиксация была простым импортом):

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)
                                                                     \
                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(где y' означает, что совершить y было изменено:это должен быть примерно тот же набор изменений, но он отличается от коммита).

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

  1. Форк репозитория mojombo на GitHub.
  2. Клонируйте свою раздвоенную копию.
  3. Объедините изменения из существующего (исходного) репозитория.
  4. Удалите исходный репозиторий (при желании, но он вам больше не нужен).

Итак, после разветвления GitHub вы можете использовать следующую последовательность команд:

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

Таким образом, этот метод объединит все изменения, которые вы внесли в старый репозиторий (таким образом, сохраняя вашу историю разработки), а также извлечет историю моджомбо, и позволяя вам идти в ногу с изменениями Моджомбо/легко вносить изменения обратно в его репозиторий, если это применимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top