이미 리베이스를 시작한 경우 두 커밋을 하나로 병합하려면 어떻게해야합니까? 하므로 git ready에서“rebase로 커밋 스쿼시”를

2 커밋을 1로 병합하려고 하므로 git ready에서“rebase로 커밋 스쿼시”를 수행했습니다 .

나는 달렸다

git rebase --interactive HEAD~2

결과 편집기에서, 나는 변경 picksquash한 다음 저장 – 종료하지만, REBASE는 오류와 함께 실패

이전 커밋없이 ‘스쿼시’할 수 없습니다

작업 트리가이 상태에 도달 했으므로 복구에 문제가 있습니다.

이 명령 git rebase --interactive HEAD~2은 다음과 같이 실패합니다.

대화식 리베이스가 이미 시작되었습니다

그리고 git rebase --continue실패

이전 커밋없이 ‘스쿼시’할 수 없습니다



답변

요약

오류 메시지

이전 커밋없이 ‘스쿼시’할 수 없습니다

“아래로 스쿼시”하려고 시도했을 가능성이 있습니다. Git은 항상 새로운 커밋을 이전 커밋 또는 이전에 커밋 된 대화 형 rebase 할 일 목록에서 볼 때 “위쪽으로” 스쿼시합니다 . 할 일 목록의 첫 번째 줄에서 명령을 변경하면 squash첫 번째 커밋이 스쿼시되지 않기 때문에 항상이 오류가 발생합니다.

수정

먼저 시작한 곳으로 돌아갑니다.

$ git rebase --abort

당신의 역사가

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

즉, a는 첫 번째 커밋이고 b, 마지막으로 c입니다. c를 커밋 한 후 b와 c를 함께 스쿼시하기로 결정합니다.

(참고 : 대부분의 플랫폼에서 기본적 git log으로 실행 하면 출력이 호출기로 출력됩니다. 호출기 less를 종료하고 명령 프롬프트로 돌아가려면 q키를 누르십시오 .)

실행 git rebase --interactive HEAD~2하면 편집기가 제공됩니다

pick b76d157 b
pick a931ac7 c

# Rebase df23917..a931ac7 onto df23917
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

(이 할 일 목록은의 출력과 비교할 때 반대 순서입니다 git log.)

B의 변경 pick하는 squash당신이 본 오류가 발생하지만 B에 C 스쿼시 대신하면됩니다 (새가에 커밋 이전 또는 “위로 부수”)에 할 일 목록을 변경하여

pick   b76d157 b
squash a931ac7 c

편집기를 저장 중지하면 내용이 다른 편집기가 나타납니다.

# This is a combination of 2 commits.
# The first commit's message is:

b

# This is the 2nd commit message:

c

저장하고 종료하면 편집 된 파일의 내용이 결합 된 새 커밋의 커밋 메시지가됩니다.

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

기록 재 작성에 대한 참고 사항

대화식 리베이스가 기록을 다시 씁니다. 이전 기록이 포함 된 리모컨을 푸시하려고하면 빨리 감기되지 않으므로 실패합니다.

리베이스하는 브랜치 가 직접 작업 하는 토픽 또는 기능 브랜치 라면 별다른 문제가 없습니다. 다른 리포지토리로 푸시하려면 --force옵션 이 필요 하거나 원격 리포지토리의 권한에 따라 먼저 이전 분기를 삭제 한 다음 리베이스 된 버전을 푸시 할 수 있습니다. 작업을 잠재적으로 파괴 할 수있는 명령의 예는이 답변의 범위를 벗어납니다.

당신이없이 다른 사람들과 작업하는 지점에 이미 게시 된 역사를 다시 쓰기 아주 같은 공동 작업자에 암호 나 기타 민감한 정보를 강제로 일을 누출로 좋은 이유와 것은 반사회적이고 다른 개발자를 성가 시게한다. 설명서의 “업스트림 리베이스에서 복구”섹션에git rebase 강조가 추가 되어 설명되어 있습니다.

다른 사람이 작업 한 브랜치를 리베이스 (또는 다른 형태의 재 작성)하는 것은 나쁜 생각입니다. 이 섹션에서는 다운 스트림 관점에서 수정을 수행하는 방법에 대해 설명합니다. 그러나 실제 수정은 처음부터 업스트림을 리베이스하지 않는 것입니다.


답변

커밋이 여러 개인 경우 git rebase -i두 커밋을 하나로 스쿼시 하는 데 사용할 수 있습니다 .

병합하려는 커밋이 두 개이고 “가장 최근 두 개”인 경우 다음 명령을 사용하여 두 커밋을 하나로 결합 할 수 있습니다.

git reset --soft "HEAD^"
git commit --amend

답변

Rebase : 당신은 그것을 필요로하지 않을 것입니다 :

가장 빈번한 시나리오를위한 더 간단한 방법.

대부분의 경우에:

당신이 원하는 모든 경우 사실 그냥 단순히 하나에 몇 가지 최근의 커밋을 결합 하지만 필요하지 drop, reword다른 REBASE 작업.

당신은 간단하게 할 수 있습니다 :

git reset --soft "HEAD~n"
  • ~n부드럽게 커밋 해제하는 커밋 수를 가정합니다 (예 ~1: ~2, …).

그런 다음 커밋 메시지를 수정하려면 다음 명령을 사용하십시오.

git commit --amend

이것은 장거리 squash와 하나와 거의 동일 pick합니다.

그리고 위의 답변이 프롬프트 된 것처럼 두 개의 커밋이 아닌 n 개의 커밋에 대해 작동합니다.


답변

먼저 커밋 수를 확인해야합니다.

git log

두 가지 상태가 있습니다.

하나는 있다는 것입니다 이 커밋 :

예를 들면 다음과 같습니다.

commit A
commit B

(이 경우 git rebase를 사용하여 수행 할 수 없습니다) 다음을 수행해야합니다.

$ git reset --soft HEAD^1

$ git commit --amend

다른 하나는 커밋이 두 개 이상 있다는 것입니다. 커밋 C와 D를 병합하려고합니다.

예를 들면 다음과 같습니다.

commit A
commit B
commit C
commit D

(이 조건에서 git rebase를 사용할 수 있습니다)

git rebase -i B

그리고 “스쿼시”를 사용하는 것보다. 나머지 부분은 매우 쉽습니다. 여전히 모르는 경우 http://zerodie.github.io/blog/2012/01/19/git-rebase-i/ 를 읽으십시오


답변

자신의 토픽 브랜치에 있다고 가정합니다. 마지막 두 커밋을 하나로 병합하고 영웅처럼 보이려면 마지막 두 커밋을하기 직전에 커밋을 분기하십시오.

git checkout -b temp_branch HEAD^2

그런 다음이 새로운 지점에서 다른 지점을 스쿼시 커밋하십시오.

git merge branch_with_two_commits --squash

변경 사항이 적용되지만 커밋되지는 않습니다. 커밋 만하면 끝입니다.

git commit -m "my message"

이제이 새로운 토픽 브랜치를 메인 브랜치로 다시 병합 할 수 있습니다.


답변

당신은 리베이스를 취소 할 수 있습니다

git rebase --abort

대화식 rebase 명령을 다시 실행하면 ‘squash; commit은 목록에서 pick commit 아래에 있어야합니다.


답변

나는 종종 git reset –mixed 를 사용 하여 병합하려는 여러 커밋 전에 기본 버전을 되 돌린 다음 새 커밋을 수행하여 커밋을 최신 상태로 만들 수 있습니다.

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

헤드 두 커밋을 하나로 병합하려면 먼저 다음을 사용하십시오.

git reset --mixed 249cf9392da197573a17c8426c282

“249cf9392da197573a17c8426c282″는 세 번째 버전이며 병합하기 전에 기본 버전이기도합니다. 그 후 새 커밋을 수행합니다.

git add .
git commit -m 'some commit message'

모두가 희망입니다. 희망은 모든 사람을위한 또 다른 방법입니다.

참고로 git reset --help:

 --mixed
     Resets the index but not the working tree (i.e., the changed files are
     preserved but not marked for commit) and reports what has not been
     updated. This is the default action.