git: synchronisation Local repo avec remote one
j'ai des dépôts git locaux et distants. Je veux synchroniser mon dépôt local avec dépôt distant pour que mon dépôt local devient 100% copie de dépôt distant. Ce qui signifie que si certains fichiers sont différents dans ces repos nous remplacer locaux avec télécommande. Et s'il y a des fichiers dans les repos locaux qui n'existent pas dans les repos à distance, les fichiers locaux sont supprimés.
Est-il un moyen autre que de faire une nouvelle clone de distance repo?
la même question Sync repo git local avec télécommande d'un seul coup de jeter les modifications locales/s'engage .
8 réponses
git fetch --prune
- p, --prune
Après la récupération, supprimez toutes les branches de suivi à distance qui n'existent plus sur la télécommande. prune "options de 151960920"
vous devez comprendre qu'un dépôt Git n'est pas seulement un arbre de répertoires et de fichiers, mais conserve aussi une histoire de ces arbres - qui peuvent contenir des branches et des fusions.
lors de la récupération d'un dépôt, vous copiez la totalité ou une partie des branches qui s'y trouvent dans votre dépôt. Ceux-ci sont alors dans votre dépôt en tant que "branches de suivi à distance", par exemple les branches nommées comme remotes/origin/master
ou tel.
recherche de nouvelles propagations à partir de la télécommande le dépôt ne changera rien à votre copie de travail locale.
votre copie de travail a normalement une propagation vérifiée, appelée HEAD
. Ce commit est généralement la pointe d'une de vos branches locales.
je pense que vous voulez mettre à jour votre branche locale (ou peut-être toutes les branches locales?) à la branche distante correspondante, puis vérifier la dernière branche.
pour éviter tout conflit avec votre copie de travail (qui pourrait avoir des modifications locales), vous nettoyez d'abord tout ce qui n'est pas versionné (en utilisant git clean
). Puis vous découvrez la section locale correspondant à la distance que vous souhaitez mettre à jour et d'utilisation git reset
pour passer à la prochaine branche distante. ( git pull
incorporera toutes les mises à jour de la branche distante dans votre locale, qui pourrait faire la même chose, ou créer une commit de fusion si vous avez des commits locaux.)
(mais alors vous perdrez vraiment tous les changements locaux - à la fois dans la copie de travail locale et s'engage. Assurez-vous que vous voulez vraiment cela - sinon mieux utiliser une nouvelle branche, il enregistre vos modifications locales. Et utilisez git stash
pour enregistrer les changements qui ne sont pas encore engagés.)
modifier: Si vous avez une seule branche locale et sont suivi une branche distante, tout ce que vous devez faire est de
git pull
de l'intérieur du répertoire de travail.
This récupérera la version actuelle de toutes les branches distantes suivies et mettra à jour la branche actuelle (et le répertoire de travail) à la version actuelle de la branche distante qu'elle suit.
Ces étapes permettra de le faire:
git reset --hard HEAD
git clean -f -x -d -n
puis sans -n
cela s'occupera de tous les changements locaux. Maintenant le commet...
git status
et noter la ligne telle que:
Your branch is ahead of 'xxxx' by N commits.
prendre note du numéro "N" maintenant:
git reset --hard HEAD~N
git pull
et enfin:
git status
ne doit rien montrer à ajouter/commettre. Toutes les opérations de nettoyage.
cependant, un clone frais peut faire la même chose (mais est très lent).
===mise à Jour===
comme ma connaissance de git légèrement améliorée au fil du temps, je suis venu avec encore une autre façon plus simple de faire la même chose. Voici comment (#avec explication). Dans votre branche de travail:
git fetch # This updates 'remote' portion of local repo.
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.
bien que votre commits local et les changements disparaîtront de la vue après cela, il est possible de récupérer les changements engagés, si nécessaire.
Vous voulez faire
git fetch origin
git reset --hard origin/master
git clean -f -d
cela rend votre repo local exactement comme votre repo à distance.
n'oubliez pas de remplacer origin et master par la télécommande et la branche que vous voulez synchroniser.
sonne comme si vous vouliez un miroir du dépôt distant:
git clone --mirror url://to/remote.git local.git
Cette commande crée un dépôt nu. Si vous ne voulez pas un dépôt nu, les choses deviennent plus compliquées.
(Cette info est à partir de Le Git Manuel de l'Utilisateur )
j'apprends aussi, donc ce n'est peut-être pas exactement une réponse à la question, mais ça pourrait aider quelqu'un:
- lorsqu'un dépôt distant est initialement cloné, des copies de toutes les branches sont stockées dans votre dépôt local (regardez-les avec
git branch -r
) - pour mettre à jour ces copies et les mettre à jour (c'est-à-dire les synchroniser avec la télécommande branche) utiliser
git fetch
. Cela n'affectera aucune de vos branches existantes, créées sur mesure. - pour passer outre à votre caisse de branche locale une nouvelle version de la branche sur laquelle vous travaillez (en supposant que vous avez déjà exécuté
git add origin /path/to/repository
) utilisezgit checkout origin/branch_name
, cela va passer outre vos changements locaux sur la branchebranch_name
si vous parlez de synchroniser un repo Fourché alors vous pouvez suivre ces étapes.
Comment synchroniser une fourchette référentiel git
-
vérifiez votre branche git actuelle
git branch
-
caisse à maîtriser si vous n'êtes pas sur le master
git checkout master
-
Extraire le dépôt en amont si vous avez des droits d'accès corrects
git fetch upstream
-
si vous obtenez une erreur inférieure, Lancez
git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git
fatal: 'upstream/master' does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
-
exécutez maintenant la commande ci-dessous.
git fetch upstream
-
maintenant si vous êtes sur master alors fusionner l'amont / master en master branche
git merge upstream/master
C'est ça!!
Crosscheck via
git remote
commande, plus spécifiquegit remote -v
si j'ai aussi des droits de commit sur le repo amont, je peux créer une branche locale amont et faire du travail qui ira en amont là.
Vous pouvez utiliser git crochets pour que. Il suffit de créer un crochet qui pousse changé à l'autre repo après une mise à jour.
bien sûr, vous pouvez obtenir des conflits de fusion donc vous devez comprendre comment les traiter.