GitHub에 푸시 할 수 없음-병합 필요를 계속 표시


743

GitHub를 처음 사용합니다 . 오늘 코드를 GitHub에 푸시하려고 할 때 문제가 발생했습니다.

Pushing to git@github.com:519ebayproject/519ebayproject.git
To git@github.com:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:519ebayproject/519ebayproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

아직 저장소에 아무것도 넣지 않았으므로 왜 무언가를 가져와야합니까?


6
업스트림 리포지토리에 커밋 된 로컬로 이전에 방문한 지점에서도 이러한 상황이 발생할 수 있습니다. 그런 오래된 지점을 빨리 감거나 로컬 저장소에서 자식을 잊게하는 쉬운 방법이 있습니까?
Thorbjørn Ravn Andersen 님이

50
@ ThorbjørnRavnAndersen-나는 'git push -f'를 사용 하여이 시나리오를 수정하여 git이 가상의 문제를 잊게하는 것처럼 보였습니다 :)
Echelon

6
git newcomer에서 이에 대한 불만을 보았습니다. 그 이유는 GitHub에서 새 프로젝트를 만들 때 틱 박스 "초기화 readme"를 그대로 두거나 .gitignore / GPL 옵션을 선택하기 때문에 새 프로젝트에는 이미 로컬에 커밋이 없으므로 위의 오류로 인한 혼란이 있기 때문입니다.
Ruslan Kabalin

4
@Echelon -f 옵션은 강제로 푸시하는 것이 위험합니다. 방금 팀 프로젝트에서 사용했으며 6 개의 커밋이 "스트라이핑되었습니다". 단순히 서버에서 삭제되어 다시 가져올 수있는 방법이 없습니다!
Deleplace

42
자식을 칭찬하는 것이 유행입니다. 그러나 내가 말한 거의 모든 개발자는 개인적으로 자식을 싫어한다는 데 개인적으로 동의합니다. 이제 git을 사용하므로 perforce 또는 TFS를 사용할 때 사용한 것과 비교하여 소스 제어에 훨씬 더 많은 시간을 소비합니다.
developer747

답변:


762

이로 인해 원격 저장소가 커밋을 잃을 수 있습니다. 조심해서 사용하십시오.

원격 브랜치를 로컬 브랜치에 병합하지 않고 ( git diff 와의 차이점 참조 ) 강제 푸시를 수행하려면 push 명령을 -f와 함께 사용하십시오.

git push -f origin <branch>

어디에서 원격 저장소 origin의 이름입니다 .

일반적으로이 명령은 덮어 쓰기에 사용 된 로컬 참조의 조상이 아닌 원격 참조 업데이트를 거부합니다. 이 플래그는 검사를 비활성화합니다. 이로 인해 원격 저장소가 커밋을 잃을 수 있습니다. 조심해서 사용하십시오.


1
이것은 Github에있는 리포지토리에서 나를 위해 일했지만 내 앱에는 Heroku의 하위 모듈이 있습니다. 하위 모듈에서 파일을 가져온 다음 업데이트 된 앱을 Heroku로 푸시해야했습니다.
JGallardo

24
이 게시물에 대한 주석의 마지막 줄을 읽으십시오! "이로 인해 원격 저장소가 커밋을 잃을 수 있습니다.주의해서 사용하십시오." 팀 환경에서 강제로 푸시하는 것은 위험한 일이며 일반적으로 피해야합니다.
Adam Kalnas

또한 체리 픽을 사용하여 원본 저장소에서 원격으로 모든 기록을 추가하여 하나의 커밋을 '단지'이동할 수 있습니다. 백업에서 복원 필요 ...
rickfoosusa

또한 Github 을 사용하는 경우 이전 커밋으로 이전에 만든 열린 풀 요청무시할 수 있습니다 . 에서 Github에서 문서 : "강제 당신의 풀 요청할 수 있습니다 손상 밀어".
Armfoot

이것은 나를 위해 일했습니다. 시도 $ git pull origin master -v했지만 오류가 발생 fatal: refusing to merge unrelated histories합니다. 그런 다음 이것을 시도하고 효과가 있었고 로컬 파일이 github remote repo에 나타났습니다.
Vir

238

메시지에서 알 수 있듯이

원격 변경 사항 병합 (예 : 'git pull')

git pull원격 저장소에서 로컬 저장소로 최신 변경 사항을 가져 오는 데 사용하십시오 . 이 경우 로컬 리포지토리를 변경 했으므로 변경 내용을 가져 오려면 병합이 필요합니다.

설명 할 예제와 그림을 제공하겠습니다. 출발지 / 지점에서 마지막으로 가져간 것이 커밋 B에 있다고 가정합니다. 일부 작업을 완료하고 커밋했습니다 (커밋 C). 동시에 다른 누군가가 작업을 완료하고 원산지 / 지점으로 옮겼습니다 (커밋 D). 이 두 가지간에 병합이 필요합니다.

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

푸시하려는 사람이기 때문에 Git은 강제로 병합을 수행합니다. 이렇게하려면 먼저 출발지 / 분기에서 변경 사항을 가져와야합니다.

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

병합을 완료 한 후에는 변경 사항을 푸시하여 원산지 / 분기를 커밋 E로 빨리 감을 수 있습니다.

Git은 병합이 충돌을 일으킬 수 있으므로 병합을 직접 처리해야합니다.


7
병합하지 않으려면 어떻게해야합니까? 그리고 D를 사이드 브랜치로 남겨 두십시오 (적어도 지금은). 나중에 C 이후에 더 많은 것을 커밋 할 수 있습니다. 다른 사람이 D 후에 더 많은 것을 저지를 수도 있습니다. 서두르십시오. 병합하지 않고 사이드 브랜치를 푸시하려면 어떻게해야합니까? ~~~
Steve Pitchers

3
로컬 / 분기 및 원점 / 분기는 동일한 분기를 나타내지 만 다른 머신에 있습니다 (로컬 대 원점). 로컬 / 분기를 푸시하는 것은 원점 / 분기를 업데이트하는 것입니다. 브랜치의 상태를 다른 사람 (예 : 원점)에서 볼 수 있지만 원점 / 분기와 병합하지 않으려면 로컬 / 브랜치 (git branch [name])에서 새 브랜치를 생성해야합니다. 원점에 그 브랜치를 푸시 (자식 푸시 -u 원점 [이름])
제이크 그린

1
좋은 설명입니다. 이 비디오 는 @JakeGreene이 설명하는 것처럼 문제에 대한 간단한 데모와 새로운 저장소를 설정할 때 처음에 문제를 피하는 두 가지 방법을 보여줍니다.
Kevin Markham

4
년 후, 그냥이 답변은 매우 매우 유사 것 같습니다 이 다른
superjos

1
나를 위해 git pull또한 인쇄 Already up-to-date. 내가 비록 비록 내가 지점에 없었지만 분리 된 HEAD 지점 (아마도 병합이 실패했을까요?). 이것은 실행 후 분명했다 git branch. 실행 후 git checkout mybranch모든 것이 예상대로 작동했습니다.
strider

200

푸시하기 전에 코드를 업데이트 했습니까?

git pull origin master아무것도 밀기 전에 사용하십시오 .

나는 당신이 origin당신의 리모컨의 이름 으로 사용한다고 가정합니다 .

다른 사람이 이미 코드를 업데이트 한 경우를 대비하여 무언가를 푸시하기 전에 로컬 저장소를 최신 상태로 유지하려면 푸시하기 전에 가져와야합니다 github.com. 이는 로컬에서 충돌을 해결하는 데 도움이됩니다.


1
리포지토리 이름을 어떻게 알 수 있습니까? 내가 git pull origin mastergit을 입력하면'origin' does not appear to be a git repository
ziyuang 님이

3
'원산지'는 리모컨입니다. git remote --verbosegit 폴더 아래에 구성된 모든 원격을 보는 데 사용할 수 있습니다 . 화면에 표시되는 정보에는 "git@github.com"경로 또는 HTTPS 경로가 포함되며 여기에서 푸시 위치를 식별 할 수 있습니다. 도움이 되었기를 바랍니다 !
AYK

16
git pull origin master이미 최신 상태로 표시 합니다. 그러나 origin_branch를 밀어 넣으려고하면 문제에서 언급 한 것과 동일한 경고가 표시됩니다. 어떠한 제안 !!
CoDe

2
@Shubh 문제를 해결 한 적이 있습니까? 나는 같은 것을 얻는다!
OriginalAlchemist

3
@OriginalAlchemist yes .. 때문에 나는 원격 로컬 브랜치에서 일하는 개발자 일뿐이므로 로컬 브랜치를 강제 푸시했습니다. git push -f <remote> <branch>예를 들어 git push origin <your_local_branch>스레드를 확인하십시오 .
CoDe

122

이것은 일반적으로 다른 누군가가 이미 변경 한 지점 에서 변경을 git commit시도 할 때 발생합니다 .git pushgit pullingx

정상적인 흐름은 다음과 같습니다.

1 단계 : git stash해당 지점에서 커밋되지 않은 로컬 변경 사항

2 단계 : git pull origin branch_name -vpull and merge해당 분기에 로컬로 최선을 다하고 변화 ( 이 병합에게 어떤 메시지를주고, 수정 충돌이있는 경우. )

3 단계 : ED 변경 ( 당신이 원하는 또는 첫번째) 커밋 변경 (STEP4 이미 밀어 나중에 파일에 커밋 새로운 만들 경우에 당신은 터진 파일에 커밋을 만들 수 있습니다. )git stash popstash

4 단계 : git push origin branch_name -v병합 된 변경 사항

교체 branch_name와 함께 master(대한 master지점).


3
어디 commit입니까? 이후에 변경 사항을 커밋해서는 안 stash pop됩니까?
mehmet

해야 돼 일반적으로 병합 된 코드를 먼저 푸시 한 다음 커밋되지 않은 로컬 변경 내용을 커밋합니다. 한 번에 커밋하고 푸시 할 수도 있습니다. 단지 선호.
prayagupd

51

첫 번째 간단한 솔루션 (권장하지 않음)

  • 이 명령을 사용해보십시오 git push -f origin master.
  • 이 명령은 원격 저장소 (GitHub)를 강제로 덮어 씁니다.

권장 솔루션

  • 다음 명령을 실행하십시오.
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

이것이 작동하지 않으면 🔰를 따르십시오.

  • .git폴더에서 디렉토리를 삭제 하십시오.
  • 그런 다음 다음 명령을 실행하십시오.

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

또는

git push -f origin master 

당신을 위해 작동하지 않는 git push -f origin master경우 에만 사용 -u하십시오.

이렇게하면 파일을 푸시하는 동안 발생하는 거의 모든 종류의 오류가 해결됩니다.


4
자식 저장소를 삭제하고 커밋 기록을 모두 잃는 것이 "권장"솔루션입니까? 성급한 것 같습니다.
Nils Guillermin

@Nils Guillermin 상황에 따라 다릅니다. 모든 병합 충돌을 해결 해야하는 대규모 프로젝트를 수행하는 경우 vscode를 사용하여 모든 변경 사항을 쉽게 검토하고 병합합니다. 그래도 귀하의 의견에 감사드립니다.
Patel Smit

47

때때로 우리는 당기기를 잊고 지역 환경에서 많은 일을했습니다.

누군가가 당기지 않고 밀고 싶다면

git push --force

작동합니다. 다른 사람과 함께 작업 할 때는 권장하지 않지만 작업이 간단한 일이거나 개인 장난감 프로젝트 인 경우 빠른 솔루션이됩니다.


$ git push --force origin master
shaurya uppal

2
이것은 나를 위해 일했습니다 : 0 명의 다른 공동 작업자와의 개인 프로젝트. 나는 여기에 몇 가지 다른 제안 된 "솔루션"을 시도했지만 그중 아무것도 매우 간단한 문제를 해결하지 못했습니다. 나는 reset --hard이전 커밋에 로컬 을 수행 한 다음 몇 가지를 더 수행했습니다. 그런 다음 방금 원했지만 push원격 리포지토리를 사용하지 못했습니다. WarrenP는 실제로 덜 렁 거림으로써 자식 학습자를 도울 수 있습니다. 어쩌면 그는 원하지 않을 수도 있습니다.
마이크 설치류

2
사용하지 않거나 올바르게 사용하는 법을 배우십시오. 팀이 공유하는 중요한 중앙 저장소에 강제로 푸시하면 모든 중요한 저장소에 대한 푸시 액세스 권한을 모두 잃어야합니다. 대체 방법을 배우지 않기 위해 자신의 개인 저장소에서 수행하는 작업은 결국 공유 저장소에 대한 작업 능력에 영향을 미칩니다. 강제 푸시 이전에 무슨 일이 있었는지 알고 있다면 때로는 강제 푸시가 정상입니다. 그렇지 않으면 결코 괜찮습니다.
워렌 P

35

Git이 푸시하려는 브랜치를 모르기 때문에 일부 사용자에게이 오류가 발생할 수 있습니다.

오류 메시지에 다음이 포함 된 경우

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

그런 다음 Jim Kubicek의 편리한 팁 ( 현재 분기 만 푸시하도록 Git 구성 )을 따라 기본 분기를 현재로 설정하십시오.

git config --global push.default current

32
git pull origin branch_name --rebase

이것은 나를 위해 일했습니다. 명령 git pull origin branch_name --rebase은 처음에 원격 branch_name에서 변경 사항을 가져온 다음 rebase맨 위에 현재 분기를 가져옵니다.


20

위의 답변 외에도 다음이 저에게 효과적이었습니다.

시나리오-

  1. 나는 밀어 my_branch를 성공적으로 원점.
  2. 몇 가지 더 변경했습니다.
  3. 다시 추가하려고 시도했을 때 (물론 add, commit을 수행 한 후) 위에서 언급 한 오류가 발생했습니다.

해결책 -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

증명


1
당신은 나를 도왔습니다. 나는 --all깃발을 사용하여 다른 지점을 당기고 있는데도 다른 지점을 체크 아웃하고 원격에서 가져와야한다는 것을 알기 어려웠습니다 .
MZanetti

18

나는 똑같은 문제를 겪었다.

git push --force

파일을 커밋 한 후이 작업을 수행 한 결과 오류가 발생했습니다. 모든 파일을 커밋하고 푸시했습니다. 다음에 나는 github으로 밀어 넣을 때 나는 그것이 나에게 요구 한 것을 행했고 그때는 괜찮았다. 이것이 당신을 위해 작동하기를 바랍니다 :)


작동하지만 원하는 것이 아닐 수도 있습니다! 그것은 기본적으로 이제 영원히 사라질 변화를 무시한다는 것을 의미합니다.
굴림

3
git push --set-upstream origin master --force
Legends

1
저장소를 파괴하는 좋은 방법. 강제로 밀면 역사가 파괴됩니다. 또한 많은 전문 설정 git 코드베이스는이를 허용하지 않습니다.
올리버 딕슨

이것은 중복 답변이며 원본은 어쨌든 훌륭한 조언이 아닙니다.
moopet

이것은 내가 원하는하지만 디자인에 의해 난 그냥 Gitlab으로 시도하고 Gitlab는 "보호 가지"에서이 작업을 허용하지 않는 것을 실제로
jeffery_the_wind

13

튜토리얼 GitHub 사용법 : 초보자를위한 튜토리얼 에서 이것을 언급했습니다 .

GitHub에서 새 리포지토리를 생성하면 GitHub에서 readme 파일을 생성하도록 요청할 수 있습니다. GitHub에서 직접 readme 파일을 생성하는 경우 'push'요청이 성공하기 전에 먼저 'pull'요청을해야합니다. 이 명령은 원격 저장소를 '풀'하고 현재 파일과 병합 한 다음 모든 파일을 다시 GitHub에 '푸시'합니다.

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master

나는 이것이 1 년 후인 것을 알고 있지만,이 모든 대답 중에서, 당신은 내가 왜 이미 github으로 첫날 문제를 겪고 있는지 설명 한 유일한 사람이었습니다. 풀과 페치의 차이점은 무엇입니까?
Xander Luciano

1
Fetch를 사용하면 변경 사항을 로컬 지점에 병합하지 않고도 변경 내용을 확인할 수 있습니다. 끌어 오기는 가져오고 병합하는 바로 가기입니다. 지난 13 개월 동안 그 사실을 알았을 것입니다. 나는 내 자신의 혼란을 만들었 기 때문에 그냥 지나가고 있습니다. ;-)
wolfhoundjesse

6

현재 지점을 푸시하려고 할 때 위에서 언급 한 오류 메시지가 나타납니다 foobar.

git checkout foobar
git push origin foo

동일한 원격 지점을 추적하는 두 개의 로컬 지점이있는 것으로 나타났습니다.

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

그것은 다음을 사용하여 현재 지점을 밀어 넣는 데 효과적이었습니다.

git push origin foobar:foo

...와 정리 git branch -d


6

자식 푸시 -f 원점 branchname

원격 지사 코드가 필요하지 않은 경우에만 위의 명령을 사용하십시오. 그렇지 않으면 먼저 병합 한 다음 코드를 푸시하십시오.


5
이것은 잘못된 답변의 복제본입니다.
moopet

5

현재 프로젝트를 가져오고 싶지 않고 (병합 충돌에 직면하지 않아도 해결하지 않아도 됨) 다른 브랜치를 만들지 않으려는 경우 (다른 브랜치를 관리하기가 지루할 것입니다) 위험하고 영구적 인 자식을하고 싶지 않습니다. force 명령을 (명령을 읽은 후에도 수행하는 의미에 대해 종종 놀랍습니다.)

해결책 : 간단하게 폴더의 내용을 다른 폴더로 드래그하고 프로젝트를 지금 빈 폴더로 가져오고 가져온 컨텐츠를 휴지통으로 드래그 한 다음 올바른 프로젝트를 폴더로 다시 드래그하면됩니다. 제대로 밀어 넣고 원하는 결과를 얻을 수 있어야합니다. 말 그대로이 작업을 수행하는 데 10 초도 걸리지 않습니다.

나에게 이것이 어떤 결과를 언급하지 않으면 나에게 적절하지 않다고 말하거나, 나에게 미래의 성가심을 유발하는 명령을 사용하라고 말한 사람들에게 나는이 방법이 문자 그대로 10 초도 걸리지 않는다고 말한다. 구현하는 데 10 초 미만이 걸리고 똑같은 효과가있는 git 명령이 발생하면 그것을 채택 할 것입니다. 그때까지 나는이 방법을 사용하고 있습니다.

이 방법의 한 가지 단점은 병합을 문서화하지 않고 실제로 브랜치에서 병합 할 때 커밋 히스토리가 선형으로 표시된다는 것입니다. 그룹으로 작업 할 때 이것이 최선의 방법이 아닐 수도 있습니다. 이 경우 지점에서 일하십시오!


4

방금 같은 문제가 있었지만 제 경우에는 리모콘에 잘못된 분기를 입력했습니다. 따라서이 문제의 또 다른 원인 인 것 같습니다 ... 올바른 지점으로 푸시하고 있는지 다시 확인하십시오.


1
그리고 나는 완전히 다른 저장소에 대한 이전 명령을 회상했던 비슷한 것을 가졌습니다!
Clare Macrae

4

나는 똑같은 문제를 겪었고 내가 생각했던 것과 다른 (로컬) 브랜치에 있었고 올바른 로컬 브랜치가 원격에서 커밋 된 것으로 나타났습니다.

내 솔루션 : 올바른 지점을 체크 아웃하고 다른 로컬 지점에서 커밋을 체리 선택하십시오 .git pull 및 git push


4

비슷한 문제가 있었으며 지점을 최신 상태로 유지하기위한 워크 플로에 결함이있는 것으로 나타났습니다. 나는 다음을하고 있었다 :

내 로컬 '마스터'에서

git fetch upstream
git merge upstream/master --ff-only

그런 다음 현지 지점으로 돌아갑니다.

git rebase master

이것은 이전 git flow에서는 잘 작동했지만 github에서는 작동하지 않았습니다. 은 git rebase동기화 문제를 일으키는 문제는 여기에 있었다 (그리고 나는 내가 완전히 이해하지 않고 동의 했어 뭔가 인정한다) 불행하게도 위치에 나를 넣어 git push -f아마 가장 쉬운 옵션이되었다. 안좋다.

나의 새로운 흐름은 git merge다음과 같이 직접 분기를 업데이트하는 것입니다.

내 현지 지점에서

git fetch upstream
git merge upstream/master

현지 지점에서 코스를 변경했기 때문에 빨리 감기는 없습니다.

당신이 아마 알 수 있듯이, 나는 git 전문가는 아니지만이 워크 플로우는 내가 가진 특정 문제를 피할 수 있다는 것을 확실하게 알고 있습니다.


3

내 경우에는 "mybranch"를 체크 아웃하고 완료 git pull했으므로 푸시가 작동하지 않는 이유를 알 수 없었습니다. 결국, 나는 내가 잘못된 지점을 밀고 있다는 것을 깨달았습니다. git push origin master대신에 입력하고있었습니다 git push origin mybranch.

따라서 이미이 git pull메시지를 받았는데도 여전히 올바른 분기를 추진하고 있는지 확인하십시오.


3

지점 이름이 원격 지점 이름과 동일합니까?

그렇지 않은 경우 원격 지점과 이름이 같은 새 지점을 체크 아웃 한 후 다시 밀어야합니다.

푸시하려는 원격 분기가 [ testing ]이고 로컬 분기의 이름이 [ test ] 라고 가정하십시오 .

테스트 브랜치에 있지 않다면 먼저 스위치로 전환하십시오.

git checkout test

그런 다음 새 분기를 열고 이름을 testing으로 지정하십시오 .

git checkout -b testing

이제 밀어 붙일 시간입니다 :

git push [remote repo] testing

2
$git branch -M <new_name>로컬 지점의 이름을 바꾸려면 사용하십시오 .
coms

3

내 GIT 리포지토리에서이 문제를 해결했습니다. 할 필요가 없습니다 rebase또는 force이 경우 커밋합니다. 이 문제를 해결하려면 아래 단계를 사용하십시오.

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

그것이 도움이되기를 바랍니다.


2

또 다른 해결책은 가능한 경우 다른 커밋을 수행하여 리모컨 헤드를 전진시키는 것입니다. 이 고급 헤드를 로컬 하위 트리로 가져간 후 다시 해당 서브 트리에서 푸시 할 수 있습니다.


2

gitweb에 사용하는 베어 Git 저장소로 최신 변경 사항을 푸시하는 동안 비슷한 오류가 발생했습니다 . 필자의 경우 베어 리포지토리를 변경하지 않았으므로 베어 리포지토리를 삭제하고 다시 복제했습니다.

git clone --bare <source repo path> <target bare repo path>

2

아무도 git 저장소를 변경하지 않았고 최신 버전을 사용하고 있다고 확신하는 경우 ,git pull 당신의 마음에있는 솔루션으로 이해가되지 않습니다 ...

그리고 이것은 아마도 일어난 일입니다. git commit --amend

완전히 새로운 스냅 샷으로 커밋하지 않고 단계적 변경 사항을 이전 커밋과 결합 할 수 있습니다. 또한 스냅 샷을 변경하지 않고 이전 커밋 메시지를 간단히 편집하는 데에도 사용할 수 있습니다.

ATLASSIAN 튜토리얼 : 기록 재 작성

그러나 git commit --amend 이미 커밋을 GitHub로 푸시 한 경우 수행하지 않는 것이 좋습니다. 이는 "최근 커밋을 변경하는 것이 아니라 완전히 교체하는 것입니다. Git에게는 완전히 새로운 커밋처럼 보일 것입니다" 즉, GitHub의 다른 개발자에게는 역사가 A-> B-> C처럼 보이지만 GitHub에서 허용하면 A-> B-> D처럼 보입니다.push 다른 모든 사람들은 수동으로 역사를 수정해야합니다.

이것이 당신이 오류 메시지를 얻는 이유입니다. ! [rejected] master -> master (non-fast-forward)최근의 변화를 가져간 사람이 아무도 없다는 것을 알고 있다면, 당신은 할 수 있습니다git push --force . 이것은 당신의 공개 리포지토리의 git history를 바꿀 것 입니다. 그렇지 않으면 ...를 수행 할 수 git pull있지만 이것이 수행 하지 않은 것과 동일한 결과를 낳을 것이라고 믿습니다.git commit --amend . 새로운 커밋을 생성합니다 (예 : git pull 후 git history : A-> B-> C-> D )

자세한 내용 : 최신 커밋을 변경하는 방법


2

또 다른 옵션 : 지점의 이름을 로컬로 바꾸십시오.

그런 다음 예를 들어 사본 (백업)을 유지하고 손실되지 않는 방법 인 경우이를 원격 저장소로 푸시 할 수 있습니다.

원격 브랜치를 가져와 로컬 사본을 가져 와서 (i) 원격에 있던 것 (이전 브랜치 이름이있는 것)과 (ii) 가지고있는 것 (새로운 브랜치 이름이있는 것)의 차이점을 조사하고 수행 할 조치를 결정할 수 있습니다. . 처음부터 리모컨의 차이점을 알지 못했기 때문에 (문제가 생겼습니다) 변경 사항을 어딘가에 병합하거나 적용하는 것은 너무나 잔인합니다.

차이점을 살펴보고, 작업하려는 지점을 선택하고, 다른 지점에서 원하는 체리 픽 변경 사항을 선택하거나, 원하는 지점에서 원하지 않는 변경 사항을 되 돌리십시오.

그런 다음 클린 버전을 리모컨에 강제로 적용할지 아니면 새로운 변경 사항을 추가할지 등을 결정할 수있는 위치에 있어야합니다.


1

push 명령의 문제점은 로컬 및 원격 저장소가 일치하지 않는다는 것입니다. git hub에서 새 저장소를 만들 때 기본적으로 readme를 초기화하면 마스터 분기가 자동으로 생성됩니다. 그러나 푸시하려고하면 분기가 없습니다. 푸시 할 수 없습니다 ... 따라서 가장 좋은 방법은 기본 readme 초기화없이 저장소를 작성하는 것입니다.


1

이 문제는 일반적으로 커밋으로 계산 된 readme.md 파일을 생성하여 시스템에서 로컬로 동기화되지 않으며 헤드 뒤에서 부족하므로 git pull 요청을 표시합니다. readme 파일을 피하고 커밋을 시도 할 수 있습니다. 내 경우에는 효과가있었습니다.


0

이 문제의 또 다른 원인 (명백히 흔하지는 않음) ...

푸시를했을 때 서버가 ~ 12 시간 뒤에있었습니다.

서버 SYNC에서 NTP를 구성했습니다.

이 게시물에서 논의 된 오류를 유발하는 새로운 git push를 실행했습니다.


0

우연히 git pull인쇄 Already up-to-date되면 전역 git push.defaultparam (In ~/.gitconfig) 을 확인하고 싶을 수도 있습니다 . 에있는 simple경우로 설정하십시오 matching. 아래 답변은 이유를 설명합니다.

힘내-push.default "matching"과 "simple"의 차이점은 무엇입니까?

또한 현지 지사가 구식이 git remote show origin아닌지 확인하고 필요한 경우 풀을 수행하는 것이 좋습니다.


0

사용 git pull https://github.com/username/repository Github에서 원격 저장소가 동기화되지 않은 때문입니다. 당신이 경우 pull의 repo하고 Push모든 동기화되며 오류가 멀리 갈 것입니다.

`


0

git pull 이미 인쇄 up-to-date

해결책:

당신은 remote (server)에 저장소 / 프로젝트를 생성하고 거기에 파일을 추가 한 다음 로컬 및 초기화 된 자식에 폴더를 다시 생성했습니다 git init-이것은 실수입니다 .git init 로컬에 복제 프로젝트 대신, 현지에 사용git clone

그런 다음 당겨

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