programing

"Git push non-fast-forward updates rejected"는 무엇을 의미합니까?

projobs 2023. 10. 1. 23:23
반응형

"Git push non-fast-forward updates rejected"는 무엇을 의미합니까?

저는 컴퓨터 두 대와 개발을 관리하기 위해 Git을 사용하고 있습니다.GitHub을 변경하려고 하는데 다음 오류가 발생했습니다.

일부 참조를 에 푸시하지 못했습니다.<repo> 빠른 이 아닌 기록 손실을 방지하기 위해 빠른 전달이 아닌 업데이트를 거부했습니다.다시 밀어넣기 전에 원격 변경 내용을 병합합니다.

무엇이 원인일 수 있으며, 어떻게 고칠 수 있습니까?

편집:

레포를 당기면 다음이 반환됩니다.

*브랜치마스터->마스터(빠르지 않음) 이미 최신 상태입니다.

아직도 밀고 있으면 앞서 말한 오류가 납니다.

GitHub에는 ""빠른 방향이 아닌" 오류 처리"라는 멋진 섹션이 있습니다.

이 오류는 처음에는 조금 압도적일 수 있으므로 두려워하지 마십시오.
간단히 말하면 git은 커밋을 지지 않고는 원격에서 변경할 수 없기 때문에 푸시를 거부합니다.
일반적으로 다른 사용자가 같은 분기로 푸시하기 때문에 발생합니다.원격 분기를 불러와 병합하거나 당김을 사용하여 두 가지를 동시에 수행하여 이 문제를 해결할 수 있습니다.

에는 이 가 같은 입니다.git commit --amend아니면git rebase.
할 수 있습니다.--forcepush명령어, 당신은 이것이 당신이 원하는 것이라고 절대적으로 확신하는 경우에만 그렇게 해야 합니다.
강제 푸시는 원격 분기를 가져온 다른 사용자에게 문제를 일으킬 수 있으며 이는 잘못된 관행으로 간주됩니다.의심스러울 때는 억지로 밀지 마세요.


Git는 빠른 전달 병합처럼 원격에서 변경할 수 없습니다. Visual Git Reference는 다음과 같이 설명합니다.

alt text

이것은 정확히 사용자의 경우는 아니지만, "빠른 방향"이 무엇인지 확인하는 데 도움이 됩니다(여기서HEAD지점은 단순히 새로운 최신 커밋으로 이동됩니다).


""branch master->master (non-fast-forward) Already-up-to-date는 대개 원격 지점을 추적하지 않는 지역 지점을 대상으로 합니다.
예를 들어 이 SO 질문을 참조하십시오. "git pull은 최신이라고 말하지만 git push는 non-fast forward를 거부합니다."
또는 두 갈래는 연결되어 있지만 각각의 역사와 일치하지 않습니다.
"Never-ending GIT story - 내가 여기서 무엇을 잘못하고 있습니까?"를 참조하십시오.

이것은 당신의 하위 버전 분기와 당신의 원격 깃 마스터 분기가 무언가에 동의하지 않는다는 것을 의미합니다.
일부 변경 내용이 다른 변경 내용에 없는 변경 내용으로 푸시/커밋되었습니다.
pgitk --all이 잘못되었는지에 단서를 줄 수 입니다 -에서 "를 찾아보세요 의 - "입니다"

원격 저장소로 푸시된 다른 커밋이 사용자의 커밋과 다르다는 것을 의미합니다.당신은 보통 이것을 해결할 수 있습니다.

git pull

밀기 전에

궁극적으로 "빠른 전달"은 병합할 필요 없이 커밋을 작업 트리의 맨 위에 직접 적용할 수 있음을 의미합니다.

이 경우에는 푸시 조작과 함께 힘을 사용하는 것이 좋습니다.

git 푸시 오리진 마스터 --force

빨리 감기 업데이트는 한쪽이 다른 쪽에서 가장 최근에 커밋을 한 후에만 변경되는 것이므로 병합할 필요가 없습니다.변경 사항을 병합해야 푸시할 수 있습니다.

절대로 하지 마요.git -f하기 위해서push나중에 참담한 결과를 초래할 수 있기 때문입니다.

당신은 단지 한번만 하면 됩니다.git pull당신의 지역 지사의.

예:

git pull origin 'your_local_branch'

.git push

원격 지점이 업데이트되었지만 로컬 레포와 동기화되지 않은 경우에도 이 문제가 발생할 수 있습니다.그래서 제 경우에는 git repo를 만들고 readme 파일을 추가했습니다.로컬 컴퓨터에서 해당 레포에 업로드할 새로운 파일을 생성했기 때문에 평소처럼 푸시하려고 했습니다.그 후로, 저는 사형 집행을 했습니다.$git pull하지만 그것은 나를 던졌습니다.fatal: refusing to merge unrelated histories(됨).error됨).리베이스, 리스테이지, 리커밋을 시도했지만 문제가 해결되지 않았습니다.이 경우에는 둘 다 보관하고 싶었고 둘 사이에 공통 파일이 없었기 때문에 어쨌든 병합하는 것이 목표였습니다.그래서 다음과 같이 매개 변수를 전달하여 관련 없는 이력을 허용했습니다.

$git pull origin main --allow-unrelated-histories

이 명령어는 병합됩니다. 두 명령어가 서로 다른 헤드에 있다는 사실을 무시합니다.

그런 다음 다음을 사용하여 오리진 분기로 푸시합니다.$git push -u origin main

이것을 더 잘 설명하는 사람이 있다면, 이 답변을 자유롭게 편집하세요.

를 .conflicts locally변경 내용을 원격 repo/fork로 푸시하기 전에 실행할 수 있습니다.

1) 당기기(fetch 및 병합)

$ git pull remote branch 

2) 변경사항을 누릅니다.

$ git push remote branch 

에도 불구하고 를 할 수 이 가능합니다.push--force옵션은 변경사항이 손실되거나 다른 기여자에게 나쁜 영향을 미칠 수 있으므로 피해야 합니다.

정확히 같은 오류를 범한 저의 경우, 저만 개발자가 아니었습니다.

는 제 했습니다. 아래에 나와 있는 것을 볼 수 있습니다.Commit대화 상자 팝업:

Checked option for: Push changes immediately to origin

큰 를 했어요하지만 제가 실수를 저질렀습니다.Fetch내가 최근에 가지고 있는지 확인하기 위한 버튼.

커밋은 성공적으로 실행되었지만 푸시는 성공하지 못했지만 대신에 언급된 오류를 제공합니다. ...다른 개발자가 저와 같은 파일을 변경하지는 않았지만, 같은 오류가 표시되어 최신 파일을 풀 수 없습니다.

GUI 솔루션

대부분 소스트리의 GUI(Graphical User Interface)를 고수하는 것을 선호합니다.이 솔루션은 이상적이지 않을 수도 있지만, 변경 사항을 분실하거나 다른 개발자의 최신 업데이트를 손상시킬 염려 없이 다시 진행하게 되었습니다.

STEP 1

내용을 취소하려면 오른쪽 버튼으로 하고 합니다를 합니다.Reset current branch to this commit다음과 같습니다.

Sourcetree window with right-clicked commit and selecting: Reset current branch to this commit

STEP 2

로드가 되면 창 Pull단추...

Sourcetree window with with the Pull button highlighted

...그러면 대화 팝업이 나타나고 오른쪽 하단에 있는 버튼을 클릭합니다.

Sourcetree window dialog popup with the OK button highlighted

STEP 3

마지막으로 당긴 후 오류가 발생하지 않으면 4단계(아래 다음 단계)로 건너뜁니다.그렇지 않으면 이 시점에서 병합 충돌이 발견되면, 내가 내 컴퓨터에 했던 것처럼Web.config일:

Sourcetree window showing the error hint: Updates were rejected because the tip of your current branch is behind

...을합니다.그러면 클릭합니다.Stash상단에 대화 팝업이 나타나고 Descriptive-name of your changes(변경 내용 설명)을 작성한 다음 버튼을 클릭해야 합니다.

Sourcetree window with Stash button highlighted and dialog popup showing input to name your stash with OK button highlighted

...Sourcetree에서 변경된 파일을 저장한 후 2단계(위의 이전 단계)에서 작업을 반복하면 로컬 파일이 최신으로 변경됩니다.이제 변경사항을 다시 적용할 수 있습니다.STASHES소스 열 오른쪽 단추를 하여 소스 트리를 선택합니다. 화살표를 사용하여 스태시를 펼친 다음 마우스 오른쪽 버튼을 클릭하여 선택합니다.Apply Stash 'Descriptive-name-of-your-changes', 대화 팝업에서 선택 버튼을 누르면 다음과 같이 나타납니다.

Sourcetree window with the Stashes section expanded and changes right-clicked with Apply Stash highlighted

Sourcetree dialog popup ask your to confirm if you would like to apply stash you your local copy

텍스트 을 받는 에서 Visual Studio Code를 합니다.Accept Incoming Change링크한 다음 저장:

enter image description here

로 돌아가서 Source tree를 Commit상단의 버튼:

enter image description here

파일을 마우스 버튼으로 Resolve Conflicts하다,택을 합니다.Mark Resolved옵션:

enter image description here

STEP 4

드디어!우리는 이제 우리의 파일을 커밋할 수 있고, 또한 체크 표시할 수 있습니다.Push changes immediately to originCommit단추:

enter image description here

추신: 이 글을 쓰는 동안, 커밋 직전에 다른 개발자가 커밋을 제출했기 때문에 거의 반복적인 단계를 거쳐야 했습니다.

여기 제 대답을 참고하면...Git 푸시 실패, "빠른 전달이 아닌 업데이트가 거부되었습니다."


이를 해결하는 가장 안전한 방법은--rebase

예.

git pull <remote> <branch> --rebase

이로 인해 로컬 지점에서 충돌이 발생할 수 있으므로 수동으로 수정해야 합니다.

를 사항을 할 수 .--force-with-lease

예.

git push <remote> <branch> --force-with-lease

이 플래그를 사용하여 Git은 분기의 원격 버전이 분기의 원격 버전이 분기의 기본 설정과 동일한지 확인합니다. 즉, 분기를 다시 기본 설정하는 동안 누군가가 새 커밋을 눌렀다면 푸시가 거부되고 분기를 다시 기본 설정해야 합니다.

매시간 수백 건의 커밋을 걸고 대형 프로젝트를 진행한다면 귀찮지만 그래도 이 문제를 해결할 수 있는 최선의 방법입니다.

자신이 무엇을 하고 있는지 정확히 알지 못하는 한 --force 사용하지 마십시오.

으로.--force원격 저장소를 로컬에 있는 모든 것으로 무조건 덮어쓰기 때문에 파괴적입니다.

로.--force-with-lease 합니다..

이 게시물에 대한 자세한 내용은 아틀라시안의 개발자 블로그에서 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4684352/what-does-git-push-non-fast-forward-updates-were-rejected-mean

반응형