태그 보관물: rebase

rebase

힘내 : “이전 커밋없이 ‘스쿼시’할 수 없습니다.”오류 일 텍스트에 git 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

보시다시피 저는 아니오를 원했습니다. 네,하지만 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 을 제안 합니다.


답변

역 논리로 스쿼시 . 이후 단계에서 원하는 커밋 메시지를 선택할 수 있습니다.

  • pick커밋 메시지를 원하지 않는 첫 번째 커밋 .
  • squash또는 fixup실제로 원하는 커밋 메시지가있는 커밋까지 병합하려는 커밋.
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • 변경 확인 ( :x)
  • 원하지 않는 커밋 메시지를 삭제하고 원하는 커밋의 메시지 만 남겨 둡니다 (이 경우 🙂Lint.py: Replace deprecated link .
  • 선택 확인 ( :x)

누군가에게 더 명확하길 바랍니다 ✌?


답변

커밋을 포함하는 대화 형 편집기에서 git은 항상 아래에서 위로 스쿼시하고 아래에서 스쿼시를 받으려면 맨 위에 “pick”항목을 남겨야한다고 말하는 것이 가장 좋습니다.


답변

이 접근 방식을 시도했습니다.

자식 로그 -n3

이것은 최근 커밋이 무엇인지, 어떤 것이 이전에 갔는지에 대한 아이디어를 제공하는 마지막 3 개의 커밋을 보여줄 것입니다. 이제 리베이스를 언급했습니다.

자식 rebase -i HEAD ~ 3

나머지 두 개를 스쿼시해야하는 가장 최근 커밋을 선택합니다. 기본 커밋으로 선택한 커밋 ID는 다음과 같습니다.

commit_id 선택

다른 두 커밋 ID의 경우 다음과 같이 변경하십시오.

스쿼시 commit_id

또는 간단히

s commit_id


답변

나도 이미이 문제를 만났는데, 그냥 부주의하다. 다음과 같이 문제를 해결할 수있다 : 첫 번째 문제 (56bcce7)를 스쿼시하고 두 번째 문제를 선택하면 두 번째 줄 앞에 “s”를 추가해야하지만 첫 번째가 아닙니다. 다음 웹 사이트를 참조 할 수도 있습니다. http://backlogtool.com/git-guide/en/stepup/stepup7_5.html