당신이 밀어 경우가 서버에 커밋 한 다음 (로컬로 커밋이 다시 git reset
, git rebase
, git filter-branch
, 또는 다른 어떤 역사 조작) 한 다음 다시 쓴 서버에 백업 커밋 밀어, 당신은 당겨했다 다른 사람을 망치는 것입니다. 여기에 예가 있습니다. A를 커밋하고 서버로 푸시했다고 가정합니다.
-*-*-A <-마스터
-*-*-A <-원산지 / 마스터
이제 A를 다시 작성하기로 결정했습니다. 앞서 언급 한대로 재설정하고 다시 커밋합니다. 이것은 매달린 커밋 A를 남기고 결국 도달 할 수 없기 때문에 가비지 수집됩니다.
-*-*-ㅏ
\
A '<-마스터
-*-*-A <-오리진 / 마스터
다른 사람, 예를 들어 Fred master
가이 작업을 수행하는 동안 서버에서 내려 오면 A에 대한 참조를 갖게되며 다음에서 작업을 시작할 수 있습니다.
-*-*-A '<-마스터
-*-*-A <-오리진 / 마스터
-*-*-AB <-fred / master
이제 A '를 원점 / 마스터로 밀어 넣을 수 있다면 빨리 감기가되지 않을 것입니다. 역사에 A가 없을 것입니다. 따라서 Fred가 다시 당기려고하면 갑자기 병합해야하고 A 커밋을 다시 도입해야합니다.
-*-*-A '<-마스터
-*-*-A <-오리진 / 마스터
-*-*-AB- \
\ * <-프레드 / 마스터
ㅏ'--/
Fred가이를 알아 차리면 리베이스를 수행하여 커밋 A가 다시 나타나지 않도록 할 수 있습니다. 하지만 그는 이것을 알아 차리고 이것을 기억해야합니다. A를 뽑은 사람이 한 명 이상인 경우 트리에 추가 A 커밋이 발생하지 않도록 모두 리베이스해야합니다.
따라서 일반적으로 다른 사람이 가져 오는 저장소의 기록을 변경하는 것은 좋지 않습니다. 그러나 다른 사람이 해당 리포지토리에서 가져 오지 않는다는 사실을 알게되면 (예 : 자신의 개인 리포지토리이거나 쉽게 조정할 수있는 프로젝트에서 작업하는 다른 개발자 한 명만있는 경우) 강제로 수행 할 수 있습니다. 다음을 실행하여 업데이트하십시오.
git push -f
또는
git push origin +master
둘 다 비 빨리 감기 푸시에 대한 검사를 무시하고 서버에있는 내용을 새 A '개정으로 업데이트하여 A 개정을 포기하여 결국 가비지 수집됩니다.
receive.denyNonFastForwards
config 옵션을 사용하면 강제 푸시가 완전히 비활성화 될 수 있습니다. 이 옵션은 공유 저장소에서 기본적으로 활성화됩니다. 이 경우 정말 강제로 푸시하고 싶다면 가장 좋은 방법은 브랜치를 삭제하고 git push origin :master; git push origin master:master
. 그러나이 denyNonFastForwards
옵션은 위에 설명 된 이유로 활성화됩니다. 공유 저장소에서 이는 이제이를 사용하는 모든 사람이 새로운 기록에 대한 리베이스를 보장해야 함을 의미합니다.
공유 저장소에서는 일반적으로 문제를 해결하는 새 커밋을 맨 위에 푸시하는 것이 좋습니다. git revert
이전 커밋의 변경 사항을 취소하는 커밋을 생성 하는 데 사용할 수 있습니다 .