Mesclar repo git no branch de outro repo

120

Atendendo repo Foo e repo Bar. Quero mesclar Bar com Foo, mas apenas em um branch separado, chamado baz.

git checkout -b baz <= coloque o repositório do Bar aqui.

Milktrader
fonte

Respostas:

230

Você não pode fundir um repositório em um branch . Você pode mesclar um branch de outro repositório em um branch em seu repositório local. Supondo que você tenha dois repositórios, fooe barambos localizados em seu diretório atual:

$ ls
foo bar

Mude para o foorepositório:

$ cd foo

Adicione o barrepositório como um remoto e busque-o:

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

Crie um novo branch bazno foorepositório com base em qualquer que seja o seu branch atual:

$ git checkout -b baz

Mesclar branch somebranchdo barrepositório com o branch atual:

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

( --allow-unrelated-historiesnão é necessário antes do git versão 2.9)

larsks
fonte
21
desde o git 2.9, você provavelmente precisará adicionar --allow-unrelated-historiesao comando git merge.
Drasill de
2
Informações sobre o comentário de @Drasill: github.com/git/git/blob/master/Documentation/RelNotes/…
GaTechThomas
10
Não tenho ideia do que estou fazendo e realmente não consigo ler isso com marcadores de posição foo / bar. Alguém pode editar isso com exemplos reais da vida real (como links quando apropriado e tal)?
rien333
Ooh, isso é ótimo. Eu prefiro mesclá-lo em um subdiretório. Não pode ser tão diferente, não é? Eu prefiro essa etapa adicionada.
macetw 05 de
1
Recebo toneladas de conflitos de mesclagem. De qualquer forma, você poderia forçar a fusão em um novo branch?
nomadoda
41

Atualizado com comandos da "vida real":

Comece a partir do seu diretório repo, certifique-se de que sua cópia de trabalho está limpa (nenhum arquivo foi alterado, adicionado ou removido).


Faça uma nova filial:

git checkout -b <my-branch>

Adicione o controle remoto secundário e busque-o:

git remote add <repo-name> [email protected]:xxx/<repo-name>.git
git remote update

Mesclar um de seus branches em seu branch atual:

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


Se você não sabe o que <their-branch>quer, vá paramaster

Se você tem certeza de que deseja aceitar todas as alterações remotas e evitar conflitos ( sobrescrever o seu ), você pode especificar -X theirscomo opção git mergena última etapa.

Se você deseja adicioná-lo em um subdiretório, então provavelmente você deve usar submódulos git

vinzdef
fonte
3

Usando o guia de larsks, consegui fazer isso usando o SourceTree.

  1. Criou um branch no repositório de destino
  2. Adicionado o repositório de origem como um remoto, clicando no botão Configurações e adicionando o repositório de origem.
  3. Ramificações de ambos os repositórios agora são mostradas na lista de ramificações. Usei a ferramenta de mesclagem para mesclar um branch do repositório de origem com o branch do meu novo repositório de destino.
  4. Resolvido quaisquer conflitos usando SourceTree ou meu IDE
  5. Comprometa as mudanças em meu ramo.
  6. Remova o repositório de origem da lista remota, usando o botão Configurações.
TheBigSot
fonte