힘내 푸시를 올바르게 강제하려면 어떻게해야합니까?


1273

맨손이 아닌 "기본"원격 저장소를 설정하고이를 내 컴퓨터에 복제했습니다. 로컬 변경을 수행하고 로컬 저장소를 업데이트 한 후 변경 사항을 다시 원격 저장소로 푸시했습니다. 그 시점까지는 문제가 없었습니다.

이제 원격 저장소에서 무언가를 변경해야했습니다. 그런 다음 지역 리포지토리에서 무언가를 변경했습니다. 나는 원격 저장소에 대한 변경이 필요하지 않다는 것을 깨달았습니다. 그래서 git push로컬 리포지토리에서 원격 리포지토리로 시도했지만 다음과 같은 오류가 발생했습니다.

히스토리가 손실되지 않도록하기 위해 빨리 감기가 아닌 업데이트가 거부되었습니다. 다시 변경하기 전에 원격 변경 사항을 병합하십시오. 자세한 내용은 '빨리 감기에 git push --help대한 참고 사항 '섹션 을 참조하십시오.

아마 그 생각

git push --force

로컬 사본이 변경 사항을 원격으로 푸시하고 동일하게 만듭니다. 업데이트를 강제로 수행 하지만 원격 저장소로 돌아가 커밋을 수행하면 파일에 오래된 변경 사항 (주 원격 저장소가 이전에 있던 변경 사항)이 포함되어 있음을 알 수 있습니다.

내가 답변 중 하나 에 대한 의견 에서 언급했듯이 :

[I] 강제로 시도했지만 변경 사항을 저장하기 위해 마스터 서버로 돌아갈 때 오래된 스테이징이 발생합니다. 따라서 리포지토리를 커밋 할 때 동일하지 않습니다. 그리고 git push를 다시 사용하려고하면 동일한 오류가 발생합니다.

이 문제를 어떻게 해결할 수 있습니까?


4
곧 (git1.8.5는, Q4 2013) 할 수 DO가 git push -force주의 깊게 더 .
VonC


6
내 자신의 대답에 나는 세부로 , git push --force참으로 힘 푸시에 다른 유효한 방법이며, 같은 단지뿐만 아니라 지점을 밀어 버린다 git push origin master --force망할 놈의 기본에 push.default config settings가지 구체적 2.0 이후 대 2.0 이전 망할 놈의 버전과 다릅니다 얻을수있는 불구하고.

2
git push --force요즘 잘 작동, FWIW ...
rogerdpack

git push --force-with-lease더 잘 작동합니다 :), 그것은 당신이 기대하는 상태가 아닌 한 지점 업데이트를 거부합니다. ( developer.atlassian.com/blog/2015/04/force-with-lease 참조 )
spoorcc

답변:


2306

그냥 해:

git push origin <your_branch_name> --force

또는 특정 저장소가있는 경우 :

git push https://git.... --force

그러면 이전 커밋이 삭제되고 현재 커밋이 푸시됩니다.

적절하지 않을 수도 있지만, 누군가이 페이지를 우연히 발견하면 간단한 해결책을 원할 것이라고 생각했습니다 ...

짧은 깃발

또한 노트 -f에 대한 짧은 --force, 그래서

git push origin <your_branch_name> -f

작동합니다.


58
git push origin +master대신 여러 개의 참조 스펙을 모두 강제하지 않고 푸시 할 수있는 대신 사용할 수 있습니다 .
nickgrim

5
실수로 단지 않는 경우,주의하십시오 git push --force, 당신은 당신에게 마스터 분기를 엉망으로 끝낼 수 있습니다 .. 어떤 빨 수있는 (당신의 푸시 기본 동작에 따라) .. 약간 .. : D
Jeewes

9
@Jeewes Git 버전 2.0부터 기본 동작 git push --force은 기본적으로 현재 체크 아웃 된 분기를 원격 카운터 부분으로 강제 푸시하는 것입니다. 따라서 마스터 분기가 체크 아웃 된 경우와 동일합니다 git push origin master --force. 에 대한 matching설정을 사용하는 경우에는 달라집니다 push.default. 2.0 이전의 Git 버전의 기본값입니다. 모든 지역 지점을 같은 이름을 가진 원격 지점으로 matching푸시 합니다 . 따라서 강제로 밀어

@Jeewes 그러나 Git 2.0을 사용하면 기본값이 더 안전하거나 적어도 위험하지 않습니다 git push origin master --force.

2
대부분의 회사 리포지토리에는 마스터에 대해 -f가 비활성화되어 있으므로 push -f는 양호하지만 마스터에 대해 권장되지 않습니다. merge -s ours나를 위해 일했다
mihai

247

그리고 작동 push --force하지 않으면 할 수 있습니다 push --delete. 이 인스턴스 에서 두 번째 줄을 살펴보십시오 .

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

그러나 조심하십시오 ...

공개 자식 기록으로 돌아 가지 마십시오!

다시 말해:

  • force공공 저장소를 강요 하지 마십시오 .
  • 이 작업이나 다른 사람의 작업을 중단시킬 수있는 작업은하지 마십시오 pull.
  • 누군가가 이미 뽑은 리포지토리reset 또는 rewrite역사를 절대로 보지 마십시오 .

물론이 규칙에도 예외적 인 경우는 거의 없지만 대부분의 경우이를 수행 할 필요가 없으며 다른 모든 사람에게 문제가 발생합니다.

대신 되 돌리십시오.

그리고 당신이 공개 리포지토리에 푸시하는 것에 항상주의하십시오 . 되돌리기 :

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

실제로, 모두 기원 헤드 (로부터 되돌리기 과에서 악을 재설정 ) 동일한 파일을 포함합니다.


업데이트 된 정보와 더 많은 인수를 추가하도록 편집 push --force

푸시 대신 임대로 강제로 푸시하는 것을 고려하지만 여전히 되돌리기를 선호합니다

또 다른 문제 push --force는 누군가가 당신을 보내기 전에, 그러나 당신이 이미 가져온 후에 무언가를 밀 때입니다. 당신이 지금 당신 의 rebased 버전 을 강요하면 당신 은 다른 사람의 작업을 대체합니다 .

git push --force-with-leasegit 1.8.5에 도입 된 ( 질문에 대한 @VonC 의견 덕분에 )이 특정 문제를 해결하려고합니다. 기본적으로 최신 가져 오기 이후 원격을 수정 한 경우 오류가 발생하고 푸시되지 않습니다.

실제로 a push --force가 필요하지만 더 많은 문제를 방지하려는 경우에 좋습니다 . 나는 그것이 기본 push --force행동 이어야한다고 말하기 위해 갔다 . 그러나 여전히 강제로 변명하는 것은 아닙니다 push. 리베이스 하기 전에 가져온 사람들 은 여전히 ​​많은 문제를 겪게 되며, 대신 되돌려 놓으면 쉽게 피할 수 있습니다 .

우리가 git --push인스턴스 에 대해 이야기하고 있기 때문에 ...

왜 누군가 강제로 밀어 붙이고 싶습니까?

@linquize는 의견에 좋은 푸시 힘의 예를 가져 : 민감한 데이터를 . 푸시해서는 안되는 데이터가 잘못 유출되었습니다. 당신이 충분히 빠르면, 당신은 상단에 강제로 밀어 "고정" 할 수 있습니다 *.

*데이터는 여전히 원격에있을 것입니다 당신은 또한 할 않는 한 의 수집을 , 또는 어떻게 든 청소 . 이미 가져온 다른 사람들에 의해 전파 될 가능성도 있지만 아이디어를 얻을 수 있습니다.


1
@rogerdpack이라는 문제는 가능한 경우가 아닙니다. 그것은. 그러나 그것은 큰 재앙으로 요약 될 수 있습니다. 더 많은 사람이할수록 (강제 푸시) 공개 리포지토리에서 업데이트를 덜 자주 (풀) 덜할수록 재난이 더 커집니다. 당신이 알고 있듯이 세상을 해체 할 수 있습니다 !!! 111 최소한 그 특정 저장소로 구성된 세상.
cregox

3
민감한 데이터가있는 경우 강제로 푸시
linquize

3
@Cawas : 저장소에서 민감한 데이터를 제거하려고하면 히스토리를 다시 쓰고 싶다고 생각 합니다. 되 돌리면 민감한 데이터는 여전히 이전 커밋에 있습니다. 즉, 다른 사람이 이미 저장소에서 가져온 경우 기록을 다시 쓰면 중요한 데이터에 액세스하지 못하도록 막을 수 없습니다. 이미 그 시점에 너무 늦었습니다.
Stuart Golodetz

3
git push origin master --delete # do a very very bad bad thing git push origin master # regular push이것은 실제로 내 문제를 완벽하게 해결했습니다 (나와 내 친구 만있는 레포에서). 어쩌면 공개 리포지토리에 대해서는 잘못된 것일 수도 있지만 개인 리포지토리에 대해서는 생명을 구하는 것입니다.
수 Poyrazoğlu

1
이것은 일부 repo 관리자, 일명 자동 스쿼시 등에서 자동으로 발생합니다. 커밋을 줄이기 위해 기능 분기를 완료 한 후 강제로 푸시하는 것이 일반적이며 예상됩니다.
FlavorScape

18

우선, "메인"저장소에서 직접 변경하지 않습니다. 정말로 "메인"레포지토리를 원한다면, 직접 푸시하지 말고 직접 바꾸십시오.

오류가 발생하면 git pull로컬 리포지토리 git push에서 주 리포지토리로 시도해 보셨습니까? 당신이 현재하고있는 것은 (내가 잘 이해하고 있다면) 푸시를 강요 한 다음 "메인"리포지토리에서 변경 사항을 잃어 버리는 것입니다. 변경 사항을 로컬로 먼저 병합해야합니다.


예, 풀을 시도했지만 풀로 인해 데이터 손실이 발생합니다. 먼저 메인에서 업데이트하지 않고 로컬 리포지토리로 메인 리포지토리를 만들고 싶습니다.
Spyros

1
이 경우을 사용 git push -f하고 기본 리포지토리를 다시 변경하면 로컬 리포지토리 및로 돌아가서 git pull최신 변경 내용과 동기화되도록해야합니다. 그런 다음 작업을 수행하고 다시 밀어 넣을 수 있습니다. 이 "푸시 풀"워크 플로우를 따르면 불만을 제기 한 종류의 오류가 발생하지 않습니다.
ubik

그래, 나는 이것이 내 잘못이라는 것을 이해한다 : / 나는 그것을 시도하고 잠시 동안 고마워 할 것이다
Spyros

1
강제로 시도했지만 변경 사항을 저장하기 위해 마스터 서버로 돌아갈 때 오래된 스테이징이 발생합니다. 따라서 리포지토리를 커밋 할 때 동일하지 않습니다. 그리고 git push를 다시 사용하려고하면 동일한 오류가 발생합니다.
Spyros

17

로컬 분기 A에 있고 로컬 분기 B를 원점 분기 CI로 강제 푸시하려면 다음 구문을 사용할 수 있습니다.

git push --force origin B:C

2
현지 지사 B에도 있어도 여전히해야한다는 것을 알았습니다 git push --force origin B:C. 제 경우에는 git push --force origin C현재 어떤 브랜치에 관계없이 로컬 마스터에서 원격 C 브랜치로만 푸시 하는 것 같습니다 . git version 2.3.8 (Apple Git-58)
Weishi Zeng

12

다음 명령을 사용하십시오.

git push -f origin master

1
이 답변이 다른 답변보다 선호되는 이유와 다른 이유에 대해 좀 더 설명해보십시오.
Adam

아, 불편을 끼쳐 드려 죄송합니다. 같은 문제가 발생하여이 명령으로 문제를 해결했습니다. 공유해야한다고 생각했습니다.
mustafa Elsayed

12
그것은 다른 사람들과 똑같습니다. 당신은 -f깃발 의 위치를 ​​바꿨습니다 ...
svelandiag

11

나는 정말로 다음을 추천한다 :

  • 메인 레포에만 밀기

  • 기본 리포 작업 트리가 기본 과 동기화되지 않는 문제가 발생하지 않도록 메인 리포지토리가 베어 리포지토리 인지 확인하십시오 .git. "을 참조하십시오 다른 컴퓨터에 로컬 Git 저장소를 밀어 방법? "

  • 메인 (맨손) 리포지토리에서 수정해야하는 경우 복제 (메인 서버)하고 수정 한 후 다시 푸시하십시오.

다시 말해, 풀 / 풀할 단일 업스트림 리포지토리를 가지려면 기본 서버와 로컬 컴퓨터 모두에서 베어 리포지토리에 액세스 할 수 있어야합니다.


5

히스토리를 유지하면서 회사 gitHub 리포지토리에서 마스터를 교체하는 솔루션이었습니다.

push -f회사 리포지토리를 마스터하는 것은 종종 분기 기록을 유지하기 위해 비활성화됩니다. 이 솔루션은 우리에게 효과적이었습니다.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

지사를 desiredOrigin홍보하고 PR 만들기


3

나는 같은 질문을했지만 마침내 알아 냈습니다. 가장해야 할 일은 다음 두 가지 git 명령을 실행하는 것입니다 (git commit 개정 번호로 해시 바꾸기).

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