programing

업스트림에 변경 사항이 있는 경우 git 상태에서 branch가 최신 상태로 표시되는 이유는 무엇입니까?

stoneblock 2023. 5. 14. 10:04

업스트림에 변경 사항이 있는 경우 git 상태에서 branch가 최신 상태로 표시되는 이유는 무엇입니까?

에 업스트림에 하지만, 가 변경사이추분기의업스때에를 입력하면 합니다.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

상황이 말해주는 것은 당신이 심판의 배후에 있다는 것입니다.origin/master 당신의 지역 레포에 있는 지역 심판입니다.이 경우 ref가 원격에 있는 지점을 추적합니다.origin하지만 상태는 원격의 지점에 대해 아무것도 알려주지 않습니다.시스템에 경우 ID(일으파로이름일다적니알줍려대참반해조에경우에)라는 ref에 알려줍니다..git/refs/remotes/origin/master해당 지역 레포에 있음).

git pull두 가지 작업을 수행합니다; 먼저 그것은git fetch 상태로 합니다.origin/master in repo 에서 ref를 수행합니다.git merge이러한 커밋을 현재 분기에 병합합니다.

를 할 때까지.fetch 자체 )git pull해당 지역의 담당자는 업스트림에 추가 커밋이 있는지 알 수 없습니다.git status 로만봅다니만 .origin/master심판을 보다

git status"를 이 "update"라는 "를 의미합니다.origin/master으로 " 이마 " 지막 " 에으로업 " 는최상 " " 당합다 " 해의림 " 태트한 " 상스색 " 검▁status▁that " 에▁upstream니 " 마합▁last " up당다 " ▁that-▁the▁retrieved " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "fetch이는 "업스트림의 최신 라이브 상태로 최신 상태"와 동일하지 않습니다.

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

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

이는 로컬 담당자가 업스트림 원격으로 체크인하지 않았기 때문입니다.이 작업을 예상대로 수행하려면 다음을 사용합니다.git fetch그리고 나서 실행합니다.git status한 번

이것들은 모두 실행 가능한 답변이지만, 저는 로컬 레포가 가져오거나 당기지 않고 리모컨과 일치하는지 확인하는 방법을 제공하기로 결정했습니다.분기가 어디에 있는지 확인하기 위해 다음과 같이 간단히 사용합니다.

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)

이것이 누군가에게 도움이 되기를 바랍니다.

저는 비슷한 문제에 직면한 적이 있습니다. 저는 해결책을 찾기 위해 온라인에서 모든 곳을 검색했고 그것들을 따르려고 노력했습니다.아무 것도 효과가 없었어요.이것들이 제가 그 문제에 대해 취한 조치들이었습니다.

새 레포를 만들고 기존 코드를 새 레포로 다시 푸시

이미 리포지토리에 .git/ 폴더가 있는 경우 git init가 초기화되지 않습니다.그러니까, 당신의 경우에는, 해보세요.

rm -rf.git/

잽싸게

git remote add origin https://remote.url

git commit -m "Commit message"

git push -f 오리진 마스터

이 리포지토리의 원격 리포지토리와 같은 모든 Git 구성은 1단계에서 지워집니다.따라서 모든 원격 저장소 URL을 다시 설정해야 합니다.

또한, 5단계에서 -f를 처리합니다: 리모트에는 이미 n개의 커밋이 있는 일부 코드 베이스가 있으며, 당신은 그 모든 변경 사항을 단일 커밋으로 만들려고 합니다.따라서 변경 사항을 원격으로 강제 푸시해야 합니다.

"오리진/마스터"는 지점 "오리진/마스터"의 HEAD 커밋에 대한 참조 포인팅을 의미합니다.참조는 일반적으로 커밋 개체인 Git 개체에 대한 사용자 친화적인 별칭입니다.는 "master/master" 사용자가 "master/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

이 그은같아하고야들이, 이말하이유다니입는그것it다▁g▁they이니유입it라고 말하는 이유입니다.master의 " 최상입다니"입니다.origin/master.

실행할 때

git fetch origin master

그러면 .git/objects 폴더 아래에서 새 Git 개체를 로컬로 검색합니다.Git는 .git/FETCH_HEAD를 업데이트하여 가져온 분기의 최신 커밋을 가리킵니다.

현재 로컬 분기와 업스트림에서 가져온 분기 간의 차이점을 보려면 다음을 실행합니다.

git diff HEAD FETCH_HEAD

하여 Gitrepo가 Gitrepo인지 .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에서는 브랜치가 원격 해시와 일치하지 않는다고 해도 무방합니다.

사소한 답변이지만 어떤 경우에는 정확합니다. 예를 들어 저를 여기로 데려온 것과 같습니다.저는 저에게 새로운 레포에서 일하고 있었고 상태로는 새로운 것으로 보이지 않는 파일을 추가했습니다.

파일이 .gitignore 파일의 패턴과 일치하게 됩니다.

이 경우 git를 사용하여 보류 중인 모든 파일을 추가하고 통합한 다음 git commit을 사용하고 git push를 사용합니다.

git add - 모든 특허 파일 통합

git commit - 커밋 저장

git push - 리포지토리에 저장

은 무엇입니까?git status잘못된 폴더에...이것을 확인합니다.

제 경우 VScode 터미널에서 잘못된 프로젝트를 수행했습니다.

최신 버전의 다른 프로젝트에 새 커밋을 추가하려고 했는데 "지점이 최신 버전입니다"라는 메시지가 표시되어 터미널에서 아이콘 추가를 클릭하고 올바른 위치에서 새 아이콘 열기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/27828404/why-does-git-status-show-branch-is-up-to-date-when-changes-exist-upstream