Слить репозиторий git с веткой другого репо


122

Учитывая репо Foo и репо Bar. Я хочу объединить Bar с Foo, но только в отдельную ветку с именем baz.

git checkout -b baz <= поместите сюда репо Bar.

Ответы:


232

Вы не можете объединить репозиторий в ветку . Вы можете объединить ветку из другого репозитория с веткой в вашем локальном репозитории. Предполагая, что у вас есть два репозитория, fooи barоба они расположены в вашем текущем каталоге:

$ ls
foo bar

Перейти в fooрепозиторий:

$ cd foo

Добавьте barрепозиторий как удаленный и загрузите его:

$ git remote add bar ../bar
$ git remote update

Создайте новую ветку bazв fooрепозитории на основе вашей текущей ветки:

$ git checkout -b baz

Слить ветку somebranchиз barрепозитория в текущую ветку:

$ git merge --allow-unrelated-histories bar/somebranch

( --allow-unrelated-historiesне требуется до git версии 2.9)


21
поскольку git 2.9 вам, вероятно, потребуется добавить --allow-unrelated-historiesв команду git merge.
Drasill

2
Информация о комментарии от @Drasill: github.com/git/git/blob/master/Documentation/RelNotes/…
GaTechThomas

10
Я понятия не имею, что делаю, и не могу прочитать это с помощью заполнителей foo / bar. Может ли кто-нибудь отредактировать это с помощью реальных примеров из жизни (например, ссылок, где это уместно и т.п.)?
rien333

Ох, это здорово. Я бы предпочел объединить его в подкаталог. Не может быть так иначе, не так ли? Я бы предпочел добавить этот шаг.
macetw

1
Я получаю массу конфликтов слияния. В любом случае вы могли бы принудительно слиться в новую ветку?
nomadoda

41

Обновлено с помощью "реальных" команд:

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


Создайте новую ветку:

git checkout -b <my-branch>

Добавьте дополнительный пульт, затем загрузите его:

git remote add <repo-name> git@github.com:xxx/<repo-name>.git
git remote update

Объедините одну из их веток в свою текущую ветку:

git merge <repo-name>/<their-branch>


Если вы не знаете, что <their-branch>хотите, выберитеmaster

Если вы уверены, что хотите принять все удаленные изменения и избежать конфликтов ( перезаписать свои ), вы можете указать в -X theirsкачестве опции для git mergeна последнем шаге.

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


3

Используя руководство от larsks, я смог сделать это с помощью SourceTree.

  1. Создал ветку в целевом репозитории
  2. Добавил исходный репозиторий как удаленный, нажав кнопку «Настройки» и добавив исходный репозиторий.
  3. Ветви из обоих репозиториев теперь отображаются в списке веток. Я использовал инструмент слияния, чтобы слить ветку исходного репозитория с веткой моего нового целевого репозитория.
  4. Устранены любые конфликты с использованием SourceTree или моей IDE.
  5. Зафиксируйте изменения в моей ветке.
  6. Удалите исходный репозиторий из удаленного списка с помощью кнопки «Настройки».
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.