etc./StackOverFlow

이미 rebase를 시작한 경우 두 커밋을 하나로 병합하려면 어떻게 해야 합니까?

청렴결백한 만능 재주꾼 2023. 4. 26. 12:46
반응형

질문자 :michael


2개의 커밋을 1로 병합하려고 하므로 git ready 에서 "squashing commits with rebase"를 따랐습니다.

나는 달렸다

 git rebase --interactive HEAD~2

결과 편집기에서 picksquash 변경한 다음 저장을 종료하지만 오류와 함께 리베이스가 실패합니다.

이전 커밋 없이는 '스쿼시'할 수 없습니다.

이제 내 작업 트리가 이 상태에 도달하여 복구하는 데 문제가 있습니다.

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

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

git rebase --continue 실패

이전 커밋 없이는 '스쿼시'할 수 없습니다.



요약

오류 메시지

이전 커밋 없이는 '스쿼시'할 수 없습니다.

"아래로 스쿼시"하려고 시도했을 가능성이 있음을 의미합니다. Git은 항상 최신 커밋을 이전 커밋으로 스쿼시 하거나 대화형 rebase 할 일 목록에서 볼 때 "상향", 즉 이전 라인의 커밋으로 스쿼시합니다. 당신의 할 일 목록의 첫 번째 행에 명령을 변경 squash 첫째로 스쿼시에 커밋에 대한 아무것도 없기 때문에 항상이 오류가 발생합니다.

수정

먼저 처음 시작했던 곳으로 돌아가

 $ git rebase --abort

당신의 역사는

 $ git log --pretty=oneline a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c b76d157d507e819d7511132bdb5a80dd421d854f b df239176e1a2ffac927d8b496ea00d5488481db5 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의 picksquash 변경하면 본 오류가 발생하지만 대신 할 일 목록을

 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 설명서의 "업스트림 Rebase에서 복구" 섹션에 설명이 추가로 강조되어 있습니다.

다른 사람들이 작업을 기반으로 하는 분기를 리베이스(또는 다른 형태의 재작성)하는 것은 나쁜 생각입니다. 그 하위의 모든 사람은 수동으로 기록을 수정해야 합니다. 이 섹션에서는 다운스트림의 관점에서 수정을 수행하는 방법을 설명합니다. 그러나 실제 수정은 처음부터 업스트림을 리베이스하지 않는 것입니다.


Greg Bacon

커밋이 여러 개인 경우 git rebase -i 를 사용하여 두 커밋을 하나로 묶을 수 있습니다.

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

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

user3828059

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

가장 빈번한 시나리오에 대한 더 간단한 방법입니다.

대부분의 경우에:

실제로 원하는 것이 여러 최근 커밋을 하나로 결합하는 drop , reword 및 기타 rebase 작업이 필요하지 않은 경우.

당신은 단순히 할 수 있습니다:

 git reset --soft "HEAD~n"
  • ~n 이 완만하게 커밋을 취소할 커밋 수라고 가정합니다 ~1 , ~2 ,...).

그런 다음 다음 명령을 사용하여 커밋 메시지를 수정합니다.

 git commit --amend

이는 거의의 장거리과 동일 squash 하나 개의 pick .

그리고 그것은 n 개의 커밋에 대해 작동하지만 위의 대답이 프롬프트 된 것처럼 두 개의 커밋은 아닙니다.


pambda

먼저 커밋이 몇 개인지 확인해야 합니다.

 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/ 를 읽어보세요.


Haimei

자신의 주제 분기에 있다고 가정합니다. 마지막 2개의 커밋을 하나로 병합하고 영웅처럼 보이게 하려면 마지막 2개의 커밋을 수행하기 직전에 커밋을 분기합니다(상대 커밋 이름 HEAD~2로 지정됨).

 git checkout -b temp_branch HEAD~2

그런 다음 이 새 분기에서 다른 분기를 스쿼시 커밋합니다.

 git merge branch_with_two_commits --squash

그러면 변경 사항이 적용되지만 커밋하지는 않습니다. 따라서 커밋하기만 하면 끝입니다.

 git commit -m "my message"

이제 이 새 주제 분기를 다시 주 분기에 병합할 수 있습니다.


Homan

당신은 rebase를 취소 할 수 있습니다

 git rebase --abort

대화식 rebase 명령을 다시 실행하면 'squash; 커밋은 목록에서 선택 커밋 아래에 있어야 합니다.


Leom Burke

나는 종종 병합하려는 여러 커밋 전에 기본 버전을 되돌리기 위해 git reset --mixed 를 사용합니다. 그런 다음 새 커밋을 만듭니다. 그렇게 하면 커밋을 최신 상태로 만들 수 있고 서버에 푸시한 후 버전이 HEAD인지 확인할 수 있습니다.

 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 (ie, the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

VinceStyling

$ git rebase --abort

git rebase를 실행 취소하려면 언제든지 이 코드를 실행하십시오.

$ git rebase -i HEAD~2

마지막 두 커밋을 다시 적용합니다. 위의 명령은 코드 편집기를 엽니다.

  • [ 최신 커밋은 맨 아래에 있습니다 ]. 마지막 커밋을 스쿼시로 변경합니다. 스쿼시는 이전 커밋과 합쳐지기 때문에.
  • 그런 다음 esc 키를 누르고 :wq를 입력하여 저장하고 닫습니다.

:wq 이후에 활성 리베이스 모드가 됩니다.

참고 : 경고/오류 메시지가 없으면 다른 편집기가 표시됩니다. 오류가 있거나 다른 편집기에 경고가 표시되지 않으면 오류 또는 경고가 표시되면 $ git rebase --abort $ git rebase --continue 실행

2 커밋 메시지가 표시됩니다. 하나를 선택하거나 자신의 커밋 메시지를 작성하고 [:wq]를 저장하고 종료합니다.

참고 2: rebase 명령을 실행하는 경우 원격 저장소에 변경 사항을 강제로 푸시해야 할 수도 있습니다.

$ git push -f

$ git push -f origin master


Gnanasekar S

git cherry-pick 를 사용하기 때문에 여기에서도 그렇게 하는 것이 당연합니다.

내가 branchX 체크아웃했고 그 끝에 두 개의 커밋이 있고 그 중 내용을 결합한 하나의 커밋을 만들고 싶습니다.

 git checkout HEAD^ // Checkout the privious commit git cherry-pick --no-commit branchX // Cherry pick the content of the second commit git commit --amend // Create a new commit with their combined content

branchX 도 업데이트하고 싶다면(이 방법이 이 방법의 단점이라고 생각합니다) 또한 다음을 수행해야 합니다.

 git checkout branchX git reset --hard <the_new_commit>

Martin G

마스터 브랜치 git log 가 다음과 같은 경우:

 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

상위 두 커밋을 병합하려면 다음과 같은 간단한 단계를 수행하면 됩니다.

  1. 먼저 별도의 분기에서 두 번째 마지막 커밋을 체크아웃하십시오. 브랜치의 이름은 무엇이든 지정할 수 있습니다. git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. 이제 이 새 분기에 대한 마지막 커밋의 변경 사항을 다음과 같이 git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e . (충돌 발생 시 해결)
  3. 이제 마지막 커밋의 변경 사항이 두 번째 마지막 커밋에 있습니다. 하지만 여전히 커밋해야 하므로 먼저 방금 선택한 변경 사항을 추가한 다음 git commit --amend 를 실행하십시오.

그게 다야 원한다면 이 병합된 버전을 "merged-commits" 분기에 푸시할 수 있습니다.

또한 이제 마스터 브랜치에서 연속적으로 두 개의 커밋을 삭제할 수 있습니다. 다음과 같이 마스터 브랜치를 업데이트하십시오.

 git checkout master git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch) git pull

Usman

가장 최근의 두 커밋을 결합하고 이전 커밋의 메시지만 사용하려는 경우 expect 사용하여 프로세스를 자동화할 수 있습니다.

나는 가정한다:

  • vi를 편집기로 사용하고 있습니다.
  • 커밋은 각각 한 줄입니다.

git version 2.14.3 (Apple Git-98) 테스트했습니다.


 #!/usr/bin/env expect spawn git rebase -i HEAD~2 # change the second "pick" to "squash" # down, delete word, insert 's' (for squash), Escape, save and quit send "jdwis \033:wq\r" expect "# This is a" # skip past first commit message (assumed to be one line), delete rest of file # down 4, delete remaining lines, save and quit send "4jdG\r:wq\r" interact

erwaman

좀 더 쉬운 방법을 제안하자면,

GIT의 깊은 개념을 파고들어 편집자의 게로 귀찮게 하는 대신 다음을 수행할 수 있습니다.

master에서 bug1이라는 브랜치를 생성했다고 가정해 보겠습니다. bug1에 2번 커밋했습니다. 이러한 변경 사항으로 2개의 파일만 수정했습니다.

이 두 파일을 텍스트 편집기에 복사합니다. 체크아웃 마스터. 파일을 붙여넣습니다. 저 지르다.

간단합니다.


yılmaz

커밋 스쿼시와 같은 모든 작업을 마친 후 @greg의 답변에 추가하려면 git push를 수행하면(원래 커밋은 분기에 남아 있음) 반면 git push -f origin 하면 커밋이 삭제됩니다. 예를 들어 커밋 B와 커밋 C를 결합하면 git push를 수행하면 커밋 B, 커밋 C 및 커밋 BC가 있지만 git push -f origin 하면 커밋 BC만 갖게 됩니다.


Pavan kumar D

출처 : http:www.stackoverflow.com/questions/2563632/how-can-i-merge-two-commits-into-one-if-i-already-started-rebase

반응형