development

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

big-blog 2020. 9. 27. 12:56
반응형

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


2 커밋을 1로 병합하려고 하므로 git ready에서 "rebase로 커밋 스 쿼싱"을 따랐습니다 .

나는 달렸다

git rebase --interactive HEAD~2

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

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

이제 내 작업 트리가이 상태에 도달 했으므로 복구하는 데 문제가 있습니다. 명령 git rebase --interactive HEAD~2이 실패합니다.

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

그리고 git rebase --continue실패

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


요약

오류 메시지

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

"아래로 스쿼시"를 시도했을 가능성이 있음을 의미합니다. Git은 항상 새로운 커밋을 이전 커밋으로 스쿼시 하거나 대화식 리베이스 할일 목록에서 볼 때 "위로", 즉 이전 줄의 커밋으로 스쿼시합니다 . 할 일 목록의 첫 번째 줄에서 명령을 변경하면 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옵션 이 필요 하거나 원격 리포지토리의 권한에 따라 먼저 이전 브랜치를 삭제 한 다음 리베이스 버전을 푸시 할 수 있습니다. 잠재적으로 작업을 파괴하는 명령의 예는이 답변의 범위를 벗어납니다.

당신이없이 다른 사람들과 작업하는 지점에 이미 게시 된 역사를 다시 쓰기 아주 같은 공동 작업자에 암호 나 기타 민감한 정보를 강제로 일을 누출로 좋은 이유와 것은 반사회적이고 다른 개발자를 성가 시게한다. 에서 "복구 업스트림 Rebase 현재에서"섹션 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및 1과 거의 동일 pick합니다.

And it works for n commits but not just two commits as above answer prompted.


First you should check how many commits you have:

git log

There are two status:

One is that there are only two commits:

For example:

commit A
commit B

(In this case, you can't use git rebase to do) you need to do following.

$ git reset --soft HEAD^1

$ git commit --amend

Another is that there are more than two commits; you want to merge commit C and D.

For example:

commit A
commit B
commit C
commit D

(under this condition, you can use git rebase)

git rebase -i B

And than use "squash" to do. The rest thins is very easy. If you still don't know, please read http://zerodie.github.io/blog/2012/01/19/git-rebase-i/


Assuming you were in your own topic branch. If you want to merge the last 2 commits into one and look like a hero, branch off the commit just before you made the last two commits.

git checkout -b temp_branch HEAD^2

Then squash commit the other branch in this new branch:

git merge branch_with_two_commits --squash

That will bring in the changes but not commit them. So just commit them and you're done.

git commit -m "my message"

Now you can merge this new topic branch back into your main branch.


you can cancel the rebase with

git rebase --abort

and when you run the interactive rebase command again the 'squash; commit must be below the pick commit in the list


I often use git reset --mixed to revert a base version before multiple commits which you want to merge, then I make a new commit, that way could let your commit newest, assure your version is HEAD after you push to server.

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

If I want to merge head two commits into one, first I use :

git reset --mixed 249cf9392da197573a17c8426c282

"249cf9392da197573a17c8426c282" was third version, also is your base version before you merge, after that, I make a new commit :

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

It's all, hope is another way for everybody.

FYI, from 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.

$ git rebase --abort

Run this code at any time if you want to undo the git rebase

$ git rebase -i HEAD~2

To reapply last two commits. The above command will open a code editor

  • [ The latest commit will be at the bottom ]. Change the last commit to squash(s). Since squash will meld with previous commit.
  • Then press esc key and type :wq to save and close

After :wq you will be in active rebase mode

Note: You'll get another editor if no warning/error messages, If there is an error or warning another editor will not show, you may abort by runnning $ git rebase --abort if you see an error or warning else just continue by running $ git rebase --continue

You will see your 2 commit message. Choose one or write your own commit message, save and quit [:wq]

Note 2: You may need to force push your changes to the remote repo if you run rebase command

$ git push -f

$ git push -f origin master


Since I use git cherry-pick for just about everything, to me it comes natural to do so even here.

Given that I have branchX checked out and there are two commits at the tip of it, of which I want to create one commit combining their content, I do this:

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

If i want to update branchX as well (and I suppose this is the down side of this method) I also have to:

git checkout branchX
git reset --hard <the_new_commit>

If your master branch git log looks something like following:

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

and you want to merge the top two commits just do following easy steps:

  1. First to be on safe side checkout the second last commit in a separate branch. You can name the branch anything. git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. Now, just cherry-pick your changes from the last commit into this new branch as: git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e. (Resolve conflicts if arise any)
  3. So now, your changes in last commit are there in your second last commit. But you still have to commit, so first add the changes you just cherry-picked and then execute git commit --amend.

That's it. You may push this merged version in branch "merged-commits" if you like.

Also, you can discard the back-to-back two commits in your master branch now. Just update your master branch as:

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

If you want to combine the two most recent commits and just use the older commit's message, you can automate the process using expect.

I assume:

  • You're using vi as your editor
  • Your commits are one-line each

I tested with git version 2.14.3 (Apple Git-98).


#!/usr/bin/env expect
spawn git rebase -i HEAD~2

# down, delete word, insert 's' (for squash), Escape, save and quit
send "jdwis \033:wq\r"

expect "# This is a"

# down 4, delete 3 lines, save and quit
send "4j3d\r:wq\r"

interact

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

반응형