자식 : 당신의 지점은 X 커밋보다 앞서 있습니다.


379

이것이 실제로 어떻게됩니까?

나는 현재 하나의 리포지토리에서 혼자 작업하고 있으므로 이것이 내 워크 플로우입니다.

  1. 파일 변경
  2. 범하다
  3. 만족할 때까지 1-2 반복
  4. 마스터로 푸시

그런 다음 내가 할 때 git status커밋이 X 커밋 (아마도 내가 저지른 커밋 수와 같음 ) 보다 앞서 있다고 알려줍니다 . 코드를 푸시 할 때 실제로 로컬로 캐시 된 파일 (.git 폴더)을 업데이트하지 않기 때문입니까? git pull이 이상한 메시지를 '수정'하는 것처럼 보이지만 여전히 왜 그런 일이 발생하는지 궁금합니다 .git을 잘못 사용하고 있습니까?


메시지에 인쇄 된 분기를 포함하여

내 현지 지점은 마스터보다 앞서 있습니다

현재 브랜치를 밀고 당기는 곳

나는 GitHub로 밀고 그 시점에서 작업중 인 컴퓨터를 가져 오는 중입니다. 내 로컬 사본은 내가 작업하는 유일한 사람이므로 항상 최신 상태입니다.

실제로 원격 저장소를 확인하지 않습니다.

그것이 내가 생각한 것인데, 나는 그것이 그것에 대한 나의 이해가 올바른지 확신 할 것이라고 생각했다.

당신은 그것에 몇 가지 추가 논쟁을 전달하고 있습니까?

내가 볼 수있는 것은 아니지만 내 끝에 재미있는 구성이있을 수 있습니까?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

당신은 어떻게이 일을 push하고 원격 및 지점 설정 설정은 무엇입니까?
CB Bailey

2
실제로 원격 저장소를 확인하지는 않습니다. 푸시를 수행 한 후 원격 저장소에 대한 최신 정보를 가져 오기 위해 git fetch를 수행해야합니다. 그러면 추적하는 데 사용되는 로컬 "원격"분기가 업데이트됩니다.
Sekhat

2
@ Sekhat : git status원격 저장소를 확인하지는 않지만 git pull수행합니다. 푸시 할 리포지토리에 대한 추적 분기가있는 git push경우 푸시가 성공하면 원격 분기의 새로운 상태를 반영하도록 로컬 추적 분기가 업데이트됩니다. 이것이 올바르게 발생하지 않으면 구성 오류가 있기 때문에 asker의 구성에 대해 질문 한 이유입니다.
CB Bailey

git status? 정말? 내 git status브랜치가 얼마나 앞선 지 나에게 결코 말하지 않는다.
하센

4
@hasen j : git status원격 브랜치가 업데이트되었는지 확인하기 위해 원격 저장소로 이동하지 않습니다. 로컬 지점이 로컬에 저장된 원격 추적 지점 과 비교되는 정도를 알려줍니다 . 문제는 일반적인 git push(페치 및 풀뿐만 아니라) 원격 추적 브랜치를 업데이트해야하며 asker의 경우 작동하지 않는 것 같습니다. 정확한 형식 git push과 로컬 리포지토리의 구성을 모두 확인해야하는 이유를 확인하기 위해 asker가 이미 답변을 수락 했으므로 현재 이러한 상황을 볼 수 없습니다.
CB Bailey

답변:


508

당신이를 수행 한 후이 메시지가 나타나면 git pull remote branch하는과를 다음보십시오 git fetch. (선택적으로, git fetch -p저장소에서 삭제 된 분기를 제거하기 위해 실행 )

Fetch는 원격 브랜치의 로컬 표현을 업데이트하는 것으로 보입니다 git pull remote branch.


1
브라보. 그것은 실제로 문제였습니다. Google 코드에서 저장소를 만드는 것으로 시작했습니다. 그런 다음 랩톱 에서이 리포지토리를 복제하고 거기에서 작업하고 랩톱 => code.google 변경 사항을 푸시합니다. code.google 코드 저장소의 복제본을 만든 서버 에서이 메시지를 받았으며 변경 사항을 가져 왔습니다. 로컬 데이터베이스를 업데이트하려면 가져 오기가 필요하다고 생각합니다.
rjha94

2
다른 지점 (A)가 동일한 커밋 마스터를 가리 키기 때문에 여기에서도 동일한 문제가 발생했습니다. A를 당기고 마스터를 당기면 같은 상황이 발생합니다. git이 A를 뽑았을 때, commitid는 마지막 것으로 갱신되었으므로 master를 당기면 실제로 잡아 당기는 것이 없으므로 git은 master를 마지막으로 commitid를 업데이트하지 않았으며 "master에 앞서"경고했다.
Uberto

8
고맙지 만 한 가지 이상한 점을 발견했습니다. "git fetch origin master"는 도움이되지 않지만 "git fetch origin"은 도움이됩니다. 마스터 브랜치에 있으므로 "git fetch origin"이 컨텍스트에서 어떻게 다른지 잘 모르겠습니다.
Parag

2
@Parag는 두 명령의 차이점과 동작을 변경하기 위해 구성 파일을 수정하는 방법에 대한 설명 은 stackoverflow.com/questions/26350876/… 을 참조하십시오 .git fetch remote branch는 원격 추적 브랜치 참조를 업데이트하므로 git_status는 'ahead by'를보고하지 않습니다.
Anatortoise House

2
@Parag, stackoverflow.com/questions/7365415/… answer에서는 ORIG_HEAD 및 FETCH_HEAD의 세부 정보가 동기화되지 않아 상태 경고 및 구성 파일 수정이 가능한 원인에 대해 설명합니다.
Anatortoise House

138

사용하다

git pull --rebase

--rebase 옵션은 git이 로컬 커밋을 옆으로 옮기고 원격과 동기화 한 다음 새 상태에서 커밋을 적용하려고 시도 함을 의미합니다.


3
쓸모없는 병합을 방지하고 더 깨끗한 트리를 가지기위한 정말 좋은 방법입니다!
Hatef

1
이 명령을 시도했지만 여전히 같은 문제가 있습니다.$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh

4
이 답변은 잘못되었습니다. 상황을 이해하지 않고 사용하면 미리 여러 ​​번 문제가 발생할 수 있습니다 (기록을 다시 작성하십시오!). 상황을 이해하면 해결 되지 않습니다 . 를 사용할 때 입력하기 전에 생각 git하고, 역사를 무심코 다시 쓰지 마십시오!
cmaster-monica reinstate

80

이 3 가지 간단한 명령을 사용하십시오

1 단계 :git checkout <branch_name>

2 단계 :git pull -s recursive -X theirs

3 단계 :git reset --hard origin/<branch_name>

자세한 내용은 https://stackoverflow.com/a/39698570/2439715

즐겨.


3
이것이 실제로 문제를 해결 한 유일한 답변입니다. 이상하게 위의 명령 (12) 7 커밋에서 그것을 무너 뜨렸다이 마침내 사람들을 제거
Ieuan

1
나는 이것이 나를 위해 일한 유일한 것에 동의합니다. 나는 GIT에 때때로 여러 성격 장애가 있다고 확신합니다.
16:27에

11
@ leuan과 마찬가지로 아무것도 git reset --hard origin/master나를 위해 정리했습니다.
Dave Land


51

난 당신이 메시지를 잘못 읽고있는 것 같아요 - 지사는 앞서 아니다 master, 그것은 이다 master . 그것은 앞서의 origin/master인, 원격 추적 브랜치 마지막에서 원격 저장소의 상태를 기록 push, pull또는 fetch. 그것은 당신이 한 일을 정확히 말해줍니다. 당신은 리모컨보다 앞서 있으며 그것은 당신에게 푸시를 상기시켜줍니다.


22
이것은 실제로 내가 밀어 넣은 후에입니다. 나는 그 메시지를 갖지 못하도록 잡아 당겨야했다.
SeanJA

26

누군가가 당신이 당신의 메시지를 잘못 읽고 있다고 말했지만 그렇지 않습니다. 이 문제는 실제로 <project>/.git/config파일 과 관련이 있습니다. 다음과 비슷한 섹션이 될 것입니다.

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

프로젝트의 .git / config 파일에서 인출 라인을 제거하면 "지점은 N커밋 으로 '원점 / 마스터'보다 앞서 있습니다." 성가심.

또는 희망합니다. :)


다음에 ahead by x commits메시지를 볼 때 확인해야 합니다. 한동안 메시지를 보지 못했습니다.
SeanJA

한동안 메시지를 보지 못했습니다. git repo를 로컬에서 생성하기 시작한 후 다른 방법 대신 원격 repo로 푸시하기 시작한 것
같습니다

나는 이것을 시도했지만 Eclipse에서 eGit이 커밋하려고 할 때 "내부 오류"와 함께 팝업되기 시작했다. Git 자체는 잘 작동하는 것 같았습니다.
user4815162342

18
그 라인은 무엇을합니까? 그것을 제거하여 무엇을 놓치고 있습니까? (성가심을 제외하고)
John Mee

1
이것은 효과가 있었지만 오류를 억제하는 것과 같습니다. 줄을 다시 추가하면 경고 메시지가 다시 나타납니다.
Krishna Pandey

15

나는 잡아 당김 만하는 무대 서버 에서이 문제를 겪었습니다. 그리고 하드 리셋을 통해 HEAD를 리모컨과 동일하게 청소할 수있었습니다.

git reset --hard origin/master

이제 다시 한 번 :

On branch master
Your branch is up-to-date with 'origin/master'.

나는 --hard 플래그없이 처음 시도했고 작동했습니다!
kroiz

12

이것은 나를 위해 일했다

git reset --hard origin/master

출력은 다음과 같아야합니다

On branch dev HEAD is now at ae1xc41z Last commit message


11

제 경우에는 다음을 사용하여 마스터로 전환했기 때문이었습니다.

 git checkout -B master

대신 새 버전을 가져 와서

 git checkout master

첫 번째 명령 은 마스터 헤드를 최신 커밋으로 재설정합니다.

나는 사용했다

git reset --hard origin/master

그것을 고치기 위해


9

나는이 페이지의 모든 솔루션을 살펴 보았지만 다행히도 @ anatolii-pazhyn은 그의 솔루션이 효과가 있었기 때문에 논평했습니다. 불행히도 나는 그를 찬성 하기에 충분한 명성 을 얻지 못했지만 그의 해결책을 먼저 시도하는 것이 좋습니다.

git reset --hard origin/master

나에게 준 :

HEAD is now at 900000b Comment from my last git commit here

나는 또한 추천한다 :

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

다음을 사용할 수도 있습니다.

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

행운을 빌어 요


4

Windows 컴퓨터에서도 이와 동일한 문제가 발생했습니다. git pull origin master명령을 실행할 때 "X commits에 의해 'origin / master'에 앞서"경고 메시지가 나타납니다. 대신 실행 git pull origin하고 분기를 지정하지 않으면 더 이상 경고가 표시되지 않습니다.


나는 이것이 효과적으로 git fetch무대 뒤에서 한다고 믿는다 .
브라이언 피터슨

"git fetch"가 내 문제를 해결하지 못했습니다. 새로 추가 한 분기 목록과 "원격 '업스트림'에서 가져 오기를 요청했지만 분기를 지정하지 않았습니다.이 메시지는 현재 분기에 대해 구성된 기본 원격이 아니므로 명령에서 분기를 지정해야합니다. 선." 다음 "git status"명령은 경고를 표시하지 않았습니다.
Krishna Pandey

2

현재 분기와 현재 트랙을 수행하는 분기 간의 차이점을 상기시켜줍니다. 메시지에 인쇄 된 분기와 현재 분기를 어디에서 밀고 당기는 지 등 자세한 정보를 제공하십시오.


2

이 질문은 조금 오래되었지만 ... 유사한 상황에 있었고 여기의 대답은 비슷한 문제를 해결하는 데 도움이되었습니다.

먼저 시도 push -f또는 강제 옵션

그래도 작동하지 않으면 (내 경우와 같이) 원격 리포지토리 (또는 원격 리포지토리에 대한 참조 git remote -v)가 업데이트되지 않을 수 있습니다.

위의 푸시 결과 로컬 / 브랜치를 원격 / 브랜치와 동기화 한 결과 로컬 리포지토리의 캐시에는 여전히 이전 커밋 (로컬 / 브랜치의 단일 커밋 만 제공 한 경우)이 HEAD로 표시됩니다.

위의 복제를 다른 위치에서 복제하고 로컬 / 분기 HEAD와 원격 / 분기 HEAD를 비교하십시오. 둘 다 동일하면 아마도 내가 한 문제에 직면했을 것입니다.

해결책:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

이제 push -f다음과 같이하십시오

git push -f github master ### origin더 이상 명령이 없습니다 !

를 수행 git pull지금 git pull github master

받자 git status마자

# On branch master

nothing to commit (working directory clean)

조회수가 너무 많아서이 오류를 검색하면 거의 항상이 스레드가 맨 위에 나열되므로 누군가에게 유용하기를 바랍니다.

자세한 내용 은 gitref 를 참조하십시오


2

실제로 TortiseGIT로 스위치 / 체크 아웃을 할 때 이런 일이 발생했습니다.

내 문제는 다른 지역 지점을 기반으로 지점을 만들었습니다. /.git/config다음과 같은 "병합"항목을 작성했습니다 .

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

"웹"브랜치로 전환 할 때마다 개발에 앞서 100 명 이상의 커밋을했다. 글쎄, 나는 더 이상 개발을 약속하지 않았으므로 그것은 사실이었습니다. 이 항목을 간단히 제거 할 수 있었고 예상대로 작동하는 것 같습니다. 개발 브랜치 뒤에있는 것에 대해 불평하는 대신 원격 심판으로 올바르게 추적하고 있습니다.

Vikram이 말했듯 이이 스택 오버플로 스레드는이 문제를 검색 할 때 Google의 최고 결과이므로 내 상황과 솔루션을 공유 할 것이라고 생각했습니다.


2

위의 @Marian Zburlia가 언급 한 것과 동일하게 반복하고 싶습니다. 그것은 나를 위해 일했고 다른 사람들에게 똑같이 제안 할 것입니다.

git pull origin develop

뒤에 와야합니다 $ git pull --rebase.

이렇게하면 $ git status최근 끌어온 후에 나오는 주석이 제거됩니다 .


2

git fetch 당신을 위해 이것을 해결할 것입니다

내 이해가 정확하면 귀하의 지역 (캐시) origin/master이 오래되었습니다. 이 명령은 서버에서 저장소 상태를 업데이트합니다.


1
설명을 추가해주세요
Mathews Sunny

2

그런 다음 자식 상태를 수행하면 X 커밋 (아마도 내가 저지른 커밋 수와 같음)이 내 분기보다 앞서 있다고 알려줍니다 .

내 경험은 많은 지점이있는 팀 환경에 있습니다. 우리는 (로컬 클론에서) 자체 기능 브랜치에서 작업하며 git status11 개의 커밋보다 앞서 나왔음 을 보여줍니다. 질문의 저자와 마찬가지로 내 작업 가정은 +11이 내 자신의 커밋 에서 온 것이라고 가정했습니다. .

develop몇 주 전에 공통 지점 에서 기능 지점으로 변경 사항을 가져 왔지만 잊어 버렸습니다. 오늘 내 로컬 기능 지점을 다시 방문 git pull origin develop하고 숫자가 +41 커밋으로 점프했습니다. 많은 작업이 완료 develop되었으므로 로컬 기능 분기는 기능 분기보다 훨씬 앞서있었습니다.origin 저장소 .

따라서이 메시지가 표시되면 액세스 할 수있는 다른 지점 (자체 또는 다른 지점)에서 수행 한 끌어 오기 / 병합을 생각해보십시오. 이 메시지는 단지에 필요한 신호를 git pushpull에드는 다시 변경 origin일을 업으로 동기 얻을 해당 지역의 repo에서 ( '지점을 추적')의 repo.


1

제안 git pull하거나 git fetch정확한 답변 .
메시지가 생성되는 경우 git status의 차이보고 .git/FETCH_HEAD.git/refs/remotes/<repository>/<branch>(예를 들어.git/refs/remotes/origin/master ).

후자의 파일은 마지막 페치 (저장소 / 분기)의 HEAD를 기록합니다. 이렇게 git fetch분기의 현재 HEAD 업데이트를 두 파일을.
물론 로컬 저장소가 이미 최신 상태이기 때문에 가져올 .git/FETCH_HEAD것이 없으면 변경되지 않습니다.


이것은 나를위한 경우가 아닌 것 같습니다 : .git/FETCH_HEADcontains 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLand .git/refs/remotes/origin/mastercontains 9f7336c873ccffc772168bf49807e23ff74014d3하지만 여전히 메시지를 수신하고 해결 하지도 git pull않습니다.git fetch
다비드

0

분기에서 파일을 추적 해제하기 위해 커밋을 수행 한 후이 메시지가 표시되면 파일을 약간 변경하고 커밋을 수행하십시오. 이전에 추적 된 파일의 추적을 해제하는 것만 포함하는 단일 커밋을 수행 할 수 없습니다. 마지막 으로이 게시물은 https://help.github.com/articles/removing-files-from-a-repository-s-history/ 전체 문제를 해결하는 데 도움이되었습니다 . 리포지토리 기록에서 파일을 제거해야했습니다.

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