Git rebase : 충돌이 진행을 계속 차단합니다.


120

어제 master에서 만든 git 브랜치 (v4라고 함)가 있습니다. 마스터에 몇 가지 변경 사항이 있으며 v4에 들어가고 싶습니다. 그래서 v4에서는 마스터에서 리베이스를 시도했지만 한 파일이 계속 문제를 일으키고 있습니다. 버전 번호가 포함 된 한 줄 텍스트 파일입니다. 이 파일은입니다 app/views/common/version.txt. 리베이스하기 전에 다음 텍스트가 포함됩니다.

v1.4-alpha-02

내가하는 일은 다음과 같습니다.

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

version.txt이제 다음과 같습니다 :

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

그래서 정리하면 다음과 같이 보입니다.

v1.4-alpha-02

그리고 나서 계속 시도했습니다. 처음에는 커밋을 시도합니다.

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

거기에 행운이 없습니다. 그래서 파일을 추가하려고했습니다.

git add app/views/common/version.txt

응답 없음. 좋은 소식은 없습니다. 그래서 계속하려고합니다.

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

이 시점에서 이것으로 빙글 빙글 돌아서 책상에서 머리를 두드리는 것입니다.

여기서 무슨 일이 일어나고 있습니까? 내가 뭘 잘못하고 있죠? 누구든지 나를 바로 잡을 수 있습니까?

편집-unutbu

제안한대로 파일을 변경했는데 동일한 오류가 발생합니다.

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

10
덕분에이 질문을 위해 .. 난 똑같은 문제에 직면했다
Archan 슈라

6
답변을 확인하면 좋을 것입니다
holms aug.

3
@MaxWilliams, 나는 당신이 (나와 같은) @unutbu 의 조언을 잘못 해석했다고 생각합니다 : 1) 먼저 실행 git rebase master 하고 실패하게하십시오 . 2) 그런 다음 편집 version.txt하고 그 지점에서 볼 수 있도록 만들고 편집 내용을 저장하십시오. 3) 다음 당신 git add .../version.txt; 4) 다음 않는 git rebase --continue( 하지 '커밋' )! 경우 rebase --continue여기에 성공, 그것은 이미 최선을 다하고되지 않습니다 (필요 git commit여기를!) - 남아있는 모든이 할 수 있도록 git push(원격 REPO를 사용하는 경우). 이것이 도움이 :)되기를 바랍니다.
sdaau

@MaxWilliams는, 혹시 이것에 대한 답을 얻을 않았다 ruby-forum.com/topic/187288가 (나는 즉시 다른 사람이 먼저 거기에 도착하지 않는 경우 응답 후이 삭제됩니다!)
ATW

답변:


102

리베이스와 비슷한 문제가 발생했습니다. 내 커밋 중 하나가 파일 만 변경했기 때문에 문제가 발생했으며 해결할 때이 커밋에 도입 된 변경 사항을 버렸습니다. 해당 커밋 ( git rebase --skip) 을 건너 뛰어 문제를 해결할 수있었습니다 .

테스트 저장소에서이 문제를 재현 할 수 있습니다. 먼저 저장소를 만듭니다.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

그런 다음 version.txt마스터에서 의 원본 콘텐츠를 커밋합니다 .

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

만들기 v4분기 및 내용을 변경 version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

로 돌아가 master의 내용을 변경 version.txt하여 리베이스 중에 충돌이 발생하도록합니다.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

v4분기로 다시 전환 하고 리베이스를 시도하십시오. version.txt계획대로 충돌이 발생하여 실패합니다 .

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

master콘텐츠를 선택하여 충돌을 해결합니다 version.txt. 파일을 추가하고 리베이스를 계속합니다.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

실패합니다! git우리 저장소에 어떤 변화가 있다고 생각 하는지 봅시다 .

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

아 아, 변화가 없습니다. 이전 오류 메시지를 자세히 읽은 경우이를 git알려주고 git rebase --skip. 그는 우리에게 "무대에 남은 것이 없다면 다른 것이 이미 동일한 변경 사항을 도입했을 가능성이 있습니다.이 패치를 건너 뛰는 것이 좋습니다." 그래서 우리는 커밋을 건너 뛰고 rebase가 성공합니다.

$ git rebase --skip
HEAD is now at 7313eb3 master

주의 사항 : 리베이스 git rebase --skipgit시도한 커밋은 완전히 삭제됩니다 . 우리의 경우 이것은 이것이 git빈 커밋이라고 불평하기 때문에 괜찮을 것 입니다. 리베이스가 완료되면 변경 사항을 잃었다 고 생각되면를 사용 git reflog하여 리베이스 전에 저장소의 커밋 ID를 가져오고을 사용 git reset --hard하여 해당 상태로 저장소를 되돌릴 수 있습니다 (이것은 또 다른 파괴적인 작업입니다).


4
시간을내어 Sylvain에 대한 긴 설명을 작성해 주셔서 감사합니다! 그게 더 명확 해집니다. 작업이 손실 될 수있는 것처럼 느껴졌 기 때문에 패치를 건너 뛰는 것이 항상 긴장된 것 같습니다. 즉, 패치가 충돌이있는 파일이 아닌 리베이스의 영향을받는 모든 파일을 포함하고 있다는 것입니다. 패치는 단일 파일에 대한 단일 병합입니까?
Max Williams

3
아니요, 패치에는 단일 커밋에서 수정 된 모든 파일의 모든 차이점이 포함됩니다. 그러나를 사용할 때는 git rebase --skip단일 커밋 만 건너 뜁니다. 나는 일반적으로 git status내가 이런 상황에 있는지 확인하기 위해 커밋을 건너 뛰기 전에 a 를 발행합니다 .
Sylvain Defresne

1
시간을내어 훌륭한 설명을 작성해 주셔서 감사하다는 말로 Max를 반향하고 싶었습니다. 마침내 왜 이런 일이 발생하는지 이해합니다. 나는 또한 더 이상 무서워하지 않습니다 rebase --skip:).
Ben Dolman 2011

1
경고-한 커밋에 여러 변경 사항이있는 경우 git rebase --skip을 수행하면 작업이 손실 될 수 있습니다. 나는 방금했다
Chrissy H

@ChrissyH를 사용하지 않는 한 git reflog purge또는 git reflog delete을 사용하여 변경 사항을 다시 가져올 수 있습니다 git reflog. 거기에서 참조되는 다른 커밋을 확인하십시오. 그중 하나는 전체를 시작하기 전에 트리의 상태 여야합니다 git rebase.
Sylvain Defresne 2013

23

여기에서 인용 : http://wholemeal.co.nz/node/9

어?!? 아니요, git add 사용하는 것을 잊지 않았습니다. 2 초 전에 해냈습니다!

패치에서 변경 사항이 없기 때문에 git은 무언가 잘못되었다고 의심합니다. Git은 패치가 적용될 것으로 예상하지만 파일은 변경되지 않았습니다.

오류 메시지는 그다지 직관적이지 않지만 답이 포함되어 있습니다. 이 패치를 건너 뛰도록 rebase에 지시하면됩니다. 또한 파일의 충돌 마커를 수정할 필요가 없습니다. 리베이스하는 브랜치의 파일 버전으로 끝납니다.

$ git rebase --skip

git mergetool을 사용하고 변경 사항을 수정 한 다음 추가하고 커밋 한 후 '현재 브랜치에 없음'동안 <code> git rebase --skip </ code>를 입력했습니다. 그리고 모든 것이 수정되었습니다. 감사!
geerlingguy

실제로 계속해서 git mergetool을 실행 한 다음 git rebase --continue, git mergetool 등을 조합하여 마침내 내 상황을 해결했다고 생각합니다.
geerlingguy

6

이 오류 메시지는 git commit -a -m "merged". 파일을 수정 한 다음 git add <file>, 및 을 실행 git rebase --continue하면 제대로 작동합니다. git rebase --continue커밋을 시도하지만 커밋 할 보류중인 변경 사항이 없음을 발견했습니다 (이미 커밋했기 때문에).


1
이것은 적어도 일반적인 경우에는 건너 뛰는 것보다 훨씬 합리적으로 보입니다. 나는 그것이 베스트 답변으로 나열되지 않은 것에 놀랐습니다.
EmeraldD.

1
@EmeraldD., 작동하지 않습니다. 파일을 수정하고 실행 git add <file>해도 문제가 해결되지 않습니다. git rebase --continue 여전히 보고No changes - did you forget to use 'git add'?
Pacerier

6

app / views / common / version.txt를 다음으로 변경하십시오.

v1.4-alpha-01

리베이스의이 시점에서 비 마스터 분기 의 진행 상황을 표시하기 위해 병합 충돌을 해결하고 있음을 기억하십시오 .

그래서, 리베이스에서

      A---B---C topic
     /
D---E---F---G master

              A*--B*--C* topic
             /
D---E---F---G master

해결하려는 갈등은 주제 브랜치에서 A *를 만드는 방법입니다.

따라서을 수행 한 후 git rebase --abort명령은

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

3
감사합니다 unutbu, 시도했지만 운이 없습니다. 새로운 편집을 위해 OP를 참조하십시오. 환호
Max Williams

4

당신이보고있는 행동은이 충돌만으로 전형적인 리베이스에서 기대할 수있는 것이 아닙니다. 이 리베이스를 수행하기 위해 별도의 분기를 사용하는 것을 고려하십시오 (특히 빨리 감기중인 커밋을 이미 원격으로 푸시 한 경우). 또한 git mergetool충돌을 해결하고 git add.

이 최소한의 예에서 rebase는 예상대로 작동합니다. 당신이보고있는 행동을 보여주는 예를 제공 할 수 있습니까?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue

4

다음은 몇 가지 아이디어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.