GitHub에서 원격 변경 사항을 병합하는 방법은 무엇입니까?


137

첫 번째 Github 푸시를 시도하면서 다음과 같은 오류가 발생합니다.

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

이 문제를 해결하고 원격 변경 사항을 병합하려면 어떻게해야합니까?

답변:


106

자세한 내용은 ' git push --help ' 의 '비 빨리 감기'섹션 을 참조하십시오.

"git pull"을 수행하고 잠재적 충돌을 해결하고 결과를 "git push"할 수 있습니다. "git pull"은 커밋 A와 B 사이에 병합 커밋 C를 생성합니다.

또는 "git pull --rebase"를 사용하여 A와 X 사이의 변경 사항을 리베이스하고 결과를 다시 푸시 할 수 있습니다. 리베이스는 A 위에 X와 B 사이의 변경을 빌드하는 새로운 커밋 D를 생성합니다.


16
"git pull"을 수행하는 경우 "이미 최신"이라는 메시지가 표시되는 것을 제외하고는 계속해서 실행합니다. "git pull --rebase"를 수행하면 "현재 지점 마스터가 최신 상태입니다"라는 메시지가 나타납니다. 어떤 아이디어? 감사!
jwl

3
@ larson4 나는 같은 문제가 있지만, 당신이 한 후에 git pull다른 커밋 을 수행하면 좋을 것입니다.
Patrick

20
@Patrick @larson 나는 오류 메시지를주의 깊게 읽지 못했기 때문에 비슷한 문제가 발생했습니다. 거부는 내가 체크 아웃하지 않은 지점에 있었다. 내가 실제로 있었던 지점은 성공했다. 해결책은 git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on입니다.
Noah Spurrier

86

브랜치 이름 앞에 + 기호를 추가하여 강제로 푸시 할 수도 있습니다.

git push origin +some_branch

1
고마워요, 이것은 저에게 효과적입니다. 다른 해결책은 나의 효과를 완전히 지울 것입니다git reset --hard
Oli

1
감사! 프로덕션 환경에서 일부 기능을 테스트하기 위해 지점 "A"를 Heroku 준비 앱으로 푸시했습니다. 그런 다음 (로컬로) "A"와 "B"를 "마스터"로 병합하고 "마스터"를 내 스테이징 앱으로 푸시하고 싶었습니다. 모든 종류의 문제가있었습니다. 이것은 "마스터"를 매우 간단하게 밀어 붙였습니다. 감사!
Don Leatham

나도 일했다. 문제를 찾기 위해 4 시간이 걸렸습니다. 고마워 로컬 컴퓨터 (Windows 7)에서 Netbeans을 실행하고 로컬을 푸시 할 때마다 원격 컴퓨터 (linux)를 확인했습니다.
Maxim Shoustin 2016

이 방법은 안전하지 않을 수 있으며 분기 된 커밋에 도달하지 못할 수 있습니다.
samuil

이것이 허용되는 솔루션이어야합니다. 다른 솔루션은 나를 위해 작동하지 않았다
banarun

20

github에서 병합하지 않은 변경 사항이있을 수 있습니다. git pull변경 사항을 가져오고 병합 하려고 하면 푸시 할 수 있어야합니다. 내가 당신의 질문을 잘못 이해했다면 죄송합니다.


18
원격 마스터에서 변경 사항을 거부하고 자신의 변경 사항을 푸시
해야하는 경우

13

"git pull"이고 "이미 최신"이라고 표시되어 있는데도이 오류가 계속 발생하면 다른 분기 중 하나가 최신이 아니기 때문일 수 있습니다. 다시 "git push"를 시도하기 전에 다른 브랜치로 전환하고 최신 브랜치인지 확인하십시오.

"foo"분기로 전환하여 업데이트하십시오.

$ git checkout foo
$ git pull

당신은 명령을 실행하여 가지고있는 가지를 볼 수 있습니다 :

$ git branch

왜 이것이 작동하고 필요한지 설명 할 수 있습니까? (그것은 내 문제를 해결했다.) 그것은 단지 반 직관적 인 것처럼 보인다. 나는 왜 git이 최신 브랜치를 유지하기 위해 또 다른 브랜치를 필요로하는지 이해할 수 없다.
Quinxy von Besiex

@QuinxyvonBesiex 나는 내 자신을 이해하지 못한다. Git 자체의 기본 구조 및 분기 구성 방법 (기본적으로 이해하는 한 태그와 동일)과 관련이 있습니다.
David Calhoun

7

강제로 푸시 할 수는 있지만 수행중인 작업이 확실한 경우에만 수행하십시오.

명령은 다음과 같습니다.

git push -f 

3

태그가 충돌하는 경우에도이 문제가 발생할 수 있습니다. 로컬 버전과 원격 버전이 다른 커밋에 동일한 태그 이름을 사용하는 경우 여기에서 종료 할 수 있습니다.

로컬 태그를 삭제하면 해결할 수 있습니다.

$ git tag --delete foo_tag

2

이 오류가 발생하면 전체 프로젝트 폴더를 백업했습니다. 그런 다음 같은 것을했다

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... 지점 이름에 따라 다릅니다 (마스터가 아닌 경우).

그런 다음했다 git pull --rebase. 그 후 뽑은 파일을 백업 된 프로젝트 파일로 교체했습니다. 이제 변경 사항을 다시 커밋하고 푸시 할 준비가되었습니다.


0

1) 강제로 로컬 변경 사항을 덮어 씁니다.

로컬에서 수행 된 변경 사항에 신경 쓰지 않고 리포지토리에서 코드를 얻으려는 경우 강제로 풀 수 있습니다. 그러면 컴퓨터에서 수행 된 모든 로컬 변경 사항을 덮어 쓰고 리포지토리에 버전의 복사본이 나타납니다.

IDE에서 다음 명령을 실행하십시오.

git reset-하드

자식 풀

이렇게하면 모든 로컬 변경 사항이 즉시 삭제되므로 수행중인 작업을 알고 로컬 변경 사항이 필요하지 않은지 확인하십시오.

2) 두 변경 사항 모두 유지 (로컬 및 리포지토리에서)

두 변경 사항 (로컬로 수행 된 변경 사항 및 저장소에있는 변경 사항)을 유지하려면 변경 사항을 추가하고 커밋 할 수 있습니다. 당기면 분명히 병합 충돌이 발생합니다. 여기서 IDE의 도구 (예 : Difftool 및 mergetool)를 사용하여 두 코드 조각을 비교하고 유지할 변경 사항과 제거 할 내용을 결정할 수 있습니다. 이것은 중간 방법입니다. 수동으로 제거 할 때까지 변경 사항이 손실되지 않습니다.

자식 추가 $ the_file_under_error

자식 커밋

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