Git: merge разных бранчей из разных репозиториев

By | 10/13/2016
 

git-logoЗадача: смерджить два бранча из разных репозиториев.

Кратко – процедура выглядит так:

  1. переходим в каталог нового репозитория;
  2. git checkout newbranch – переключаемся на нужный бранч;
  3. git remote add -f old_repo git@github.com:name/oldrepo.git – добавляем старый репозиторий как remote для нового;
  4. git remote update – обновляем все remote;
  5. git merge remotes/oldrepo/oldbranch – выполняем слияние текущего репозитория и текущего бранча со старым репозиторием, добавленным как remote.

Пример выполнения.

Имеется два репозитория:

  1. (старый репозиторий) jmplatform (бранч develop)
  2. (новый репозиторий) jmplatform_live (бранч old_repo_poland)

Требуется jmplatform(develop) смерджить в jmplatform_live(old_repo_poland).

Сначала – выполним diff.

Переходим в каталог репозитория:

$ cd ~/Work/Projects/BER.JM.Github/PLATFORM_MIGRATION/jmplatform_live

Проверяем бранч – нужен old_repo_poland:

$ git branch
  current_live_wwwroot_1
  master
* old_repo_poland

Добавляем старый репозиторий как remote к новому, в котором находимся:

$ git remote add -f old_repo git@github.com:/name/jmplatform.git
Updating old_repo
warning: no common commits
remote: Counting objects: 18373, done.
Receiving objects: 100% (18373/18373), 419.14 MiB | 3.89 MiB/s, done.
remote: Total 18373 (delta 0), reused 0 (delta 0), pack-reused 18373
Resolving deltas: 100% (10966/10966), done.
From github.com:name/jamplatform
 * [new branch]      develop    -> old_repo/develop
...
 * [new branch]      master     -> old_repo/master
 * [new branch]      playground -> old_repo/playground
 * [new branch]      release    -> old_repo/release

Обновляем все remote:

$ git remote update
Fetching origin
Fetching old_repo

Сравниваем develop из старого репозитория и old_repo_poland нового:

$ git diff old_repo_poland remotes/old_repo/develop\
...

Если всё ОК – выполняем слияние:

$ git merge remotes/old_repo/develop
warning: Cannot merge binary files: server/JMPlatform_Soln/JMPlatform.CMS/Bin/TweetSharp.dll (HEAD vs. remotes/old_repo/develop)
...
Auto-merging server/JMPlatform_Soln/JMPlatform.CMS/config/ExamineSettings.config
CONFLICT (add/add): Merge conflict in server/JMPlatform_Soln/JMPlatform.CMS/config/ExamineSettings.config
...
Automatic merge failed; fix conflicts and then commit the result.

Исправляем конфикт в файле server/JMPlatform_Soln/JMPlatform.CMS/config/ExamineSettings.config и коммитим его:

$ git add server/JMPlatform_Soln/JMPlatform.CMS/config/ExamineSettings.config && git commit -m "search updates"

Проверяем статус:

$ git status
On branch old_repo_poland
nothing to commit, working directory clean

Пушим:

$ git push -u origin old_repo_poland
Counting objects: 10561, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2391/2391), done.
Writing objects: 100% (10103/10103), 22.65 MiB | 4.56 MiB/s, done.
Total 10103 (delta 7858), reused 9867 (delta 7667)
remote: Resolving deltas: 100% (7858/7858), completed with 327 local objects.
To git@github.com:name/jmplatform_live.git
 * [new branch]      old_repo_poland -> old_repo_poland
Branch old_repo_poland set up to track remote branch old_repo_poland from origin.

Удаляем старый репозиторий из remote нового:

$ git remote rm old_repo

Готово.