로컬 지점, 로컬 추적 지점, 원격 지점 및 원격 추적 지점의 차이점은 무엇입니까?


158

방금 Git을 사용하기 시작했고 다른 지점들 사이에서 정말 혼란스러워졌습니다. 다음 지사 유형이 무엇인지 알아낼 수 있습니까?

  • 현지 지점
  • 지역 추적 지점
  • 원격 지점
  • 원격 추적 지점

그들 사이의 차이점은 무엇입니까? 그리고 그들은 어떻게 서로 협력합니까?

빠른 데모 코드가 실제로 도움이 될 것입니다.

답변:


123

지역 분기 만 (로컬 사용자)를 볼 수있는 지점입니다. 로컬 시스템에만 존재합니다.

git branch myNewBranch        # Create local branch named "myNewBranch"

원격 분기 (대부분의 경우 원격 위치에있는 지점이다 origin). 새로 만든 로컬 지점 myNewBranch을로 푸시 할 수 있습니다 origin. 이제 다른 사용자가이를 추적 할 수 있습니다.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

원격 추적 브랜치는 원격 지사의 로컬 복사본입니다. 위의 명령 myNewBranchorigin사용하여 푸시 하면 이름 origin/myNewBranch이 지정된 원격 추적 분기 가 컴퓨터에 생성됩니다. 이 원격 추적 분기는의 원격 분기 myNewBranch를 추적합니다 origin. 당신은 업데이트 할 수 있습니다 원격 추적 브랜치를 와 동기화 할 원격 지사는 사용 git fetch또는 git pull.

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

지역의 추적 지점 A는 현지 가지 다른 지점을 추적한다. 이것은 커밋을 다른 브랜치로 푸시 / 풀할 수 있도록하기위한 것입니다. 대부분의 경우 로컬 추적 분기는 원격 추적 분기를 추적합니다. 당신이 로컬 분기를 누르면 origin를 사용 git push command로모그래퍼 -u(위 그림 참조) 옵션, 로컬 지점을 설정 myNewBranch원격 추적 브랜치를 추적 origin/myNewBranch. 이것은 사용에 필요한 git pushgit pull에서에 푸시 상류 또는 풀을 지정하지 않고.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

로컬 추적 분기 정의의 경우 원격으로 푸시 한 후 로컬 분기와 동일하지 않습니까?
mskw

2
@mskw 아니요, 로컬 추적 분기와 로컬 (비 추적) 분기는 서로 다릅니다. 로컬 브랜치는 어떤 브랜치와도 관련이 없습니다. 단순히 로컬 시스템에 존재하는 지점입니다. 로컬 추적 분기는 원격 추적 분기와 연결되어 있습니다. 따라서 커밋을 서로 푸시 / 풀할 수 있습니다.
SNce

196

긴 대답은 다음과 같습니다.

리모컨 :

Git을 공동으로 사용하는 경우 커밋을 다른 컴퓨터 또는 위치와 동기화해야 할 수 있습니다. Git 용어로 각 머신 또는 위치를 remote 라고하며 각 머신 또는 위치는 하나 이상의 분기를 가질 수 있습니다. 대부분의 경우 이름이 하나만 origin있습니다. 모든 리모컨을 나열하려면 다음을 실행하십시오 git remote.

$ git remote
bitbucket
origin

다음을 실행하여 이러한 원격 이름이 바로 가기 위치를 확인할 수 있습니다 git remote -v.

$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)

각 리모컨에는 아래에 디렉토리가 있습니다 git/refs/remotes/.

$ ls -F .git/refs/remotes/
bitbucket/ origin/

컴퓨터의 지점 :

TLDR : 로컬 컴퓨터에는 로컬 비 추적 분기, 로컬 추적 분기 및 원격 추적 분기의 세 가지 유형의 분기가 있습니다. 원격 컴퓨터에는 한 가지 유형의 지점이 있습니다.

1. 지사

다음을 실행하여 머신의 모든 로컬 브랜치 목록을 볼 수 있습니다 git branch.

$ git branch
master
new-feature

각 로컬 지점에는 다음과 같은 파일이 있습니다 .git/refs/heads/.

$ ls -F .git/refs/heads/
master new-feature

머신에는 두 가지 유형의 로컬 브랜치가 있습니다 : 비 추적 로컬 브랜치 및 로컬 브랜치 추적.

1.1 비 추적 지역 지점

비 추적 로컬 브랜치는 다른 브랜치와 연결되지 않습니다. 을 실행하여 하나를 만듭니다 git branch <branchname>.

1.2. 현지 지점 추적

로컬 지점 추적은 다른 지점 (일반적으로 원격 추적 지점)과 연결됩니다. 을 실행하여 하나를 만듭니다 git branch --track <branchname> [<start-point>].

다음을 사용하여 로컬 지점 중 어느 지점을 추적하는지 확인할 수 있습니다 git branch -vv.

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

이 명령의 출력에서 ​​로컬 분기 master가 원격 추적 분기를 추적 origin/master하고 있고 로컬 분기 new-feature가 아무것도 추적하지 않는 것을 볼 수 있습니다.

분기를 추적하는 분기를 확인하는 다른 방법은을 살펴 보는 것 .git/config입니다.

현지 지점을 추적하는 것이 유용합니다. 그들은 당신이 실행할 수 있도록 git pull하고 git push사용하는 상류 분기를 지정하지 않고. 지점이 다른 지점을 추적하도록 설정되어 있지 않으면 다음과 같은 오류가 발생합니다.

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. 원격 추적 지점 (여전히 컴퓨터에 있음)

다음을 실행하여 컴퓨터의 모든 원격 추적 분기 목록을 볼 수 있습니다 git branch -r.

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

각 원격 추적 지점에는 다음과 같은 파일이 있습니다 .git/refs/<remote>/.

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

원격 추적 분기를 원격 시스템에 포함 된 로컬 캐시로 생각하십시오. 뒤에서 사용 git fetch하는을 git pull사용 하여 원격 추적 분기를 업데이트 할 수 있습니다 .

원격 추적 브랜치의 모든 데이터가 캐시와 같은 컴퓨터에 로컬로 저장되어 있어도 로컬 브랜치는 호출되지 않습니다. (적어도, 나는 그것을 부르지 않을 것입니다!) 그것은 단지 원격 추적 지점이라고 불립니다.

원격 시스템의 지점 :

다음을 실행하여 모든 원격 분기 (즉, 원격 시스템의 분기)를 볼 수 있습니다 git remote show <remote>.

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:Flimm/example.git
  Push  URL: git@github.com:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

git remote명령은 네트워크를 통해 원격 컴퓨터의 분기에 대해 쿼리합니다. 로컬 컴퓨터의 원격 추적 분기를 사용 git fetch하거나 사용하지 않습니다 git pull.

출력에서 "원격 지점"이라는 제목 ( "stale"으로 표시된 행은 무시)을보고 원격 시스템에 존재하는 모든 지점을 볼 수 있습니다.

원격 시스템에 로그인하여 파일 시스템에서 리포지토리를 찾을 수있는 경우 아래에서 모든 분기를 살펴볼 수 있습니다 refs/heads/.

컨닝 지:

  • 추적 여부와 상관없이 로컬 지점을 안전하게 삭제하려면 다음을 수행하십시오.

    git branch -d <branchname>
    
  • 추적 여부와 상관없이 로컬 지점을 삭제하려면 다음을 수행하십시오.

    git branch -D <branchname>
    
  • 원격 추적 분기를 삭제하려면

    git branch -rd <remote>/<branchname>
    
  • 새 로컬 비 추적 지점을 만들려면

    git branch <branchname> [<start-point>]
    
  • 새로운 로컬 추적 분기를 만들려면 : ( <start-point>이 지정되고 같은 원격 추적 분기 인 origin/foobar경우 --track플래그가 자동으로 포함됩니다)

    git branch --track <branchname> [<start-point]
    

    예:

    git branch --track hello-kitty origin/hello-kitty
    
  • 원격 시스템에서 분기를 삭제하려면 다음을 수행하십시오.

    git push --delete <remote> <branchname>
    
  • 오래된 원격지, 즉 원격 시스템의 해당 분기가 더 이상 존재하지 않는 모든 원격 추적 분기를 삭제하려면 다음을 수행하십시오.

    git remote prune <remote>
    

일부 명령에서는을 사용 <remote>/<branch>하고 다른 명령은 을 사용하는 것을 알 수 있습니다 <remote> <branch>. 예 : git branch origin/hello-kittygit push --delete origin hello-kitty.

임의의 것처럼 보일 수 있지만 슬래시 사용시기와 공백 사용시기를 기억하는 간단한 방법이 있습니다. 슬래시를 사용하는 경우 자신의 컴퓨터에서 원격 추적 분기를 참조하는 반면 공간을 사용하는 경우 실제로 네트워크를 통해 원격 컴퓨터의 분기를 처리하는 것입니다.


git checkout -b mynewbranch
Zeta

나는 공간과 슬래시의 차이점에 대한 마지막 요점을 좋아했습니다!
aderchox

12

현지 지점 :

컴퓨터에서 작업하고 커밋을 추가 할 수있는 지점. 이 분기를로 나열 할 수 있습니다 git branch.

현지 지점 (추적 포함) :

원격 지사에 해당하도록 구성된 일반 로컬 지사 이 할 수있는 능력과 같은 benfits있다 git pullgit push저장소와 브랜치 이름을 지정하지 않고있다. 추적은 또한 git status지점이 리모컨의 앞 또는 뒤에있을 때 알려줍니다.

원격 지점 :

원격 저장소, 일반적으로 GitHub 등의 서버에있는 지점

원격 추적 지점 :

원격 지사의 로컬 사본. 이 분기는 편집해서는 안됩니다. 그 목적은 원격 지점의 현재 상태를 추적하는 것입니다. 원격 추적 분기를 사용하여 볼 수 있으며 git branch -r일반적으로 origin/master리포 이름 뒤에 슬래시와 분기 이름이 있습니다. Running git fetch은 원격 추적 분기를 업데이트하여 해당 원격 분기의 상태를 반영합니다.

git branch -avv내 컴퓨터에있는 브랜치, 원격에있는 브랜치 및 각각의 최신 커밋에 대한 빠른 개요를 표시하는 데 개인적으로 가장 좋아합니다. 이 -a부분은 모든 분기가 표시되도록 지정합니다 (원격 및 로컬). v자세한에 대한 최종 스탠드의 (이것은 마지막이다 해시와 커밋 메시지). 두 번째 v는 어떤 로컬 지점이 어떤 원격지를 추적하는지에 대한 정보를 추가 한다는 점을 지적한 @Flimm에게 감사드립니다 .


1
로컬 추적과 원격 추적 분기의 차이점을 이해하지 못합니다. 전자는 원점에 해당하고 후자는 원격 컴퓨터에 해당합니다. 그러나 그것들은 같은 것이 아닌가? 보통 github에있는 레포가 아닌가?
akantoword

1
@ akantoword 나는 조금 명확하게하기 위해 대답을 업데이트했습니다. 기본적으로 원격 추적 지점은 단순히 작업용이 아닌 원격 지점의 로컬 복사본입니다. 추적 기능이있는 로컬 지점은 작업용입니다.
Eric Mathison
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.