변경 사항이 업스트림에 존재할 때 git status show branch가 최신 상태 인 이유는 무엇입니까?


226

변경 사항은 추적 된 분기에서 업스트림에 존재하지만 입력 git status하면 로컬 분기가 최신 상태임을 나타냅니다. 이 새로운 동작입니까, 구성 설정을 변경 했습니까? 아니면 잘못된 것입니까?

도와 주셔서 감사합니다.

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

답변:


274

상태가 말한 것은 origin/master 로컬 repo의 로컬 참조 인 ref 뒤에 있다는 것 입니다. 이 경우 심판은이라는 일부 리모콘의 지점을 추적 origin하지만 리모콘의 지점에 대한 상태는 알려주지 않습니다. 로컬 파일 시스템에 저장된 커밋 ID 인 ref에 대해 알려줍니다 (이 경우 일반적으로 .git/refs/remotes/origin/master로컬 리포지토리에서 호출 된 파일에 있음 ).

git pull두 가지 작업을 수행합니다. 먼저 git fetch원격 리포지토리의 커밋 ( origin/master로컬 리포지토리 의 참조 를 업데이트)으로 최신 상태를 유지 한 다음 git merge커밋을 현재 분기로 병합합니다.

fetch단계 를 수행 할 때까지 (자체 git pull또는를 통해 ) 로컬 리포지토리는 추가 커밋이 업스트림에 있다는 것을 알 수 없으며 git status로컬 origin/master참조 만 볼 수 있습니다 .

git status최신이라고 하면 "현재 분기가 추적하는 분기의 최신"을 의미하며,이 경우 "로컬 참조가 origin/master" 인 최신 "을 의미 합니다. 그것은 "마지막 검색했을 때 검색된 업스트림 상태 fetch로 최신 상태 인 것과 같습니다.

왜 이런 식으로 작동합니까? 이 fetch단계는 잠재적으로 느리고 비용이 많이 드는 네트워크 작업입니다. Git (및 기타 분산 버전 제어 시스템 ) 의 설계는 불필요 할 때 네트워크 작동을 피하기위한 것이며, 많은 사람들이 익숙한 일반적인 클라이언트-서버 시스템과는 완전히 다른 모델입니다 (아래 의견에서 지적했지만 Git의 개념 여기에서 혼동을 일으키는 "원격 추적 지점"은 모든 DVCS에 의해 공유되지는 않습니다). 중앙 집중식 서버에 연결하지 않고 Git을 오프라인으로 사용할 수 있으며 출력에 git status반영됩니다.

Git에서 브랜치를 만들고 스위칭하고 상태를 확인하는 것은 중앙 집중식 시스템에 느린 네트워크 작동을 수행하는 것이 아니라 경량이어야합니다. Git 및 git status출력을 설계 할 때의 가정 은 사용자가이를 이해한다는 것입니다 (Git의 작동 방식을 이미 알고있는 경우 너무 많은 Git 기능 만 의미가 있습니다). DVCS에 익숙하지 않은 많은 사용자가 Git을 채택하면이 가정이 항상 유효한 것은 아닙니다.


79
늦은 의견이지만 같은 상황에 처했습니다. git이 가져 오기 전에 변경 사항을 알 수없는 이유를 이해합니다. 그러나 "최신"이라고 말해서는 안되며, 이는 사실이 아닙니다. "원격으로 무슨 일이 있었는지 전혀 모른다"고 말하는 것이 좋습니다.
Droidum

31
어쩌면 그것은 논리적으로 논리적이지만, 인간이 합리적인 것은 아닙니다. 가져 오기를 수행하도록 설계하지 않은 이유는 무엇입니까? 또는 "{timestamp}에서 마지막으로 확인했을 때 지점이 'origin / master'로 최신 상태입니까?" 또는 "지사가 최신인지 확인하기 위해 가져 오기를 수행합니까?"
Colin 5

25
왜 "지사가 최신 정보입니다"라는 메시지를 표시하지 않습니까? 나는 원산지 / 마스터의 상태를 아는 데있어 어떤 점을 보지 못하고 그것이 원산지 원격지의 실제 마스터 브랜치를 나타내기로되어 있다면, 그것은 분명 어쨌든 모른다.
whiterook6

2
@pastullo이므로 별칭을 만듭니다.
Jonathan Wakely

23
이것은 Git의 끔찍한 사용성에 대한 완벽한 예입니다. 나는 그 힘과 유연성을 좋아하지만 단순히 메시지를 "당신의 지점은 로컬 버전 'origin / master'로 최신입니다." 큰 개선이 될 것입니다. 여기서 혼란스러운 점은 원격 지점을 추적하는 로컬 지점 원점 / 마스터 (사용중인 모든 원격 / 지점과 패턴이 일치 함)입니다.
matthewcummings516

35

로컬 리포지토리가 업스트림 리모컨으로 체크인하지 않았기 때문입니다. 예상대로이 작업을 수행하려면 사용 git fetch하고 git status다시 실행 하십시오.


7

이것들은 모두 가능한 답변이지만 로컬 리포지토리가 원격지와 일치하는지 확인하는 방법을 제공하기로 결정했습니다. 내 지점이 어디 있는지 보려면 간단히 사용하십시오.

git remote show origin

그것이 수행하는 것은 현재 추적 된 모든 분기와 가장 중요한 것-최신, 앞 또는 원격 원점 뒤에있는 정보를 반환하는 것입니다. 위의 명령 다음에 반환되는 내용의 예입니다.

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

이것이 누군가를 돕기를 바랍니다.


0

"origin / master"는 "origin / master"브랜치의 HEAD 커밋에 대한 참조 poiting을 나타냅니다. 참조는 일반적으로 커밋 객체 인 Git 객체에 대한 사람에게 친숙한 별칭 이름입니다. "origin / master"참조는 git push원격지 ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes )에 있을 때만 업데이트됩니다 .

프로젝트 루트 내에서 다음을 실행하십시오.

cat .git/refs/remotes/origin/master

표시된 커밋 ID를 다음과 비교하십시오.

cat .git/refs/heads/master

그것들은 동일해야하며, 이것이 Git master이 최신 버전입니다 origin/master.

달릴 때

git fetch origin master

.git / objects 폴더에서 로컬로 새 Git 객체를 검색합니다. 그리고 Git은 .git / FETCH_HEAD를 업데이트하여 페치 된 브랜치의 최신 커밋을 가리 킵니다.

따라서 현재 로컬 브랜치와 업스트림에서 가져온 브랜치의 차이점을 확인하려면

git diff HEAD FETCH_HEAD

1
.git 디렉토리에있는 항목을 고양이로 만들면 안됩니다. 압축 된 참조에서는 작동하지 않습니다. 또한 페치 동작은 이전 버전의 git 용입니다.
Andrew C

origin/master심판뿐만 아니라 가져 오기에 의해 심판이 업데이트 되지 않습니까?
Jonathan Wakely

옳은. 지금까지 Git 1.8.3을 사용하고있었습니다. 실제로 버전 2.2.1에서 FETCH_HEAD는 가져 오는 동안 업데이트됩니다. 또한 "지점이 최신 상태입니다 ..."또는 "지점이 X 커밋에 의해 뒤에 있습니다"라는 메시지가 표시되면 로컬 지사가 지정된 원격 지사를 추적하는 경우에만 표시됩니다. master가 원점 / 마스터를 추적하려면 지점 마스터에서 git branch -u origin / master를 실행해야합니다. 추적이 없으면 여전히 git diff를 실행해야합니다.
Marek Stanley

그렇다면 "원점 / 마스터"참조는 리모컨을 git push 할 때만 업데이트
Jonathan Wakely

0

샘플 자식의 repo에 모습 경우 확인하자 your branch (master)입니다 up to date함께 origin/master.

로컬 마스터가 출발지 / 마스터를 추적하고 있는지 확인하십시오.

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

로컬 마스터 브랜치에 대한 추가 정보 :

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

출발지 / 마스터가 동일한 커밋에 있는지 확인하십시오.

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

우리는 동일한 해시를 볼 수 있으며 지점이 적어도 현재 git repo에서 원격과 일관성이 있다고해도 안전합니다.



0

나를 여기로 데려 간 것과 같은 사소한 대답은 여전히 ​​정확합니다. 나는 새로운 리포지토리에서 일하고 있었고 상태에 따라 새로운 것으로 보이지 않는 파일을 추가했습니다.

파일이 .gitignore 파일의 패턴과 일치하는 것으로 끝납니다.


0

이 경우 git add를 사용하여 보류중인 모든 파일을 통합 한 다음 git commit을 사용하고 git push를 사용하십시오.

자식 추가-모든 pedent 파일을 통합

자식 커밋-커밋 저장

자식 푸시-저장소에 저장

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.