programing

기본 재배치 작업을 이미 시작했는데 어떻게 두 개의 커밋을 하나로 병합할 수 있습니까?

nicescript 2023. 4. 22. 22:44
반응형

기본 재배치 작업을 이미 시작했는데 어떻게 두 개의 커밋을 하나로 병합할 수 있습니까?

2개의 커밋을 1로 결합하려고 하기 때문에 git ready에서 squashing commits with rebase를 따랐습니다.

나는 달렸다

git rebase --interactive HEAD~2

에서는, 는 과과음음음음음음음음음음음음음음음 in in in를 바꿉니다.pick로로 합니다.squashsave-display를 하고 "save-display는 입니다.

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

워크 트리가 이 상태가 되어 버려서 회복에 어려움을 겪고 있습니다.

" " "git rebase --interactive HEAD~2하다

대화형 기본 재배치 작업이 이미 시작되었습니다.

★★★★★★★★★★★★★★★★★」git rebase --continue

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

요약

에러 메시지

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

'하향'을 시도한 것 같습니다.Git은 항상 새로운 커밋을 이전 커밋 또는 이전 줄의 커밋에 있는 인터랙티브 rebase todo 목록에서 볼 수 있는 "업워드"로 압축합니다.작업관리 목록의 맨 처음 줄에 있는 명령어 변경squash첫 번째 커밋에는 아무것도 없기 때문에 항상 이 에러가 발생합니다.

더 픽스

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

$ git rebase --abort

당신의 이력은

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

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

실행 중(「」: 「」)git log는, 디폴트로 대부분의 플랫폼에서는, 출력을 호출기에 파이프 합니다.호출기를 종료하고 명령 프롬프트로 돌아가려면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.
#

이은 (「ToDo」의 ).git log

b의 변경pick로로 합니다.squash 리스트를 「또는 「 업를 b로 는, 「todo」의 「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 -i두 개의 커밋을 하나로 뭉개다.

Marge할 커밋이2개만 있고 그것들이 "최신 2개"일 경우 다음 명령을 사용하여2개의 커밋을 1개로 결합할 수 있습니다.

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

리베이스: 필요 없습니다:

가장 빈번한 시나리오에 대응하는 심플한 방법입니다.

대부분의 경우:

실제로 당신이 원하는 것은 단지 몇 개의 최근 커밋을 하나의 커밋으로 결합하는 것 뿐이지만, 필요하지 않은 경우입니다.drop,reword★★★★★★★★★★★★★★★★★★★★★★★★★★★

다음과 같이 할 수 있습니다.

git reset --soft "HEAD~n"
  • ~n 「」, 「」, 「」)에 대한 커밋의 수.~1,~2 ), ... )

다음으로 다음 명령을 사용하여 커밋메시지를 변경합니다.

git commit --amend

이것은 장기간에 걸쳐서 일어난 일과 거의 같다.squash 1개의 ★★★★★★★★★★★★★★.pick.

그리고 이것은 n개의 커밋에 대해 작동하지만 위의 답변에 따라 두 개의 커밋에 대해서만 작동하지는 않습니다.

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

git log

두 가지 상태가 있습니다.

하나는 커밋이 2개뿐이라는 것입니다.

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

commit A
commit B

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

$ git reset --soft HEAD^1

$ git commit --amend

다른 하나는 커밋 C와 D를 Marge하는 커밋이 3개 이상 있다는 것입니다.

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

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/ 를 참조해 주세요.

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

git checkout -b temp_branch HEAD~2

다음으로 스쿼시는 이 새로운 브랜치에 다른 브랜치를 커밋합니다.

git merge branch_with_two_commits --squash

그것은 변화를 가져오지만 그것들을 커밋하지는 않을 것이다.그러니 그냥 약속만 하면 끝이야

git commit -m "my message"

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

기본 재설정을 취소할 수 있습니다.

git rebase --abort

인터랙티브한 rebase 명령을 다시 실행할 때 'commit; commit은 목록의 pick commit 아래에 있어야 합니다.

$ 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

저는 종종 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'

희망은 모두를 위한 또 다른 방법입니다.

★★★부터 : fromgit 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.

함께 뭉치고 싶은 커밋이 여러 개 있으면 인터랙티브 리베이스 방식으로 할 수 있습니다.(이것에 대해 가르쳐 주셔서 감사합니다!)

  • git rebase origin/develop -i
  • 그런 다음 스쿼시하고 싶은 커밋 앞에 's'를 쓰고 메인 커밋으로 롤업시킵니다.

git rebase-interactive 모드(vim):

  1. 수정할 커밋 라인으로 이동합니다.
  2. ESC)ciw (단어를 아래에 . - (내부 단어 변경)
  3. 원하는 작업을 입력합니다(예:s
  4. ESC)wq조용히 쓰세요, 끝났습니다.

여기에 이미지 설명 입력

git push -f

★★★을 하고 있기 git cherry-pick거의 모든 것에 대해서, 여기에서도 그렇게 하는 것은 당연하다.

가 가지고 있는 가 given given given given given given given given given given given given given given given given 。branchX체크 아웃 하면, 그 끝에 2개의 커밋이 있습니다.그 중 하나의 커밋을 작성하려면 , 그 컨텐츠를 조합합니다.이것을 실행합니다.

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>

브랜치 「」의 .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

위의 2개의 커밋을 Marge 하려면 , 다음의 간단한 순서를 실행합니다.

  1. 첫 번째는 다른 브랜치에서의 마지막 커밋입니다.브랜치 이름을 아무거나 지정할 수 있습니다. git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e (했을 경우 (경합은 발생하지 않습니다.)
  3. 마지막 커밋의 변경은 두 번째 커밋에 있습니다.한 후 "Cherry "를 합니다.git commit --amend.

바로 그겁니다.필요에 따라 분기 "merged-commits"에서 이 병합 버전을 푸시할 수 있습니다.

또한 마스터 브랜치에서 연속된2개의 커밋을 폐기할 수도 있습니다.마스터 브랜치를 다음과 같이 업데이트하십시오.

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

커밋을 스퀴즈하는 등 모든 작업을 마친 후 @greg의 답변에 추가하기 위해 git push를 실행하면(원래 커밋은 브랜치에 남습니다), git push -f origin을 실행하면 커밋이 삭제됩니다.예를 들어, git push를 실행하면 commit B와 commit C가 되지만 git push -f origin을 실행하면 commit BC밖에 없습니다.

최신 커밋을 2개 조합하여 오래된 커밋 메시지만 사용하는 경우 를 사용하여 프로세스를 자동화할 수 있습니다.

내 생각엔:

  • 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

좀 더 쉬운 방법을 제안해드리죠

GIT의 깊은 콘셉트에 들어가 에디터의 크랩에 신경을 쓰는 대신, 다음과 같은 작업을 할 수 있습니다.

bug1이라는 이름의 브런치를 마스터에서 작성했다고 가정합니다.bug1에 대해 2개의 커밋을 했다.이러한 변경이 적용된 파일은 2개만 수정했습니다.

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

그렇게 간단해.

언급URL : https://stackoverflow.com/questions/2563632/how-can-i-merge-two-commits-into-one-if-i-already-started-rebase

반응형