git push --force-with-lease vs. --force
나는 사이의 차이점을 이해하려고 노력하고 있습니다.
git push --force
그리고.
git push --force-with-lease
내 생각에 후자는 로컬 지점에 없는 원격의 커밋이 있는 경우에만 원격으로 푸시하는 것입니까?
force원격 분기를 로컬 분기로 덮어씁니다.
--force-with-lease원격 지점에 커밋이 더 많이 추가된 경우(다른 팀원이나 동료 등에 의해) 원격 지점의 작업을 덮어쓰지 않는 더 안전한 옵션입니다.강제로 다른 사용자의 작업을 덮어쓰지 않도록 합니다.
저는 사령부에 대한 당신의 일반적인 생각이 옳다고 생각합니다.원격 분기의 값이 로컬 컴퓨터의 원격 분기와 동일하면 원격을 덮어씁니다.값이 동일하지 않으면 코드 작업 중에 다른 사용자가 원격 분기에 변경한 내용이므로 코드를 덮어쓰지 않습니다.원격에 추가 커밋이 있는 경우 값이 동일하지 않습니다.
생각나는 것은--force-with-lease팀 동료 코드를 덮어쓰지 않도록 하는 데 사용할 수 있는 옵션입니다.은 우리회많사팀다용니합들이은사의▁at다를 사용합니다.--force-with-leaseFail-Safe의 기본 옵션으로 사용할 수 있습니다.대부분의 경우 불필요하지만 다른 사용자가 원격에 기여한 내용을 덮어쓰게 되면 많은 두통을 줄일 수 있습니다.
문서를 살펴보셨겠지만 여기에 좀 더 구체적인 설명이 포함되어 있을 수 있습니다.
https://git-scm.com/docs/git-push
신뢰할 수 있는 정보원 및/또는 공식 정보원의 답변을 찾습니다.
토레크가 논평과 다른 답변에서 언급한 "비교와 교환"은 Git 자체의 출처에 의해 더 잘 설명됩니다.
후자는 원격이 로컬 지점에 없는 커밋이 없는 경우에만 원격으로 푸시합니까?
이 기능은 이 커밋에서 도입되었습니다(2013년 12월, Git v1.8.5-rc0).
--force-with-lease별도로 명시하지 않는 한 현재 값이 일부 합리적인 기본값과 동일하도록 요구하여 업데이트될 모든 원격 참조를 보호합니다.현재로서는 "일부 합리적인 기본값"을 "업데이트되는 원격의 참조에 대한 원격 추적 분기의 값"으로 잠정 정의하며, 이러한 원격 추적 분기가 없으면 오류입니다.
그래서 "임대"는 다음을 의미합니다.
"
force-with-lease재조정된 내역을 결정하기 위해 가져올 때 참조에 대한 리스를 가져갔다고 가정하고, 리스가 깨지지 않은 경우에만 취소할 수 있습니다.
출처는 여전히 "cas"를 언급하고 있습니다.
- 이 옵션은 원래 "비교와 스왑"을 의미하는 ""("compare and swap")이라고
cas불렸는데, 이는 너무 기술적이어서 아무도 좋아하지 않는 이름입니다.- 두 번째 시도는 그것을 "lockref"(개념적으로 자물쇠를 잡은 후에 밀어주는 것과 같기 때문에)라고 불렀지만, "lock"이라는 단어는 이 옵션이 작동하는 방식이 아닌 다른 사람의 밀어주기를 거부할 수 있다는 것을 암시했기 때문에 싫어했습니다.
- 이번 라운드는 "임대차 강제"라고 부릅니다.
재조정된 내역을 결정하기 위해 가져올 때 참조에 대한 리스를 가져갔다고 가정하고, 리스가 깨지지 않은 경우에만 취소할 수 있습니다.
그래서: "git push --force-with-lease대 대--force"
"기본"push --force-with-lease에서 언급했듯이, Git 2.13 (2017년 2분기)에서 언급했듯이, 옵션은--force-with-lease백그라운드 프로세스(Git 플러그인이 있는 IDE에서 찾을 수 있는 프로세스)가 실행되는 경우 무시할 수 있습니다.git fetch origin.
그런경는에우,는에,--force우세한
그 자체로 무시되는 것은 아닙니다. 로컬 원격 헤드와 원격 헤드에 대한 동일한 참조가 지금 있습니다.
--force-with-lease합니다. push remote를 은 " 올르게동니다합작고하비교바를지가이않와다기가져시간니습안격지군동가하누오이동격같작원을이면하트업다과음원격은이데간의푸사시두,▁will▁as▁--▁remote▁correctly▁behavet▁updated▁won▁behave▁--다니않습,지▁compare하동▁two',작▁in같이▁it▁these▁and과다음▁of▁push▁between▁if▁and▁someone▁interval▁fetch은격올원바,▁that▁time면하다--force여전히 실패할 것입니다.
다른 2), 가 아닌 이 포함된 : Git 2.29 심판(2020년 4분기), ASC 심판의 심판"와 함께 사용되는 II 문자--force-with-lease스마트 HTTP 프로토콜에서 옵션이 작동하지 않았습니다.
와 함께 작동할 것입니다.git push --force.
brian bk2204m. carlson()의 commit cd85b44(2020년 7월 21일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- commit c2796ac, 2020년 7월 30일)
remote-curl만듦--force-with-leaseASCII가 아닌 다른 이름으로 작업보고된 사용자:프레즈 비욘
사인 오프 바이: 브라이언 칼슨.
원격 전송 도우미를 호출하고 인수가 있는 옵션을 전달할 때 필요한 경우 인수를 C 스타일 문자열로 인용합니다.
입니다. cas 은 cas 옵션며이우, 다구을현다니합음이은경션을 합니다.--force-with-leaseASCII가 아닌 refname을 전달할 때 명령줄 플래그가 나타납니다.하만지, 리은콘모
curl분석하기 설계된. 즉, 가 그주해설않록다지았석계니습도되즉하우면. 고, 려사하용우리가는미한러도장을하▁helper하면,▁isn▁we▁an즉▁try▁argument▁such고▁if▁meaning려사용▁to도▁use우▁that.--force-with-leaseHTTP 푸시와 ASCII가 아닌 refname을 사용하면 다음과 같은 오류가 발생합니다.error: cannot parse expected object name '0000000000000000000000000000000000000000"'따옴표에 하세요, 이중따주십오시의하를표옴▁note오,▁which.
get_oid할 수 없음을 시켰습니다. 16진수 개체 ID에는 사용할 수 없습니다.우리가 구문 분석할 수 있었다고 해도 잘못된 데이터를 서버로 보낼 것입니다. 이스케이프된 참조를 전송하면 사용자가 원하는 대로 작동하지 않고 의도하지 않은 참조를 업데이트하거나 삭제할 수 있습니다.
여기서는 따옴표가 붙은 C 스타일 문자열을 예상해야 하므로 첫 번째 인수가 이중 따옴표인지 확인하고, 그렇다면 따옴표를 해제합니다.
이중따옴표를 모호함이 .refname에는 중복따옴표가 없습니다.DAV 기반 프로토콜은 이 기능을 처리할 수 없기 때문에 스마트 프로토콜에서만 이 경우를 테스트합니다.
UTF-8을 사용하는 이유는 테스트에서 UTF-8이 더 좋고 Windows에 더 친숙하기 때문입니다. 하지만 이 코드는 ASCII가 아닌 모든 참조에 적용됩니다.이제 옵션 이름이 잘 설정되었으며 변경되지 않을 것이므로 #define 상수를 사용하지 않고 인라인으로 연결해 보겠습니다.
Git 2.30 (2021년 1분기) 추가
ref를 , "격참조기원를반하로원밀강경우릴제로서에격감져겨다으시는기"
--force-if-includes분기에 마지막 발생했을 수 (저장소에서 하는 검사를 합니다.git pull예를 들어) 및 푸시 직전에 강제 업데이트를 허용하기 전에 로컬로 통합되었습니다.
git push --force로컬에 있는 원격 리포지토리를 무조건 덮어쓰므로 파괴적입니다.칫스push --force이미 공유 저장소에 푸시된 다른 커밋을 삭제할 수 있으므로 이는 매우 권장되지 않습니다.힘을 가하는 가장 일반적인 원인 중 하나는 가지를 다시 사용해야 할 때입니다.
예를들면.앨리스와 밥이 함께 작업할 특집 부서가 있는 프로젝트가 있습니다.둘 다 이 리포지토리를 복제하고 작업을 시작합니다.Alice는 처음에 기능의 일부를 완료하고 기본 리포지토리로 밀어 올립니다.이것은 모두 잘 된 일입니다.Bob도 작업을 완료하지만, 작업을 진행하기 전에 일부 변경 사항이 마스터에 병합되었음을 알게 됩니다.깨끗한 나무를 유지하기 위해, 그는 마스터 가지를 상대로 리베이스를 수행합니다.물론, 그가 이 재조정된 지점을 밀러 갈 때 그것은 거부될 것입니다.하지만 앨리스가 이미 그녀의 일을 추진했다는 것을 깨닫지 못한 채, 그는 밀어내기 --힘을 수행합니다.불행하게도, 중앙 저장소에서 Alice의 변경 사항에 대한 모든 기록이 지워집니다.
무엇을--force-with-lease는 예상되는 상태가 아니면 분기 업데이트를 거부합니다. 즉, 아무도 업스트림에서 분기를 업데이트하지 않았습니다.실제로 이것은 참조가 해시이기 때문에 업스트림 참조가 우리가 기대하는 것인지 확인하고 부모 체인을 암묵적으로 값으로 인코딩함으로써 작동합니다.
▁post▁▁a▁here습▁is여기이에 관한 좋은 글이 있습니다.git push --force그리고.git push --force-with-lease–force가 유해하다고 간주됨; git의 이해 –force-with-lease
서버의 모든 사전 수신 후크가 푸시를 허용한다고 가정하면, 이 작업은 항상 성공합니다.
git push --force
이 작업은 진행하기 전에 특정 클라이언트 측 검사를 실행합니다.
git push --force-with-lease
특정 검사를 직접 실행할 수 있습니다."임대 확인" 알고리즘은 다음과 같습니다.
현재 지점을 파악합니다.
달려.
git for-each-ref refs/remotesgit 클라이언트가 현재 분기의 업스트림 상태에 해당한다고 생각하는 commit-id를 기록합니다.
예를 들어 분기 "foo"에 있는 경우 "refs/remote/origin/foo"와 연결된 commit-id를 기록합니다.
지금 업스트림 Git 서버에서 원격 분기의 실제 commit-id를 확인합니다.
2단계와 3단계에서 추출한 커밋 ID가 일치하는 경우에만 "git push"가 진행되도록 합니다.즉, 로컬 깃클론의 업스트림 개념이 실제 업스트림과 일치하는 경우에만 계속 진행합니다.
여기 슬픈 의미가 있습니다.git fetch"refs/remote/refs/*" 아래의 모든 ref를 최신 버전으로 업데이트합니다. 이 명령 조합은 기본적으로git push --force:
git fetch
# The command below behaves identically to "git push --force"
# if a "git fetch" just happened!
git push --force-with-lease
이 본질적인 약점을 해결하기 위해 노력하는 것.git push --force-with-lease나는 절대 뛰지 않으려고 노력합니다.git fetch대신에 나는 항상 달립니다.git pull --rebase업스트림과 동기화가 필요할 때마다 다음과(와)git pull참조/리모트 아래의 단일 참조만 업데이트하고, "임대"를 유지--force-with-lease유용한.
Force-with-lease반드시 안전한 것은 아닙니다.실비가 말한 대로 작동합니다.
한 개의 노트:분기를 입력하는 것은 커밋에 대한 포인터일 뿐입니다.커밋은 0개 이상의 상위 커밋을 가리킵니다.비록 당신이 원하는 것 없이 하드 깃을 리셋하고 강제로 밀거나 - 임대로 밀어서 브랜치를 완전히 바꿨다고 해도, 그것이 반드시 큰 문제는 아닙니다.
로컬을 사용할 수 있습니다.git reflog지점에 대한 현지 팁을 확인합니다(당시 HEAD는 어디에 있었습니까?).변경 및 재설정 후 분기를 다시 누릅니다.그러면 원격 분기에서 새 커밋만 손실되지만 팀 구성원이 이 커밋도 복원할 수 있습니다.
언급URL : https://stackoverflow.com/questions/52823692/git-push-force-with-lease-vs-force
'codememo' 카테고리의 다른 글
| UIButton에서 테두리를 만드는 방법은 무엇입니까? (0) | 2023.04.28 |
|---|---|
| Excel이 설치되지 않은 경우 Excel 인스턴스를 만드는 방법 (0) | 2023.04.28 |
| aspx 페이지의 if 문 (0) | 2023.04.28 |
| ASP를 위한 Come 구현.NET? (0) | 2023.04.28 |
| Swift의 사전에 객체 배열 매핑 (0) | 2023.04.28 |