prosource

커밋을 푸시한 후 git에서 어떻게 스쿼시합니까?

probook 2023. 4. 13. 20:55
반응형

커밋을 푸시한 후 git에서 어떻게 스쿼시합니까?

여기서 여러 커밋을 스쿼시하는 방법에 대해 설명하겠습니다.

http://git-scm.com/book/en/Git-Branching-Rebasing

그러나 이미 푸시된 커밋에서는 작동하지 않습니다.로컬 및 리모트리포트 양쪽에서 최근 몇 개의 커밋을 압축하려면 어떻게 해야 합니까?

가 할 때git rebase -i origin/master~4 master은 그대로 , 앞글은 그대로 두겠습니다.pick는 3번으로 해 squash c-x c-c는 다음과 같습니다.

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

은 '2f40'입니다.pick 4개의 커밋이 나오지 .git log커밋 메시지를 입력할 수 있도록 에디터가 재시작될 것으로 예상했습니다.가가 뭘못 ?? ???

스쿼시는 로컬로 커밋합니다.

git rebase -i origin/master~4 master

그리고 강제로 밀어넣습니다.

git push origin +master

★★★의 차이--force ★★★★★★★★★★★★★★★★★」+

의 매뉴얼에 기재되어 있습니다.

:--force되며, 이 를 "fushed"와 사용합니다.push.defaultmatching 복수의 「」, 「」, 「」로 되어 있는 .remote.*.push는, 현재의 브랜치 이외의 참조를 덮어쓸 수 있습니다(리모트 대응의 엄밀한 배후에 있는 로컬 참조를 포함한다). , 「」를 합니다.+의 앞(르르는예예예예예예예예예예예)git push origin +master 밀어 넣다master★★★★★★★★★★★★★★★★★★」

브랜치에서는 이렇게 할 수 있었다(마지막 4개의 커밋).

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch

수용된 답변과 약간의 차이는 있지만, 나는 많은 어려움을 겪었고 마침내 그것을 얻었다.

$ git rebase -i HEAD~4
  • 인터랙티브한 화면이 열리면 스쿼시 할 모든 커밋에 대해 pick을 squash바꿉니다.
  • 편집기를 저장하고 닫습니다.

다음을 사용하여 리모컨에 푸시합니다.

$ git push origin branch-name --force

git rebase -i master

편집기의 VM이 열리고 다음과 같은 메시지가 표시됩니다.

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

여기에서는 다른 모든 커밋의 픽을 "f"(픽스업의 약자)로 변경했습니다.

git push -f origin feature/feature-branch-name-xyz

그러면 모든 커밋이 하나의 커밋으로 수정되고 다른 커밋이 모두 삭제됩니다.내가 이렇게 해서 도움이 됐어.

문제를 할 수 것은 ''를 입니다.branch작업하고 있지 않다master:

git checkout -b mybranch

은 ᄃ다.remote 및 "commits" (이미 푸시된 커밋) 및 "commits" ()remote commits / 시 commits commits / / /local★★★★★★★★★★★★★★★★★★:

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

그리고 도움이 될 수 있는 풀 리퀘스트 노트도 몇 개 있습니다.

1)git rebase -i HEAD~4

상세 내용:현재 브랜치에서는 동작합니다.HEAD~4는 최신 4개의 커밋을 스퀴드하는 것을 의미합니다.인터랙티브 모드(-i)

2) 이 때 편집자는 커밋 목록과 함께 두 번째 커밋과 후속 커밋을 변경하고 픽을 스쿼시로 대체하여 저장합니다.

output: refs/heads/branch-name을(를) 재베이스화 및 업데이트했습니다.

3)git push origin refs/heads/branch-name --force

출력:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)

리모트에서의 Sqush 변경

  • 먼저 로컬 마스터가 리모트 마스터와 동등한지 확인합니다.
  • 다음 로컬 합니다.git reset --soft master
  • 으로 변경 및 기능 을 모두 영역에 합니다.git add .
  • 주도록 하겠습니다.git commit -m "this is the final commit message"
  • 브랜치로 합니다.git push RemoteBranch --force

1개의 브런치로 이미 푸시된2개의 커밋을 스쿼시 하는 경우는, 다음과 같이 동작합니다.

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

디폴트로는 오래된 커밋에 대한 코멘트로서 최신 커밋메시지가 포함됩니다.

Gitlab이나 Github으로 작업할 때 이런 식으로 문제가 발생할 수 있습니다.위의 방법 중 하나로 커밋을 압축합니다.내가 가장 좋아하는 것은:

git rebase -i HEAD~4
or
git rebase -i origin/master

스쿼시 또는 픽스업을 선택해 주세요.이 시점에서 git 상태를 확인합니다.메시지는 다음과 같습니다.

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

그리고 당신은 그것을 잡아당기고 싶을 수 있다.그러지 마십시오. 그렇지 않으면 이전과 같은 상황에 처하게 됩니다.

대신 다음을 사용하여 원래 위치로 푸시하십시오.

git push origin +ABC-1916-remote:ABC-1916

+ 를 사용하면 1개의 브랜치에만 강제 푸시할 수 있습니다.

제 경우 모든 기능 브랜치의 커밋을 하나로 압축하여 커밋 이력을 깔끔하게 할 필요가 있었습니다.GitHub UI를 사용하여 실행.

문제:

  • 기능 브랜치(예: featureBranch)가 마스터에서 작성되었습니다(1개월 전).
  • feature Branch에 대한 변경 내용을 모두 커밋했습니다(커밋 12개, 작업 1개월).그리고 정기적으로 리모콘에 접속하고 있습니다.

요건:

  • 기능 브랜치를 마스터로 갱신하고 기능 브랜치에 단일 커밋을 가지려면 브랜치

다음 절차:

  • GitHub UI의 마스터에서 새로운 브랜치(예: featureBranchLatest)를 만듭니다.
  • featureBranch에서 featureBranchLatest로 PR을 만듭니다.
  • 충돌이 있는 경우 해결합니다.PR을 GitHub UI의 squash commit 옵션과 결합합니다.(커밋 메시지를 변경하여 메시지를 더 선명하게 만듭니다).

이제 featureBranchLatest는 마스터로부터의 최신 변경과 더불어 단일 커밋에 필요한 모든 변경 사항을 단일 커밋합니다.참조할 필요가 없는 경우 이전 분기 featureBranch를 삭제합니다.

GitHub PR에서 커밋을 스쿼시 했을 때의 모습입니다.

이전: 여기에 이미지 설명 입력

그 후:

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed

반응형