Peut “git pull --tous les” mettre à jour tous mes branches locales?
J'ai souvent au moins 3 branches distantes: maître, de production et de transfert. J'ai 3 branches locales que de suivi de ces branches distantes.
La mise à jour de tous mes branches locales est fastidieux:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
J'aimerais être capable de faire un "git pull -tout", mais je n'ai pas été en mesure de l'obtenir pour fonctionner. Il semble faire un "fetch --tous", puis mises à jour (avance rapide ou de fusion) de la branche courante, mais pas les autres branches locales.
Je suis toujours bloqué de passer manuellement à chaque section locale et la mise à jour.
- Voulez-vous automatisé de mise à jour locale de suivi des branches seulement dans les fast-forward cas? Ypu devrait, parce fusion peut avoir conflicst vous avez à résoudre...
- Bien sûr, je serais heureux de s'installer pour avancer rapidement dans cas.
- En supposant un conservateur de 300 $dans le conseil de temps à perdre avec cela, ce seul problème est le coût de dollars aux entreprises 23,242,800 à l'aide d'un nombre de vues de 77,476. Maintenant d'examiner cette question stackoverflow.com/questions/179123/... et tous les autres. Wow.
- C'est aussi une bonne réponse stackoverflow.com/a/10312587/1254718
- Vous êtes la première personne que j'ai entendu dire combien de temps passé à essayer de faire git faire ce que nous voulons coûts des entreprises de l'argent. Ces choses simples devrait être automatique et doit être tellement simple que je n'ai pas à ouvrir un navigateur pour lire les forums, de l'OMI.
- Il y a près de ~9 fois plus de questions sur git sur DONC par rapport à la Mercurial, et la majorité des anciens semblent être "comment dois-je faire <opération simple> dans git?". Qui indique que git est soit mal conçu, mal documenté, pas intuitif, ou tous les trois.
- Je ne suis pas sûr de son coffre-fort pour le déclarer sans connaître les données démographiques de la SORTE. Si Mercurial n'est pas aussi couramment utilisé ici, ou si ses utilisateurs d'utiliser d'autres forums pour demander à ce sujet, je m'attends à voir le même résultat. 🙂 Il y a ~51 fois autant de questions sur Javascript par rapport à l'Assemblée - de sorte qu'il peut ne pas toujours être exactes pour juger des outils par ces types de mesures.
- Lol... Encore un autre exemple de Git en prenant une tâche simple, et rendant difficile.
- Je sais que c'est une vieille question, OP, mais envisagez-vous de l'onu-d'accepter la réponse de Jean et d'accepter un autre? L'on a accepté la réponse est d'opinions (et, par les commentaires, potentiellement dangereux) affirme à propos de tirer plutôt que de rebase qui n'ont rien à voir avec la question, et il recommande l'utilisation d'un logiciel qui n'est plus maintenu et, apparemment, ne fonctionne que sur Linux.
- merci de remarquer que
git-up
n'est plus maintenu. J'ai utilisé avec bonheur depuis de nombreuses années, mais pas plus. De toute façon je n'ai pas rencontré ce problème. Comme pour les autres réponses, aucun ne semble assez bon à accepter. Avez-vous un favori? - Je pense que jefromi est le plus utile. Le point clé est que le comportement de la fusion de toutes les branches locales nécessite une vérification eux individuellement; toute personne qui veut que ce comportement doit être conscient des risques de l'automatisation d'une vaste série de fusions. Les décisions de savoir si ça vaut le coup de faire l'automatisation et comment l'automatisation doit être fait (par exemple, devrait-il seulement de la fusion dans les fast-forward cas? Comment régler les conflits?) sera probablement spécifiques à l'individu de cas d'utilisation.
- Merci pour le changement!
- Meilleure réponse si vous avez de nombreuses branches:
rm -rf repo
puisgit clone
- Basé sur mon expérience personnelle, un gros problème est que les gens ne peuvent pas être pris la peine de lire la documentation avant d'être bloqués dans leur première mauvaise situation. Vous ne savez pas si vaillants efforts de création de "Git pour les Nuls" tutoriels (avec plus agréables noms) sont d'aucune aide dans ce domaine. Git au fond, est plutôt simple: un DAG de révisions, et trois arbres dans une caisse. Trouver la bonne combinaison de commande et les options de manipuler ces structures simples n'est pas aussi simple, malheureusement -- c'est là que le
git help
-->Google-->AFIN de pipeline entre en jeu. - Veuillez vous envisagez de github.com/changyuheng/git-fast-forward-all
Vous devez vous connecter pour publier un commentaire.
Le comportement que vous décrivez pour
pull --all
est exactement comme prévu, mais pas forcément utile. L'option est passée à git fetch, qui extrait toutes les références de toutes les télécommandes, au lieu d'un seul;pull
fusionne (ou dans votre cas, rebases) la seule branche.Si vous souhaitez consulter d'autres branches, vous allez avoir à le consulter. Et oui, la fusion (et complet) absolument exiger un arbre, de sorte qu'ils ne peuvent pas être fait sans vérifier les autres branches. Vous pouvez rassembler vos décrit les étapes à un script/alias si vous le souhaitez, mais je vous suggère de rejoindre les commandes avec
&&
de sorte que si l'un d'eux échoue, il ne sera pas essayer de labourer le.- Je utiliser le
sync
sous-commande de hub d'automatiser cela. J'aialias git=hub
dans mon.bash_profile
, de sorte que la commande que j'type:Cette mises à jour toutes les branches locales qui ont une correspondance en amont de la branche. À partir de la page de man:
Il gère également l'accrocher/unstashing les modifications non validées sur la branche courante.
J'ai l'habitude d'utiliser un outil similaire appelé git-up, mais il n'est plus maintenu, et
git sync
fait presque exactement la même chose.sudo gem install git-up
à la place. Aussi, vous pourriez avoir besoin d'Outils de Ligne de Commande installé. Voir stackoverflow.com/questions/7454361/...gem install git-up
git config --global git-up.rebase.auto false
.git push
de sorte qu'il agit uniquement sur la branche courante, au lieu de toutes les branches). Comme de Git 2.9,git pull --rebase --autostash
fait la même chose."Je sais que cette question est de presque 3 ans, mais je me suis posé la même question et n'a pas trouvé tout prêt de solution toute faite. Donc, j'ai créé une coutume commande git script shell mon auto.
Ici ça va, la
git-ffwd-update
script effectue les opérations suivantes...git remote update
pour aller chercher le lates régimegit remote show
pour obtenir une liste des succursales locales de la piste une branche distante (par exemple les agences qui peuvent être utilisés avecgit pull
)git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
combien d'engager la succursale locale est derrière la télécommande (à l'avance et vice versa)git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
le script peut être appelé comme:
Le script complet, doit être enregistré comme
git-ffwd-update
et doit être sur laPATH
.git branch
appel. J'ai enlevé l'option-l pour modifier l'appel engit branch -f $LB -t $ARB >/dev/null;
et maintenant, le script fonctionne comme il se doit.-l
là, qui répertorie les branches, n'est pas aucun sens. Merci de souligner ce point, je vais mettre à jour la réponse!Il n'est pas difficile à automatiser:
git rebase origin/$branch
àgit pull
, afin qu'il récupère le suivi approprié de la branche (sans doute sur l'origine) et de fusionner ou de rebase comme déterminé par la configuration.fetch
. Avez modifié; fonctionnalités supplémentaires/correctifs de ce que sont à l'OP.pull
(ou vérifierbranch.<branch>.rebase
), de sorte que vous n'avez pas accidentellement rebase une branche qui est mis en place pour tirer normalement (fusion).set -e
au lieu de|| exit 1
pour faire l'interprète de sortie sur la première erreur.Ce n'est toujours pas automatique, et que je souhaite qu'il y avait une option pour - et il devrait y avoir des contrôles pour s'assurer que cela ne peut se faire pour avancer rapidement les mises à jour (c'est pourquoi manuellement en faisant un pull est beaucoup plus sûr!!), mais les mises en garde de côté, vous pouvez:
pour mettre à jour la position de votre branche locale sans avoir à le vérifier.
Remarque: vous fera perdre votre actuelle direction de la position et de la déplacer à l'endroit où l'origine de la branche est, ce qui signifie que si vous avez besoin de fusionner, vous risquez de perdre des données!
git fetch origin other-branch:other-branch
Il y a beaucoup de réponses ici, mais aucun qui utilisent
git-fetch
pour mettre à jour les locaux ref directement, ce qui est beaucoup plus simple que de vérifier les branches, et plus sûr quegit-update-ref
.Ici, nous utilisons
git-fetch
de mise à jour non courants des branches et desgit pull --ff-only
pour la branche courante. C':et c'est ici:
À partir de la page de manuel pour
git-fetch
:En spécifiant
git fetch <remote> <ref>:<ref>
(sans+
) nous obtenons une extraction des mises à jour locales ref seulement quand il peut être en avance rapide.Note, ce qui suppose le local et à distance, les branches sont nommés de la même façon (et que vous souhaitez suivre toutes les branches), il faut vraiment utiliser les informations au sujet de laquelle des branches locales que vous avez et ce qu'ils sont mis en place pour suivre.
c*n
les étapes (au lieu de 1), oùc
est un certain nombre de commandes répétées etn
est le nombre de branches.git branch -r | grep -v ' -> ' | while read remotebranch
àgit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
de la limiter à des branches j'ai déjà localement. Aussi j'ai ajouté ungit fetch --prune
au début pour mettre à jour la liste des branches distantes avant de faire quoi que ce soit, ce qui évite de quelques mises en garde.Ce problème n'est pas résolu (encore), au moins pas facilement /sans script: voir ce post sur git liste de diffusion par Junio C Hamano expliquant la situation et de fournir d'appel pour une solution simple.
La majeure du raisonnement, c'est que vous ne devriez pas en avoir besoin:
L'appel pour une solution a été d'une option ou d'un script externe pour pruneau branches locales qui suivent maintenant à distance-suivi des branches, plutôt que de les garder à jour par l'avance rapide, comme l'original de l'affiche de la demande.
Remarque: de git 2.10 absence d'une telle solution existe. Notez que le
git remote prune
sous-commande, etgit fetch --prune
sont sur la suppression à distance de suivi de la succursale de la direction générale qui n'existe plus sur la télécommande, et non pas sur la suppression de la succursale locale qui assure le suivi à distance de suivi de branche (pour lequel la distance de suivi de la branche est en amont de la branche).Il y a beaucoup de réponses acceptables ici, mais certains de la plomberie peut être être un peu opaque pour les non-initiés. Voici un moyen beaucoup plus simple exemple qui peut facilement être personnalisé:
Si vous ajoutez
~/bin/git
à votrePATH
(en supposant que le fichier est~/bin/git/git-update-all
), il vous suffit d'exécuter:Ici est une bonne réponse: Comment récupérer toutes les branches git
git fetch
etgit pull
, au lieu de simplementgit pull
?origin/
préfixeAjouter ce script à
.profile
sur Mac OS X:Un script que j'ai écrit pour mon GitBash. Accomplit les tâches suivantes:
git checkout branch
git pull origin
** J'utilise ce mais ne l'ai pas testé à fond, de l'utiliser à vos propres risques. Voir un exemple de ce script dans un .bash_alias fichier ici.
Si vous êtes sur Windows, vous pouvez utiliser PyGitUp qui est un clone de
git-up
pour Python. Vous pouvez l'installer en utilisant pip avecpip install --user git-up
ou par l'intermédiaire de Scoop à l'aide descoop install git-up
[
Simplement poster une mise à jour de réponse.
git-up
n'est plus maintenu et si vous lisez la documentation, ils parler de la fonctionnalité est maintenant disponible dans git.Vous pouvez également définir pour chaque
git pull
de Git 2.9 ainsi (merci @VonC veuillez voir sa réponse ici)git-up
documentation parce qu'ils ne mentionnent pas quegit-up
.git-up
🙂Je suis tombé sur le même problème de cette question...
Vous demandez-vous à propos de moi-même, j'ai fait une petite fonction alias à l'intérieur de mon
.bashrc
fichier:A fonctionné pour moi (:
Si refs/heads/master peut être rapidement acheminés vers refs/remotes/foo/master, la sortie de
doit retourner le SHA1 id refs/heads/master points. Avec cela, vous pouvez mettre en place un script qui met à jour automatiquement toutes les branches locales qui n'ont pas eu de détourner s'engage à eux.
Ce petit script shell (je l'ai appelé git-peut-ff) illustre la façon dont il peut être fait.
Pour compléter la réponse de Matt Connolly, c'est un moyen plus sûr de mettre à jour la branche locale de références qui peuvent être rapidement transmis, sans vérifier la branche. Il ne met pas à jour les branches qui ne peuvent pas être en avance rapide (c'est à dire qui ont divergé), et il n'a pas de mise à jour de la branche qui est en cours d'extraction (car alors la copie de travail devrait être mis à jour).
Légèrement différente de script uniquement pour avancer rapidement les branches dont le nom correspond à leur amont de la branche. Il met également à jour la branche courante si rapide est possible.
Assurez-vous que tous vos branches en amont, les branches sont définies correctement en exécutant
git branch -vv
. Définir en amont de la direction, avecgit branch -u origin/yourbanchname
Copier-coller dans un fichier et la commande chmod 755:
Le script de @larsmans, un peu améliorée:
Ce, après avoir fini, les feuilles de la copie de travail à partir de la même branche comme il était avant que le script a été appelé.
La
git pull
version:Il ressemble à beaucoup d'autres ont contribué à des solutions, mais je pensais que je voudrais partager ce que j'ai trouvé et inviter d'autres personnes à contribuer. Cette solution est colorée belle sortie, gracieusement les poignées de votre répertoire de travail courant, et est rapide car il ne fait pas des caisses, et laisse votre répertoire de travail dans le tact. Aussi, il est juste un script shell avec pas de dépendance, autres que git. (testé uniquement sur OSX jusqu'à présent)
https://github.com/davestimpert/gitup
Désolé j'semblent également venir avec le même nom que l'autre outil ci-dessus.
Il peut être fait en utilisant le script ci-dessous... Il va d'abord récupérer toutes les branches et de départ, un par un, et mise à jour par lui-même.
La suite de one-liner pour avancer rapidement toutes les branches qui ont en amont de la branche, si possible, et imprime une erreur dans le cas contraire:
Comment ça fonctionne?
Il utilise un format personnalisé avec le
git branch
de commande. Pour chaque branche il y a un amont de la branche, il affiche une ligne avec le motif suivant:Ce peut être joué directement dans
sh
(en supposant que les noms de branche sont bien formées). Omettre le| sh
pour voir ce qu'il fait.Mises en garde
Le one-liner sera pas en contact avec vos télécommandes. Question un
git fetch
ougit fetch --all
avant de l'exécuter.Actuellement extrait de la branche ne sera pas mis à jour avec un message comme
Pour cela, vous pouvez recourir à la régulière
git pull --ff-only
.Alias
Ajouter les éléments suivants à votre
.gitconfig
de sorte quegit fft
exécute cette commande:Voir aussi mes
.gitconfig
. L'alias est une abréviation pour "fast-forward de suivi (branches)".hub
soluction propsed par @John pour c'est mieux sortie.Non, il ne le peut pas. Pour l'avance rapide, j'ai juste écrit un petit outil pour le faire. https://github.com/changyuheng/git-fast-forward-all
Des avantages de cet outil:
hub sync
ne prend pas en charge plusieurs télécommandes pour le moment.)De git 2.9:
git pull --rebase --autostash
Voir https://git-scm.com/docs/git-rebase
En fait, avec git
version 1.8.3.1
, il travaille:Dans la branche principale, vous pouvez mettre à jour toutes les autres branches. @Cascabel
Je ne sais pas quelle version break/fix it, dans 2.17(que j'utilise), il peut travailler.