888 votes

Définition de "en aval" et "en amont"

J'ai commencé à jouer avec Git et j'ai rencontré les termes «en amont» et «en aval». J'ai déjà vu ça mais je ne les comprends jamais complètement. Que signifient ces termes dans le contexte des GCL et du code source?

685voto

brian d foy Points 71781

En termes de contrôle de code source, vous êtes en aval lorsque vous copie (clone, paiement, etc) à partir d'un référentiel. Information circulait "en aval" pour vous.

Lorsque vous apportez des modifications, vous souhaitez généralement de les envoyer de nouveau "en amont" de sorte qu'ils font dans ce référentiel afin que tout le monde en tirant à partir de la même source, est de travailler avec les mêmes modifications. C'est surtout une question sociale de la façon dont tout le monde peut coordonner leur travail plutôt que d'une exigence technique de contrôle de code source. Vous voulez obtenir vos modifications dans le projet principal de sorte que vous n'êtes pas le suivi des lignes de développement parallèles.

Parfois vous lirez des paquets ou des responsables de la publication (le peuple, pas l'outil) en parlant de présenter des modifications à la "en amont". Cela signifie généralement qu'ils avaient à régler les sources d'origine de sorte qu'ils pourraient créer un package pour leur système. Ils ne veulent pas continuer à faire ces changements, donc si ils les envoient "en amont" de la source d'origine, ils ne devraient pas avoir à traiter avec le même problème dans la prochaine version.

241voto

VonC Points 414372

Lorsque vous lisez git tag page de man:

Un aspect important de git est qu'il est distribué, et distribué largement signifie qu'il n'est pas inhérent "en amont" ou "en aval" dans le système.

simplement n'y a pas d' absolu en amont repo ou en aval des pensions.
Ces notions sont toujours relative entre deux repos et dépend de la façon dont les flux de données:


Si "yourRepo" a déclaré que la "otherRepo" comme une seule télécommande, puis:

  • vous êtes en tirant à partir de l'amont "otherRepo" ("otherRepo" est "en amont", et que vous êtes "en aval pour otherRepo").
  • vous êtes en poussant vers l'amont ("otherRepo" est toujours "en amont", où l'information remonte maintenant).

Note le "de" et "pour": vous n'êtes pas seulement "en aval", vous êtes "en aval à partir de/pour l'", d'où l'aspect relatif.


Le DVCS twist est: vous n'avez aucune idée de ce que l'aval est en fait, à côté de votre propre repo par rapport à la distance repos que vous avez déclaré.

  • vous savez ce que l'amont est (le repos vous tirer ou pousser)
  • vous ne savez pas quoi en aval est faite de (l'autre repos tirer ou à pousser pour votre repo).

En gros:

En terme de "flux de données", votre pension est en bas ("en aval") d'un flux venant de l'amont pensions de titres ("extraire") et de revenir à (la même ou une autre) en amont de pensions de titres ("push").


Vous pouvez voir une illustration dans l' git-rebase page de man avec le paragraphe "la RÉCUPÉRATION DE l'AMONT REBASE":

Cela signifie que vous êtes en tirant à partir d'un "en amont" repo où un rebase a eu lieu, et vous (le "aval" repo) est coincé avec la conséquence (beaucoup de doublons s'engage, car la branche relocalisée en amont recréé l'engage de la même direction générale, vous avez en local).

Ce qui est mauvais, parce que pour un "en amont" repo, il peut y avoir de nombreux aval de pensions de titres (repos c'est à dire en tirant à partir de l'amont, avec la relocalisée direction de), chacun d'eux ayant potentiellement à traiter avec le double s'engage.

Encore une fois, avec le "flux de données" analogie, dans un DVCS, une mauvaise commande "en amont" peut avoir un "effet d'entraînement" en aval.


Remarque: ce n'est pas limité aux données.
Elle s'applique également aux paramètres, comme les commandes git (comme la "porcelaine") souvent appel à l'interne d'autres commandes git (la "plomberie"). Voir rev-parse page de man:

De nombreux git porcelainish commandes mélange de drapeaux (c'est à dire les paramètres qui commencent par un tiret '-') et de paramètres destinés à la sous-jacentes git rev-list commande qu'ils utilisent en interne et des drapeaux et des paramètres pour les autres commandes qu'ils utilisent en aval de l' git rev-list. Cette commande est utilisée pour distinguer entre eux.

84voto

Peter Host Points 656

En amont (liés au Suivi du

Le terme en amont a également un certain sens univoque qui vient à la suite de GIT outils, surtout par rapport à suivi

Par exemple :

   $git rev-list --count --left-right "@{upstream}"...HEAD
   >4   12

imprime (la dernière valeur mise en cache de) le nombre de commits derrière (à gauche) et à venir (à droite) de votre branche courante, par rapport à l' (lecas échéant) actuellement suivi à distance de la branche pour cette branche locale. Il affichera un message d'erreur sinon:

    >error: No upstream branch found for ''
  • Comme cela a déjà été dit, vous pouvez avoir n'importe quel nombre de télécommandes pour un dépôt local, par exemple, si vous fourche d'un référentiel à partir de github, alors question d'un "pull request", vous avez très certainement avoir au moins deux: origin (votre fourche repo github) et upstream (le repo github vous forké). Ce sont juste des noms interchangeables, seuls les " git@...' url identifie.

Votre .git/configlit :

   [remote "origin"]
       fetch = +refs/heads/*:refs/remotes/origin/*
       url = git@github.com:myusername/reponame.git
   [remote "upstream"]
       fetch = +refs/heads/*:refs/remotes/upstream/*
       url = git@github.com:authorname/reponame.git
  • D'autre part, @{en amont}'s de sens pour GIT est unique :

c'est la "branche" (le cas échéant) sur ", a déclaré à distance", qui est suivi de la 'branche' dans votre local repository".

C'est la branche que vous fetch/tirer à partir d'lors de l'émission d'une plaine git fetch/git pull, sans arguments.

Disons souhaitez définir la distance de la branche origin/master pour être le suivi de la direction générale de la locale de la branche principale, vous avez consultés. Seulement problème :

   $ git branch --set-upstream  master origin/master
   > Branch master set up to track remote branch master from origin.

Cela ajoute 2 paramètres en .git/config :

   [branch "master"]
       remote = origin
       merge = refs/heads/master

maintenant, essayez (fourni "en amont" à distance a une branche dev:)

   $ git branch --set-upstream  master upstream/dev
   > Branch master set up to track remote branch dev from upstream.

.git/config lit maintenant:

   [branch "master"]
       remote = upstream
       merge = refs/heads/dev

git-push(1) Page De Manuel :

   -u
   --set-upstream

Pour chaque branche, qui est jusqu'à ce jour ou réussi, ajouter en amont (suivi) référence, utilisé par l'argument de moins git pull(1) et d'autres commandes. Pour plus d'informations, reportez - branch.<name>.merge dans git-config(1).

git-config(1) Page De Manuel :

   branch.<name>.merge

Définit, en collaboration avec branch.<name>.remote, en amont de la branche de la branche donnée. Il indique à git fetch/git pull/git rebase de la branche de fusionner et peut également affecter la commande git push (voir pousser.valeur par défaut). \ (...)

   branch.<name>.remote

Lorsque dans la branche < nom >, il indique à git fetch et git push qui distance pour aller chercher de pousser à. La valeur par défaut d'origine si aucune télécommande est configurée. l'origine est également utilisé si vous n'êtes pas sur n'importe quelle branche.

En amont et de la pression (Gotcha)

jetez un oeil à l' git-config(1) Page de Manuel

   git config --global push.default upstream
   git config --global push.default tracking  (deprecated)

C'est pour empêcher l'activation accidentelle de la pousse de branches que vous n'êtes pas prêt à pousser encore.

55voto

hasenj Points 36139

C'est un peu de terminologie informelle.

En ce qui concerne git, tous les autres dépôts sont simplement distants.

En règle générale, en amont est l'endroit où vous avez cloné (l'origine). en aval est tout projet qui intègre votre travail avec d'autres œuvres.

Les termes ne sont pas limités aux dépôts git.

Par exemple, ubuntu est un dérivé de debian, donc debian est en amont pour ubuntu.

51voto

matt Points 60113

En Amont Appelé Nuisibles

Il y a, hélas, une autre utilisation de "en amont" que les autres réponses ne sont pas ici, à savoir, reportez-vous à la relation parent-enfant de s'engage dans une pension de titres. Scott Chacon dans le Pro Git livre est particulièrement sensible à cela, et les résultats sont malheureux. Ne pas imiter cette façon de parler.

Par exemple, dit-il d'une opération de fusion, ce qui entraîne une rapide avant que cela arrive parce que

la validation pointé par la direction générale vous fusionnées en a été directement en amont de la livraison, vous êtes sur

Il veut dire que commettre B est le seul enfant de la seule enfant de la ... de la seule enfant de commettre Une, sorte de fusion de B en A, il suffit de déplacer le ref d'Un point de commettre B. Pourquoi cette direction devrait être appelé "en amont" plutôt que "en aval", ou pourquoi la géométrie de ces une pure ligne droite, le graphique doit être décrite "directement en amont", est tout à fait clair et probablement arbitraire. (La page de man pour git-merge fait un bien meilleur travail d'expliquer cette relation lorsqu'il affirme que "l'actuel chef de la direction générale, est l'ancêtre de la commettre." C'est le genre de chose Chacon devraient avoir dit.)

En effet, Chacon lui-même apparaît à utiliser "en aval" plus tard pour dire exactement la même chose, quand il parle de réécriture de l'enfant commet un supprimée commettre:

Vous devez réécrire tous les commits en aval de 6df76 pour supprimer complètement ce fichier à partir de votre historique de Git

Fondamentalement, il semble ne pas avoir d'idée claire de ce qu'il entend par "en amont" et "aval" en se référant à l'histoire de l'engage plus de temps. Cette utilisation est informelle, puis, et de ne pas être encouragé, car il est juste confus.

Il est parfaitement clair que chaque commit (sauf un) a au moins un parent, et que les parents de parents sont donc les ancêtres; et dans l'autre sens, s'engage à avoir des enfants et descendants. C'est accepté de terminologie, et décrit la directionnalité du graphe sans ambiguïté, de sorte que la façon de parler quand vous voulez pour décrire la façon dont s'engage se rapportent à un autre dans le graphique de la géométrie d'une mise en pension. Ne pas utiliser "en amont" ou "en aval", lâche dans cette situation.

[Note supplémentaire: j'ai pensé à propos de la relation entre le premier Chacon phrase que je cite ci-dessus et l' git-merge page de man, et il me semble que la première peut être basé sur une incompréhension de ce dernier. La page de man ne décrivent une situation où l'utilisation de "en amont" est légitime: l'avance rapide est souvent le cas quand "vous êtes suivi amont d'un référentiel, vous avez commis aucun changements locaux, et maintenant, vous souhaitez mettre à jour vers une version plus récente en amont de la révision." Alors peut-être Chacon utilisé "en amont", parce qu'il a vu ici dans la page de man. Mais dans la page de man il y a un dépôt distant; il n'y a pas de dépôt distant dans Chacon du a cité l'exemple de l'avance rapide, juste un couple de créés localement branches.]

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