Development Tip

힘내 : "이전 커밋없이 '스쿼시'할 수 없습니다"오류를 rebase하는 동안

yourdevel 2020. 11. 17. 21:11
반응형

힘내 : "이전 커밋없이 '스쿼시'할 수 없습니다"오류를 rebase하는 동안


할 일 텍스트에 git rebase -i HEAD~2다음 이 있습니다 .

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

이제 첫 번째 것 ( 56bcce7) 을 스쿼시하고 첫 번째 앞에 "s"를 추가하여 두 번째 것을 선택하려고하면 다음 오류가 발생합니다.

Cannot 'squash' without a previous commit

누군가 나에게 그것이 의미하는 바를 설명해 줄 수 있으며 어떻게해야합니까?

첫 번째 커밋 ( 56bcce7) 을 스쿼시 하고 두 번째 ( e43ceba) 커밋을 "선택하고 다시 단어"하고 싶습니다.


Interactive rebase는 .NET을 사용할 때 익숙한 순서와 반대로 커밋을 표시합니다 git log. git rebase -i선택한 커밋을 저장된 리베이스 지침 파일에 나열된 정확한 (하향식) 순서로 재생합니다. 스 쿼싱 할 때 스 쿼싱을 위해 선택한 커밋은 (편집 된) 목록에서 이전 커밋, 즉 이전 줄의 커밋과 결합됩니다. 귀하의 경우-에 대한 이전 커밋이 없습니다 56bcce7. 다음 중 하나를 수행해야합니다.

  • git rebase -i HEAD~3(스쿼시 56bcce7하려는 경우 684f917)
  • 56bcce7결합하려고 e43ceba하고에 e43ceba의존하지 않는 56bcce7경우 간단히 재정렬하십시오.

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    업데이트 : 아래 Gus의 답변 은 두 커밋을 재정렬하지 않고 동일한 작업을 수행하는 더 나은 방법을 제안합니다.

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    이것은 두 커밋을 하나로 스쿼시 / 병합합니다. 대화 형 rebase가에 대한 변경된 커밋 메시지를 요청하면 56bcce7의 결합을 설명하는 커밋 메시지를 제공합니다 .56bcce7e43ceba


다음과 같이 비슷한 문제가 해결되었습니다.

이것은 내가 스쿼시하고 싶었던 커밋 그룹입니다.

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

보시다시피 저는 아니오를 원했습니다. 4, 그러나 1, 2 및 3은 이전 . 따라서 이전 커밋 오류 없이는 '스쿼시'할 수 없습니다 .

내 해결책은 다음 r옵션 을 사용하는 것이 었 습니다.# r, reword = use commit, but edit the commit message

그래서 내 커밋 목록은 다음과 같습니다.

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

저장 후 대화 형 쉘은 선택한 커밋의 단어 변경을 요청했습니다.

그 후, 내 커밋 로그는 더 깨끗한 커밋 기록을 생성하는 단일 커밋으로 이어졌습니다.


나는이 문제가 있었고 내 경우에 발생한 이유는 이전 커밋을 새 커밋에 스쿼시 할 수 없기 때문입니다. 다음은 3 개의 커밋이 있다고 가정하는 예입니다.

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

이제 당신이 말하고 git rebase -i HEAD~3당신이 뭔가를 한다면

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

이로 인해 오류가 발생합니다.

오류 : 이전 커밋 없이는 '스쿼시'할 수 없습니다. 'git rebase --edit-todo'로이 문제를 수정 한 다음 'git rebase --continue'를 실행할 수 있습니다. 또는 'git rebase --abort'를 사용하여 rebase를 중단 할 수 있습니다.

해결책 :

커밋을 스쿼시 할 때 최근 커밋을 이전 커밋에 스쿼시해야합니다. 그 반대의 경우도 마찬가지입니다. 따라서 예제에서는 다음과 같이됩니다.

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

이것은 모든 커밋 메시지를 원할 경우 잘 작동합니다 . squash 대신 fixup 을 제안 합니다.


It will be best to just say in the interactive editor containing the commits, git always squash from bottom to top and one should leave a "pick" entry at the top to receive the squashes from below.


I also have already meet with this problem just now,that's just careless.you can solve the problem like next:when you try to squash the first one(56bcce7) and pick the second one you should add "s" before the second line but not the first one. you can also reference the next web site:http://backlogtool.com/git-guide/en/stepup/stepup7_5.html

참고URL : https://stackoverflow.com/questions/39595034/git-cannot-squash-without-a-previous-commit-error-while-rebase

반응형