Définition de "aval" et "en amont"
j'ai commencé à jouer avec Git et je suis tombé sur 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 du SCMs ( Software Configuration Management tools) et du code source?
5 réponses
en termes de contrôle à la source, vous êtes " en aval " lorsque vous copiez (clone, checkout, etc) à partir d'un dépôt. L'Information vous a été transmise "en aval".
quand vous faites des changements, vous voulez généralement les renvoyer " en amont " alors ils le font dans ce dépôt de sorte que tout le monde tirant de la même source travaille avec tous les mêmes changements. Il s'agit essentiellement d'une question sociale sur la façon dont chacun peut coordonner son travail. plutôt qu'une exigence technique de contrôle à la source. Vous voulez apporter vos modifications au projet principal pour ne pas suivre des lignes de développement divergentes.
il arrive que vous lisiez à propos des gestionnaires de paquets ou de versions (les gens, pas l'outil) qui parlent de soumettre des modifications à"upstream". Cela signifie généralement qu'ils ont dû ajuster les sources originales afin qu'ils puissent créer un paquet 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.
quand vous lisez dans git tag
page de manuel :
l'un des aspects importants de la TIG est qu'elle est distribuée, et le fait qu'elle soit distribuée en grande partie signifie qu'il n'y a pas de" amont "ou de" aval " inhérent au système.
, que simplement signifie qu'il n'y a pas de absolu repo en amont ou en aval.
Ces notions sont toujours relatives. entre deux repos et dépend de la façon dont les données circulent:
si "yourRepo" a déclaré "otherRepo" comme un distant, alors :
- vous êtes tirant de l'amont "otherRepo" ("otherRepo" est "en amont à partir de vous", et que vous êtes "en aval pour otherRepo").
- vous êtes poussée à en amont ("otherRepo" est toujours "en amont", où l'information remonte maintenant).
Notez le" de "et" pour": vous n'êtes pas seulement" en aval", vous êtes "en aval de/pour ", d'où l'aspect relatif.
Le DVCS (Distributed Version Control System) 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 annoncé.
- vous savez ce que l'amont est (le repos vous tirer ou pousser)
- vous ne savez pas de quoi l'aval est fait (les autres repos tirant de ou poussant à votre repos ).
en gros:
en terme de " flux de données ", votre repo est au fond ("en aval") d'un flux venant de les prises en pension en amont ("pull from") et les prises en pension en amont (les mêmes ou d'autres) ("push to").
vous pouvez voir une illustration dans le git-rebase
page de manuel avec le paragraphe "récupérer de REBASE en amont":
cela signifie que vous êtes tirant d'un repo" en amont "où un rebase a eu lieu , et vous (le repo "en aval") 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).
c'est mauvais parce que pour un repo" en amont", il peut y avoir beaucoup les repos en aval (c'est-à-dire les repos tirant de l'amont, avec la branche rebasée), tous ayant potentiellement à faire avec le duplicate commits.
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.
Il 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
l'homme page :
beaucoup de commandes git porcelainish prennent mélange de drapeaux (i.e. les paramètres qui commencent par un tiret '
-
') et les paramètres destinés à la commande sous-jacentegit rev-list
qu'ils utilisent en interne et drapeaux et paramètres pour les autres commandes qu'ils utilisent en aval degit rev-list
. Cette commande est utilisée pour les distinguer.
le terme en amont a également un sens non ambigu en ce qui concerne la suite d'outils GIT, notamment par rapport à tracking
par exemple:
$git rev-list --count --left-right "@{upstream}"...HEAD >4 12
affichera (la dernière valeur en cache de) le nombre de commits Derrière (Gauche) et devant (droite) de votre branche de travail actuelle, par rapport à le ( s'il y a lieu ) suit actuellement la branche distante pour cette branche locale. Il affichera un message d'erreur sinon:
>error: No upstream branch found for ''
- comme il 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 bifurquez un dépôt de github, puis émettez une 'demande pull', vous avez certainement au moins deux:
origin
(votre réponse biaisée sur github) etupstream
(le repo github vous forké). Ce sont juste des noms interchangeables, seulement le "git"...'url identifie.
votre
.git/config
se lit:[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'un autre côté, @{en amont} 's signification for GIT is unique :
il est la branche (le cas échéant) sur dit "à distance" , qui est suivi de la 'branche' sur votre en local "repository" .
C'est la branche que vous récupérez/tirez à chaque fois que vous émettez un
git fetch
/git pull
, sans arguments.
disons que vous voulez définir la branche distante origine / master pour être la branche de suivi pour la branche master locale que vous avez extrait. Vient de sortir:
"1519230920 en Amont" et "Push" (Gotcha)$ git branch --set-upstream master origin/master > Branch master set up to track remote branch master from origin.
cela ajoute 2 Paramètres dans
.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
se lit maintenant:[branch "master"] remote = upstream merge = refs/heads/dev
-u --set-upstream
pour chaque branche mise à jour ou poussée avec succès, ajouter en amont (tracking) de référence, utilisé par la commande argument-less git-pull(1) et d'autres commandes. Pour en savoir plus, lisez
branch.<name>.merge
dans git-config(1).
git-config(1)
Page De Manuel :branch.<name>.merge
définit, avec
branch.<name>.remote
, la branche en amont pour la branche donnée. Il indique à git fetch/git pull / git rebase quelle branche fusionner et peut aussi affecter git push (Voir push.défaut.) \ (...)branch.<name>.remote
Lorsqu'il est dans la branche < nom >, il indique à git fetch et git push quelle télécommande aller chercher/push to. Il est par défaut à l'origine si non distant est configuré. l'origine est également utilisée si vous n'êtes pas sur une branche.
regardez git-config(1)
page de manuel
git config --global push.default upstream git config --global push.default tracking (deprecated)
ceci est pour prévenir les pousses accidentelles aux branches que vous n'êtes pas encore prêt à pousser.
c'est un peu de terminologie informelle.
en ce qui concerne Git, tous les autres dépôts ne sont qu'une télécommande.
en général, c'est en amont que vous clonez (l'origine). En aval est tout projet qui intègre votre travail avec d'autres travaux.
Les conditions ne sont pas limités à des dépôts Git.
par exemple, Ubuntu est un dérivé de Debian, donc Debian est en amont pour Ubuntu.
Amont Appelé Nocif
il y a, hélas, une autre utilisation de" en amont " que les autres réponses ici ne comprennent pas, à savoir faire référence à la relation parent-enfant des commits dans un repo. Scott Chacon dans le Pro Git book est particulièrement enclin à cela, et les résultats sont malheureux. Ne pas imiter cette façon de parler.
par exemple, il dit d'une fusion résultant un fast-forward que cela se produit parce que
l'engagement pointé par la branche dans laquelle vous avez fusionné était directement en amont de la propagation vous êtes sur
il veut dire que commit B est le seul enfant du seul enfant de ... du seul enfant de commit a, ainsi fusionner B en a il suffit de déplacer le ref A à point à commit B. pourquoi cette direction devrait être appelée "en amont" plutôt que "en aval", ou pourquoi la géométrie d'une telle droite pure graphique doit être décrit "directement en amont", est totalement imprécis et probablement arbitraire. (La page de manuel pour git-merge
fait un bien meilleur travail d'expliquer cette relation quand il dit que" le chef de branche actuel est un ancêtre du commit nommé."C'est le genre de chose que Chacon aurait dû dire.)
en effet, Chacon lui-même semble utiliser "downstream" plus tard pour signifier exactement la même chose, quand il parle de réécrire tous les enfants commet d'un commis supprimé:
vous devez réécrire toutes les propagations en aval de 6df76 pour supprimer complètement ce fichier de votre histoire Git
fondamentalement, il ne semble pas avoir une idée claire de ce qu'il entend par "en amont" et "en aval" en se référant à l'histoire des commits au fil du temps. Cette utilisation est donc informelle et ne doit pas être encouragée, car elle prête à confusion.
Il est parfaitement clair que chaque commit (sauf un) a au moins un parent, et que les parents des parents sont donc des ancêtres; et dans l'autre sens, les commit ont des enfants et des descendants. C'est la terminologie acceptée, et décrit la directionalité du graphe sans ambiguïté, donc c'est la façon de parler quand vous voulez décrire comment les commits se relient les uns aux autres dans la géométrie du graphe d'un repo. N'utilisez pas" en amont "ou" en aval " de façon lâche dans cette situation.
[note supplémentaire: j'ai pensé à la relation entre la première phrase de Chacon que je cite ci-dessus et la page de manuel git-merge
, et il me semble que la première peut être basée sur une mauvaise compréhension de la seconde. La page de manuel décrit une situation dans laquelle l'utilisation de "upstream" est légitime: le transfert rapide se produit souvent lorsque "vous suivez un dépôt en amont, vous n'avez engagé aucun changement local, et maintenant vous voulez mettre à jour vers une nouvelle révision en amont."Alors peut-être que Chacon a utilisé" en amont " parce qu'il l'a vu ici dans la page de man. Mais dans la page de manuel il y a un dépôt distant; il n'y a pas de dépôt distant dans L'exemple cité de transfert rapide de Chacon, juste quelques branches créées localement.]