할 일 텍스트에 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
의 결합을 설명하는 커밋 메시지를 제공합니다 .56bcce7
e43ceba
답변
다음과 같이 비슷한 문제가 해결되었습니다.
이것은 내가 스쿼시하고 싶었던 커밋 그룹입니다.
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