49 votes

Comment sauvegarder des branches privées dans git

J'ai une succursale locale pour la journée-à-jour, les travaux de développement dans git. Mon travail est:

  1. Faire des trucs sur local_branch, s'engager
  2. Fetch origin/master
  3. Rebase local_branch de rattraper avec de nouvelles choses à partir d'origin/master

Tout fonctionne très bien, cependant, la plupart des recommandations que j'ai rencontrés disent qu'il ne faut pas "pousser" privé branches, sur lesquelles rebase est régulièrement effectuée.

Le problème ici est que, dans ce cas, la section locale n'est pas sauvegardé sur un serveur et la seule façon de sauver le travail est de fusionner la "états" de la branche (c'est à dire origin/master)

Quelles seraient vos recommandations sur le flux de travail dans ce cas?

Merci!

Mise à JOUR: j'ai réalisé que l'une des exigences d'origine, j'ai eu (en évitant l'utilisation des utilitaires externes) n'est pas nécessaire de limiter.

Ma solution actuelle est de stocker tous mes dépôts dans un nuage-synchronisé avec le dossier de cette façon, je reçois de sauvegarde gratuit.

51voto

Pat Notz Points 46841

J'ai utiliser l'option --miroir option et appuyer sur un référentiel de sauvegarde:

Ajoutez-la à distance:

git remote add bak server:/path/to/backup/repo

Faire la sauvegarde:

git push --mirror bak

Cela va automatiquement faire de votre référentiel de sauvegarde de ressembler à votre actif -- branches seront créés, supprimés, mise à jour (même forcé/non-fastforwards) en tant que de besoin. Vous pouvez faire un alias pour cela aussi:

git config alias.bak "push --mirror bak"

Alors, c'est juste une question de courir "git bak" lorsque vous voulez faire une sauvegarde. Vous pouvez également jeter cela dans une tâche cron.

6voto

felipec Points 3278

Il n'y a rien de mal à pousser des branches personnelles. Il est généralement déconseillé car les gens peuvent commencer à travailler en fonction de votre branche et lorsque vous rebasez, leurs modifications restent flottantes.

Ce que je fais, c'est utiliser un préfixe pour indiquer "ceci est ma branche, utilisez-le à vos risques et périls", comme: fc-general-cleanup .

5voto

Dan Moulding Points 46866

Une autre option serait de pousser "local_branch" à "l'origine" repo, mais à son propre service des pensions de titres (pas de "maître"), c'est à dire:

git push origin local_branch:local_backup

Puis, quand vous êtes prêt à effectuer la sauvegarde (et après que vous avez été faire un peu de travail et changement d'année de base) il suffit de supprimer la sauvegarde de la branche à partir de l'origine repo, avant de vous enfoncer de nouveau:

git push origin :local_backup <=== supprime la branche à partir de l'origine

git push origin local_branch:local_backup

De cette façon, vous ne rencontrerez pas de problèmes poussant "local_branch" après qu'il a été relocalisée à partir de "origin/master".

Et si la suppression de votre sauvegarde des branches qui vous rend nerveux (jusqu'à ce que vous avez finalement engagé votre travail de "maître"), vous pouvez toujours continuer à pousser à une nouvelle branche avec un nouveau nom (par exemple "local_backup1", "local_backup2", etc).

2voto

Dan Moulding Points 46866

Il n'y a rien de mal à pousser à la même branche que vous êtes à la relocalisation de. Ces diagrammes doivent illustrer pourquoi cela fonctionne très bien:

Disons que c'est ce que la validation graphique ressemble après vous avez ramifiée local_branch et fait une couple de s'engage à (C et D). Quelqu'un d'autre a fait un commit (E) origin/master puisque vous ramifiée local_branch:

A -- B -- E [origin/master]
\
 \ 
 \-- C -- D [local_branch]

Puis, après l'exécution de "git rebase origin/master", la validation graphique ressemblera le schéma suivant. "origin/master" est toujours le même, mais "local_branch" a été relocalisée:

A -- B -- E [origin/master]
\
\
 \-- C -- D [local_branch]

À ce stade, si vous n' "git push origin local_branch:master", alors il en résulte une simple avance rapide. "origin/master" et "local_branch" sera identique:

A -- B -- E -- C -- D [origin/master],[local_branch]

Maintenant, vous êtes libre de faire plus de travail sur "local_branch". Finalement, vous pourriez obtenir quelque chose comme ceci:

A -- B -- E -- C -- D -- G -- I [origin/master]
\
\
 \-- F -- H [local_branch]

Avis cela ressemble un peu comme le graphe de départ. Vous pouvez répéter ce processus à plusieurs reprises.

Vous devriez éviter de le pousser à quelque autre branche, celle que vous n'êtes pas rebasage de. C'est là que vous serez confronté à des problèmes (de l'autre branche, il ressemblera à votre "local_branch de" l'histoire a soudainement été ré-écrit, après avoir indexé à partir de "origin/master").

2voto

Cebjyre Points 3946

Pouvez-vous configurer un autre référentiel distant vers lequel vous envoyez toutes vos succursales? L'autre chose à considérer est simplement de sauvegarder tout (important) sur votre machine locale, y compris le dépôt git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X