sourcecode

다운스트림과 업스트림의 정의

copyscript 2023. 4. 14. 22:00
반응형

다운스트림과 업스트림의 정의

저는 Git을 가지고 놀기 시작했고, "업스트림"과 "다운스트림"이라는 용어를 접하게 되었습니다.나는 이것들을 전에 본 적은 있지만 완전히 이해하지는 못했다.SCM(Software Configuration Management Tool)과 소스 코드의 맥락에서 이러한 용어는 무엇을 의미합니까?

소스 제어의 경우 저장소에서 복사(클론, 체크아웃 등)할 때 다운스트림 상태가 됩니다.정보가 '하류'로 흘러들어갔습니다.

변경을 할 때는 보통 "업스트림"으로 되돌려 보내서 같은 소스에서 가져온 모든 사용자가 동일한 변경으로 작업할 수 있도록 저장소로 만듭니다.이것은 소스 제어의 기술적 요건이라기보다는 모든 사람이 자신의 작업을 어떻게 조정할 수 있는지에 대한 사회적 문제입니다.메인 프로젝트에 변경을 가하고 싶기 때문에 다른 개발 라인을 추적하지 않습니다.

패키지 또는 릴리스 매니저(툴이 아닌 담당자)에 대해 "업스트림"에 변경 내용을 제출하는 것에 대해 이야기하는 경우가 있습니다.이것은 통상, 시스템의 패키지를 작성할 수 있도록, 원래의 소스를 조정할 필요가 있는 것을 의미합니다.이러한 변경을 계속하고 싶지 않기 때문에 원래 소스에 "업스트림"으로 전송하면 다음 릴리스에서도 동일한 문제를 처리할 필요가 없습니다.

man 페이지를 읽을 때:

git의 한 가지 중요한 측면은 그것이 분산된다는 것이고, 분산된다는 것은 시스템에 내재된 "업스트림"이나 "다운스트림"이 없다는 것을 의미한다.

이는 단순히 절대 업스트림 repo 또는 다운스트림 repo가
없음
의미합니다.
이러한 개념은 항상 두 저장소 간에 상대적이며 데이터 흐름 방식에 따라 달라집니다.

yourRepo」가 「otherRepo」를 리모트로서 선언하고 있는 경우는, 다음과 같이 합니다.

  • 업스트림 'otherRepo'에서 꺼냅니다('otherRepo'는 '당신의 업스트림', 'otherRepo의 다운스트림').
  • 업스트림에 푸시하고 있습니다('otherRepo'는 아직 '업스트림'이며, 여기서 정보가 반환됩니다).

"from"과 "for"는 단순히 "downstream"이 아니라 "downstream from/for"이기 때문에 상대적인 측면에 주목하십시오.


DVCS(Distributed Version Control System)의 반전은 선언한 리모트저장소와 관련된 자신의 repo 이외에 실제로 다운스트림이란 무엇인지 모른다는 것입니다.

  • 업스트림(pull 또는 pushing처의 저장소)이 무엇인지 알고 있습니다.
  • 다운스트림은 무엇으로 구성되어 있는지 알 수 없습니다(다른 저장소는 당신의 리포트에서 끌어오거나 밀어넣습니다).

기본적으로:

"데이터 흐름"이란 업스트림 저장소("pull from")에서 업스트림 저장소("push to")로 되돌아가는 흐름의 하단("다운스트림")에 있는 것입니다.


man 페이지에서 RECOVERING FROM UPTREAM REBASE 단락을 볼 수 있습니다.

즉, 기본 재설정이 이루어진 '업스트림' repo에서 가져오고 있으며, 그 결과('다운스트림' repo')가 발생하는 것을 의미합니다(브런치 rebased upstream이 로컬로 가지고 있는 것과 같은 브랜치의 커밋을 다시 작성했기 때문에 중복 커밋이 많이 발생하고 있습니다).

이는 하나의 "업스트림" repo에 대해 많은 다운스트림 저장소(즉, 업스트림 저장소로부터 끌어오는 저장소, rebased 브랜치)가 있을 수 있으며, 이들 모두 중복된 커밋을 처리할 가능성이 있기 때문입니다.

DVCS에서는 "데이터 흐름"을 유추하면 "업스트림" 명령어 하나가 다운스트림에 "파급 효과"를 가져올 수 있습니다.


의:: 이이이이이데데데데데데데않않않않않않.
이것은 또한 파라미터에도 적용되는데, git 명령어가 ("포셀레인" 명령과 같은) 내부적으로 다른 git 명령어를 호출하기 때문이다.man 페이지 참조:

대시 ' chanisish'로 ).-및가 되는 ')에 git rev-list는 내부적으로 사용하는 명령어이며, 다운스트림에서 사용하는 기타 명령어에는 플래그와 파라미터가 사용됩니다.이 명령어는 이러한 명령어를 구별하기 위해 사용됩니다.

업스트림(관련) 트래킹

업스트림이라는 용어는 특히 트래킹과 관련된 GIT 툴 스위트에서도 명확한 의미를 갖는다.

예를 들어 다음과 같습니다.

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

는 현재 작업 중인 브랜치의 뒷부분(왼쪽)과 앞부분(오른쪽)의 커밋 수(이 로컬브런치의 현재 추적 중인 리모트브런치(있는 경우)를 기준으로 인쇄합니다.그렇지 않으면 다음과 같은 오류 메시지가 표시됩니다.

    >error: No upstream branch found for ''
  • 한 바와 같이 할 수 request를 발행하면 리모트가 .예를 들어 github에서 저장소를 분기한 후 '풀 요청'을 발행하면 적어도 두 개의 리모트가 있을 것입니다.origin) 및 (githubupstream기투브 레포이들은 서로 교환할 수 있는 이름일 뿐이며, 'git@...' URL에서만 식별됩니다.

의 ★★★★★★★★★★★★★★★★★..git/config읽습니다.

   [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
  • 한편 GIT에 대한 @{upstream}의 의미는 독특합니다.

해당 리모트」의 분기」(있는 경우)로, 「로컬 저장소의 「현재 분기를 추적하고 있습니다.

git fetch/git pull. , , , , , , , , , , , , , , , , , , , , .

예를 들어 리모트브런치 오리진/마스터를 체크아웃한 로컬 마스터브런치의 트래킹브런치로 설정합니다.문제만:

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

2개의 됩니다..git/config:

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

now try ('dev' 리모콘에 'dev' 브랜치가 있는 경우)

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

.git/config하다

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

git-push(1) 매뉴얼 페이지:

   -u
   --set-upstream

최신 브랜치 또는 정상적으로 푸시된 브랜치에 대해 인수 없는 git-pull(1) 및 기타 명령어로 사용되는 업스트림(추적) 참조를 추가합니다.자세한 내용은 git-config(1)를 참조하십시오.

git-config(1) 매뉴얼 페이지:

   branch.<name>.merge

지정된 브랜치의 업스트림브런치를 와 함께 정의합니다.이것은 git fetch/git pull/git rebase를 알려주고 git push에도 영향을 줄 수 있습니다(push.default 참조).\ (...)

   branch.<name>.remote

< name > 브랜치에서는 git fetch와 git push에 어떤 리모트로부터 취득/푸시할지를 지시합니다.리모트가 설정되어 있지 않은 경우는, 디폴트로 origin 이 됩니다.어느 브랜치에도 속하지 않는 경우에도 오리진은 사용됩니다.

업스트림 및 푸시(Gotcha)

매뉴얼 페이지를 보다

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

이는 아직 밀 준비가 되지 않은 나뭇가지에 실수로 밀리는 것을 방지하기 위한 것입니다.

그건 좀 비공식적인 용어네요.

Git에 관한 한 다른 모든 저장소는 리모트일 뿐이다.

일반적으로 업스트림은 (오리진)에서 복제한 장소입니다.다운스트림은 사용자의 작업을 다른 작업과 통합하는 프로젝트입니다.

Git 저장소로 제한되지 않습니다.

예를 들어 Ubuntu는 Debian 파생상품이므로 Debian은 Ubuntu의 업스트림에 있습니다.

유해하다고 불리는 업스트림

유감스럽게도, 여기 있는 다른 답변들은 접근하지 않는 "업스트림"의 또 다른 용도가 있다. 즉, 답변 내에서 커밋의 부모-자녀 관계를 언급하는 것이다.Pro Git의 Scott Chacon은 특히 이런 경향이 있으며, 결과는 유감입니다.이런 말투는 흉내 내지 마라.

예를 들어, 그는 합병에 대해 다음과 같이 말합니다. 이는 다음과 같은 이유로 발생합니다.

합병한 브런치가 지적한 커밋은 현재 커밋의 업스트림입니다.

「B」 「A」 「A」 「B」 ...의 외동 자녀 중 하나이므로 B를 A에 병합하려면 참조 A를 커밋 B를 가리키도록 이동하면 충분하다고 말합니다.이을 '가 , 이런 를 '업스트림'이라고 제멋대로일 git-merge이러다'''이러다'''이러다.차콘을 사용하다)

실제로 Chacon 자신은 나중에 삭제된 커밋의 모든 자작 커밋을 다시 쓰는 것에 대해 말할 때 "다운스트림"을 정확히 같은 의미로 사용하는 것으로 보인다.

Git 이력에서 이 파일을 완전히 제거하려면 6df76에서 다운스트림으로 모든 커밋을 다시 작성해야 합니다.

기본적으로 그는 시간의 경과에 따른 커밋의 역사를 언급할 때 "업스트림"과 "다운스트림"이 무엇을 의미하는지 명확하게 알지 못하는 것 같다.그렇다면 이 사용은 비공식적인 것이며 혼란스러울 뿐이므로 권장되지 않는다.

모든 약속(한 가지 제외)은 적어도 한 명의 부모를 가지고 있으며, 부모의 부모는 따라서 조상이고, 다른 방향으로, 약속에는 자녀와 후손이 있다는 것은 완전히 명백합니다.이것은 받아들여지고 있는 용어이며 그래프의 방향성을 명확하게 기술하고 있습니다.따라서 레포의 그래프 지오메트리 내에서 커밋이 서로 어떻게 관련되어 있는지를 기술하고 싶을 때 이 방법을 말하는 것입니다.이 상황에서 "업스트림" 또는 "다운스트림"을 느슨하게 사용하지 마십시오.

[추가사항:나는 내가 위에서 인용한 첫번째 샤콘 문장과 그 문장의 관계에 대해 생각해왔다.git-mergeman page, 그리고 전자가 후자에 대한 오해에서 비롯된 것일 수도 있다는 생각이 든다.man 페이지에는 '업스트림'의 사용이 정당한 상황이 기재되어 있습니다.고속 전송은 종종 "업스트림저장소를 추적하고 있으며 로컬 변경을 커밋하지 않았으며 새로운 업스트림리비전으로 갱신하고 싶다"고 되어 있습니다.그래서 아마도 Chacon은 여기 man페이지에서 그것을 봤기 때문에 "업스트림"을 사용했을 것이다.그러나 man 페이지에는 리모트저장소가 있습니다.Chacon이 인용한 패스트 포워딩 예에는 리모트저장소가 없습니다.로컬로 작성된 브랜치 몇 개뿐입니다.]

강을 유추하면, 우리는 상류로 거슬러 올라가는 자원을 따라갈 수 있다(하천이나 강의 수원지를 찾을 때까지.

강 유추로 말하자면, 하류는 강의 물이 흐르는 방향이다.내리막길.

그래서 내가 누군가의 프로젝트를 포기하면, 내가 포기한 프로젝트는 업스트림이다.그리고 내 포크는 하류에 있어.

만약 누군가가 내 포크 프로젝트를 한다면, 내 포크는 내 프로젝트의 포크보다 상류쪽이 될 것이다.

그리고 포크의 포크가 다운스트림으로 변합니다.

시간 예!

가정하다Project B로 갈라진 ★★★★★★★★★★▼Project A ★★★★★★★★★★★★★★★★★」Project C로 갈라진 ★★★★★★★★★★▼Project B.

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ는,Project A업업프프프로젝다다

Project B입니다.Project A.

Project B에 상대적인 업스트림프로젝트입니다Project C.

Project C입니다.Project B.

그리고 생명의 순환은 계속된다.

주의: 이것은 오픈소스 프로젝트에서 프로젝트의 포크를 작성하거나 버그를 수정하거나 기능을 추가하여 원래 프로젝트에 패치를 제출하는 비교적 일반적인 개발 스타일입니다.

또, 「품질 이동」과 통계 프로세스 제어로부터 얻을 수 있는 분명한 교훈은, 그 근원으로부터 품질 문제를 수정하는 개입이, 예방 가능한 문제를 수정하기 위한 반복 작업보다, 거의 항상 좋은 투자라는 것입니다..Pull requests를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/2739376/definition-of-downstream-and-upstream

반응형