12
votes

Fusionner deux référentiels git pour obtenir une histoire linéaire

J'ai deux référentiels git et beaucoup de changements non traqués entre eux:

         D---E---F--         
                    \
A--B--C--D'--E'--F'--M 


3 commentaires

Pourquoi ne pas simplement tirer du référentiel git où vous êtes sur le fait que vous êtes sur c?


Donc, le "commet" C et D sur FTP ne s'engage pas vraiment dans Git, sauf où ils apparaissent sous Old / Master et New / Master? Et comment la nouvelle / maître a-t-elle été créée? git init dans une copie de ce qui était dans FTP?


@ Andyg0808 Oui, "Nouveau" est créé en exécutant Git init dans une copie fraîche du contenu FTP. Un oui, FTP n'est pas une succursale GIT, c'est une ancienne FTP plaine.


4 Réponses :


1
votes

si ftp code> n'est pas une branche appropriée et juste un travail de pâte de copie, Cela peut fonctionner Pour vous

cd git
git rm -r .
cp -r ../ftp/. .
git add
git commit


0 commentaires

4
votes

Découvrez simplement votre succursale et exécutez:

  git reset --hard **SHA-OF-F'**


0 commentaires

0
votes

Eh bien, je ne suis pas sûr quel est le problème exact. Mais ce que je ferais, c'est de supprimer une branche qui contient la copie. Ceux qui commettent ne sont pas nécessaires et vont probablement disparaître avec la branche étant supprimée. Si elles sont doublées dans le même arbre, vous pouvez toujours utiliser git rebase à vos risques et périls.

faire quelque chose comme xxx

ouvrira Un éditeur avec des choses que vous pouvez faire. Si vous supprimez une ligne avec un commit, il le supprimera de l'arborescence, vous pouvez vous mettre de côté de l'arbre, etc. Si vous enregistrez un fichier vide, cela ne fera rien.

qui dit, gardez à l'esprit Après avoir effectué une telle rebase, la branche principale ne sera pas avancée rapide et vous devrez remplacer la branche principale sur le serveur. En forçant une poussée. En autre mot, assurez-vous que la Rebase a eu raison et qu'après avoir poussé la nouvelle branche, tout le monde sera synchronisé sur cette branche. Si quelqu'un avait un maître et essayez de pousser et il échoue, cela pourrait aggraver les choses.

Git Rebase est tout comme réjouir l'historique de validation. Supprimer un commit est plus comme sauter un changement. Si vous ignorez un commit qui est doublé, il n'aurai aucun effet. Mais chaque commit aura un shasum différent et cela signifie également que la branche se diverse du maître d'origine.

Dans tous les cas, avant de faire quelque chose, sauvegardez le SHA1 du maître, puis si quelque chose ne va pas, vous pouvez toujours consulter le maître vers le COMMIS, tant qu'il n'y a pas de poubelle.

Suppression de l'autre branche serait l'idée la plus intelligente et que chaque branche provenant de ce maître empêchera les doubles. Rebasing devrait être évité à moins que vous ne l'iez vraiment pas.


0 commentaires

6
votes

Fixation des résultats de Filtre-filtre git Code>

Si vous avez un référentiel qui ressemble à ceci: p> xxx pré>

et vous voulez le Résultat pour ressembler à ceci: p> xxx pré>

alors vous pouvez simplement forcer maître code> à pointer vers f ' code>: p >

A--B--C--D'--E'--F' <-master


3 commentaires

Wow! C'est une réponse avancée et excellente. Cela fonctionnait beaucoup mieux que le Stackoverflow.com/Questtions/18270041/... (ce qui pourrait être un duplicata)


Génial. Une chose mineure: le choix de la cerise change le créateur du commit, donc par exemple sur github, il montre alors créateur original engagé avec vous


Probablement d = $ (git Rev-list neuf / maître | Tail -N 1) est plus facile que d'abord inversé et prenant le premier SHA.