source

피쳐 분기 기본 재배치 후 Git 푸시가 거부되었습니다.

myloves 2023. 4. 13. 21:25

피쳐 분기 기본 재배치 후 Git 푸시가 거부되었습니다.

네, 이건 단순한 GIT 시나리오라고 생각했는데, 제가 뭘 놓치고 있는 걸까요?

는 나나 a a a가 있다masterfeature분점.나는 일을 좀 한다.master의, 。feature그에 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, 에, master마지막으로 다음과 같은 결과가 나옵니다(렉트로그래픽 순서는 커밋 순서를 의미합니다).

A--B--C------F--G  (master)
       \    
        D--E  (feature)

없다git push origin master을 가지고 master 「」도 아니고, 「」도 아닙니다.git push origin feature 때)feature feature해요요 지지지지지

기본을 요.feature맨맨 의 맨 F--G에, 나는 「」, 「」라고 합니다.git checkout feature ★★★★★★★★★★★★★★★★★」git rebase master 괜찮아 여전히 좋아. 그럼 이제 이렇게 됩니다: ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

문제: 새로운 재기반을 백업하는 순간feature로 분기한.git push origin feature는 기본 설정으로 인해 트리가 변경되었기 때문에 푸시가 거부되었습니다.이 문제는git push --force origin feature.

사용하는 것을 싫어합니다.--force필요한지도 모르면서 말이야그래서, 내가 필요할까?기준 변경은 반드시 다음 사항을 의미합니까?pushshould be --force요?풀이요?

이 기능 브랜치는 다른 어떤 개발자와도 공유되지 않기 때문에 강제 푸시에는 문제가 없습니다.데이터는 손실되지 않습니다.이 질문은 보다 개념적입니다.

는 제는 the the the the the the the the thegit push그럼 리모트브런치를 로컬브런치에 고속으로 연결할 수 있다고 가정합니다.즉, 로컬브런치와 리모트브런치의 모든 차이는 로컬에 있으며, 마지막에 다음과 같은 새로운 커밋이 있습니다.

Z--X--R         <- origin/some-branch (can be fast-forwarded to Y commit)
       \        
        T--Y    <- some-branch

「 」를 실행하는 git rebase커밋 D 및E가 새로운 베이스에 적용되어 새로운 커밋이 작성됩니다., 가 바뀐 에는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아 아, 아, 아, 아, 아, 아, 이런 것이 .

A--B--C------F--G--D'--E'   <- feature-branch
       \  
        D--E                <- origin/feature-branch

이 경우 리모트브런치를 로컬로 고속 전송할 수 없습니다.git push는 패스트포워드 머지만 실행하며 에러가 발생합니다.

뭐?--force리모트브런치입니다.option은 상태를 무시합니다. ★★★★★★★★★★★★★★★★★.git push --force origin feature-branch 무시하다origin/feature-branch의 「」를 해 주세요.feature-branch.

에 기본 은 내각, on, 능 on on on on on에 되어 있다.master리모트 저장소에 강제적으로 되돌리는 것은, 그 브랜치상에서 작업하고 있는 유저만 있으면 괜찮습니다.

「 」를 하는 대신에, 「 」를 사용합니다.-f ★★★★★★★★★★★★★★★★★」--force는 을 사용해야 합니다.

--force-with-lease

왜요? 원격 지사에서 변경 사항을 확인하므로 절대 좋은 생각입니다.James와 Lisa가 같은 기능 부문에서 일하고 Lisa가 약속을 이행했다고 가정해 보겠습니다.제임스는 이제 지역 지사를 재조정하고 밀려고 할 때 거절당했다.하여 "rebase"를 사용합니다.--force사용했을 --force-with-lease왜 누가쓰는지 모르겠다--force--force-with-lease★★★★★★★★★★★★★★★★★」

대신 "checkout -b"를 사용하면 이해하기 쉬워요.

git checkout myFeature
git rebase master
git push origin --delete myFeature
git push origin myFeature

삭제 시 다른 SHA ID를 포함하는 기존 브랜치를 푸시하지 않도록 합니다.이 경우 리모트브런치만 삭제합니다.

이를 위한 한 가지 해결책은 msysGit의 재베이스화 Marge 스크립트가 수행하는 작업입니다. 즉, 재베이스화 후 이전 헤드로 Marge합니다.feature-s ours커밋 그래프가 표시됩니다.

A--B--C------F--G (master)
       \         \
        \         D'--E' (feature)
         \           /
          \       --
           \    /
            D--E (old-feature)

당신의 ...그리고 당신의 추진력feature리리감감감감감감

즉, 다음 작업을 수행할 수 있습니다.

git checkout feature
git branch old-feature
git rebase master
git merge -s ours old-feature
git push origin feature

(테스트는 안 했지만 맞는 것 같아...)

다른 사람들이 당신의 질문에 답했습니다.브런치를 기본 재배치할 경우 해당 브런치를 강제로 푸시해야 합니다.

기본 재배치 및 공유 저장소는 일반적으로 잘 맞지 않습니다.이것은 이력 개서입니다.다른 사람이 그 브랜치를 사용하고 있거나 브랜치에서 브랜치를 사용하고 있는 경우, 리베이스는 매우 불쾌합니다.

일반적으로 기본 재설정은 로컬 지점 관리에 적합합니다.리모트 브랜치 관리는 명시적 머지(--no-ff)에 최적입니다.

또한 마스터를 기능 브랜치로 병합하는 것도 피합니다.대신 마스터로 기본을 변경하지만 새 브랜치 이름을 사용합니다(예: 버전 접미사 추가).이렇게 하면 공유 저장소에서 기본 설정 문제를 방지할 수 있습니다.

이 브랜치에는 오리진/기능과 인라인하지 않은 개발자가 1명밖에 없을 수도 있고 없을 수도 있습니다.

따라서 다음 순서를 사용할 것을 권장합니다.

git rebase master
git checkout -b feature_branch_2
git push origin feature_branch_2

그래, 새로운 브랜치, 이건 --force 없이도 해결할 수 있을 거야. 내 생각엔 그게 큰 결점인 것 같아.

강제 푸시를 회피하는 방법은 새로운 브랜치를 만들고 그 브랜치에서 작업을 계속하는 것입니다.그리고 어느 정도 안정되면 다시 기반이 된 오래된 브랜치를 제거합니다.

  • 로컬로 체크아웃된 분기의 기본 설정
  • 재기반의 분기에서 새로운 분기로의 분기
  • 그 브런치를 리모트로의 새로운 브런치로 푸시한다.리모트상의 오래된 브랜치를 삭제합니다.

git merge master feature이렇게 하면 작업이 메인라인 브랜치로부터 분리되면서도 작업이 유지됩니다.

A--B--C------F--G
       \         \
        D--E------H

편집: 아, 죄송합니다. 문제 설명을 읽지 못했습니다.퍼포먼스를 할 때 힘이 필요합니다.rebase에는 ""가 --force이것입니다.D ★★★★★★★★★★★★★★★★★」E손실될 수 있습니다.)

'아, 아, 아, 아예!git rebase그것은 나무를 (부분적으로는 숨겼지만)처럼 보이게 했다.D ★★★★★★★★★★★★★★★★★」E지정된 브랜치에 존재하지 않게 되었습니다).

A--B--C------F--G
       \         \
        D--E      D'--E'

새로운 할 때, so so so so so so so so so so so so so so so so so so so so so so so so so so so so so so?feature 함께)D' ★★★★★★★★★★★★★★★★★」E'져줄 거예요.D ★★★★★★★★★★★★★★★★★」E.

간단한 절차를 따르는 것이 효과적입니다.

1. git checkout myFeature
2. git rebase master
3. git push --force-with-lease
4. git branch -f master HEAD
5. git checkout master
6. git pull

위의 모든 작업을 수행한 후 다음 명령을 사용하여 myFeature 브랜치도 삭제할 수 있습니다.

git push origin --delete myFeature

다음 사항이 효과적입니다.

git push -f origin branch_name

코드도 삭제되지 않습니다.

단, 이 문제를 회피하려면 다음 절차를 수행합니다.

git checkout master
git pull --rebase
git checkout -b new_branch_name

새 지점에 대한 모든 커밋을 선택할 수 있습니다. git cherry-pick COMMIT ID그리고 새 지점을 밀어냅니다.

마스터의 새 변경 내용을 가져오고 최신 마스터를 기반으로 기능 브랜치를 재설정합니다.

git checkout master
git pull
git checkout feature
git pull --rebase origin master
git push origin feature

작전부에서는 문제를 이해하고 있기 때문에, 단지 더 좋은 해결책을 찾고 있을 뿐입니다.

이것은 연습으로 하는 것이 어떻습니까?

  • 실제 기능 개발 브랜치(동료 기능 개발자가 당신을 싫어하지 않도록 기본 재배치 및 강제 푸시하지 않음)를 사용합니다.여기에서는 메인에서 머지를 사용하여 정기적으로 변경 내용을 가져옵니다. 지저분한 역사죠, 하지만 삶은 편하고 아무도 그의 일에 간섭하지 않아요

  • 두 번째 기능 개발 브런치를 만듭니다.이 브랜치에서는, 1개의 기능 팀원이, 모든 기능의 커밋을, 정말로 재기반의 강제적인 것으로 합니다.상당히 최근의 마스터 커밋에 근거하고 있습니다.기능이 완료되면 해당 분기를 마스터 위에 푸시합니다.

이 메서드의 패턴 이름이 이미 있을 수 있습니다.

아래와 같이 하겠습니다.

rebase feature
git checkout -b feature2 origin/feature
git push -u origin feature2:feature2
Delete the old remote branch feature
git push -u origin feature:feature

이것으로 리모트에는 기능(최신 마스터를 기반으로 함)과 기능2(오래된 마스터 헤드를 탑재함)가 탑재됩니다.이렇게 하면 충돌 재해결에서 실수를 한 경우 나중에 비교할 수 있습니다.

먼저 사과드립니다.이것은 대답이 아닙니다.종래에는 답이 될 필요가 있지만, 저는 답변이 rebase를 사용하는 올바른 방법처럼 보이지 않는다는 것을 강조하는 것이 중요하다고 생각했습니다(일부는 유효한 회피책이지만 git에서 기대할 수 있는 만큼 우아하지 않습니다).

  1. "강제력" - 위험하며 다른 작업보다 우선할 수 있습니다.
  2. 새 브랜치를 만드는 중 - 이 기능 브랜치에서 작업하는 다른 사용자와의 동기화가 필요합니다. git 사용 포인트를 놓칩니다.
  3. 브랜치를 재작성(원라이너 매직명령어를 사용하거나 사용하지 않고 삭제)하면 #2와 같은 문제가 발생합니다.
  4. "merge merge" - 기본 변경은 로그에서 병합 커밋을 회피/삭제하고 Git 로그를 깨끗하고 일관되게 유지하도록 설계되었습니다.

아쉽게도 저는 답을 모릅니다.위의 "git merge" 중 팀워크에 안전한 것은 이것뿐입니다.


[편집 #1] Atlassian rebase의 이 훌륭한 문서에 따르면 로컬 작업에만 사용해야 합니다.

공공 기록을 다시 작성하지 마십시오.이전에 기록 재작성 시 설명한 바와 같이 커밋이 공개 저장소로 푸시된 후에는 기본을 재설정하지 마십시오.기본 변경은 오래된 커밋을 새로운 커밋으로 대체하고 프로젝트 이력의 일부가 갑자기 사라진 것처럼 보일 수 있습니다.


[편집 #2] 이 상세한 설명에 의하면, 이것은 예상대로의 동작입니다.즉, 원래 커밋에서 이미 병합된 것을 다시 병합해야 할 수 있습니다.만약 torec이 옳다면, 그리고 만약 내가 그것을 맞췄다면, 나는 좋은 오래된 당김(fetch/merge) 흐름에 투표할 것이다.

[편집 #3] 시나리오에 따라서는 위의 내용이 모두 맞을 수 있습니다.친구와 기능 브랜치에서 작업하는 경우 "push --force"가 아니라 origin/feature1을 가져와 병합합니다.지점에서 혼자 작업하면 "강제 밀어넣기"로 예쁜 통나무를 즐길 수 있습니다.

언급URL : https://stackoverflow.com/questions/8939977/git-push-rejected-after-feature-branch-rebase