2010-10-27 29 views
100

Tôi có một nhánh git (gọi là v4), được tạo ra từ chủ ngay hôm qua. Có một vài thay đổi để làm chủ, rằng tôi muốn nhận được vào v4. Vì vậy, trong v4, tôi đã cố gắng thực hiện rebase từ master, và một tập tin tiếp tục sửa đổi mọi thứ: một tệp văn bản một dòng, chứa số phiên bản. Tập tin này là app/views/common/version.txt, mà trước rebasing chứa văn bản này:Khởi động lại Git: xung đột ngăn chặn tiến trình

v1.4-alpha-02 

Đây là những gì tôi đang làm:

> 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". 

Các version.txt bây giờ trông như thế này:

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

Vì vậy, tôi dọn dẹp nó và trông giống như sau:

v1.4-alpha-02 

và sau đó tôi đã cố gắng để tiếp tục: lúc đầu tôi thử một cam kết:

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

Không may mắn đó. Vì vậy, tôi đã cố thêm tệp:

git add app/views/common/version.txt 

Không phản hồi. Không có tin tức là tin tốt, tôi đoán vậy. Vì vậy, tôi cố gắng tiếp tục:

> 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". 

Đó là vào thời điểm này, sau khi đi vòng quanh với điều này, tôi đang đập đầu của tôi ra khỏi bàn làm việc.

Điều gì đang xảy ra ở đây? Tôi đang làm gì sai? Ai có thể đặt tôi thẳng không?

EDIT - cho unutbu

Tôi đã thay đổi các tập tin như bạn đề nghị và nhận được lỗi tương tự:

> 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". 
+7

cảm ơn vì đã đặt câu hỏi này .. Tôi đã đối mặt với cùng một vấn đề –

+5

sẽ rất tuyệt nếu bạn xác nhận một số câu trả lời – holms

+3

@MaxWilliams, tôi nghĩ bạn (như tôi) đã hiểu sai [@unutbu] (http: // stackoverflow. com/a/4033058/277826) 's lời khuyên: 1) đầu tiên bạn chạy 'git rebase master' _và để cho nó fail_; 2) sau đó bạn chỉnh sửa 'version.txt' và làm cho nó như là nó nên nhìn vào điểm đó, và lưu chỉnh sửa; 3) sau đó bạn 'git add .../version.txt'; 4) sau đó bạn làm 'git rebase --continue' (_ ** not ** 'commit'_)! Nếu 'rebase --continue' thành công ở đây, _it đã được commit_ (không cần' git commit' ở đây!) - vì vậy tất cả những gì còn lại phải làm là 'git push' (nếu bạn sử dụng repo từ xa). Hy vọng điều này sẽ giúp, nếu tôi hiểu đúng ':)' - chúc mừng! – sdaau

Trả lời

87

tôi gặp phải một vấn đề tương tự với một rebase. Vấn đề của tôi đã được gây ra bởi vì một trong những cam kết của tôi chỉ thay đổi một tập tin, và khi giải quyết, tôi loại bỏ sự thay đổi được giới thiệu trong cam kết này. Tôi đã có thể giải quyết vấn đề của mình bằng cách bỏ qua cam kết tương ứng (git rebase --skip).

Bạn có thể tạo lại sự cố này trong kho kiểm tra. Đầu tiên tạo kho lưu trữ.

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

Sau đó, hãy cam kết nội dung gốc của version.txt trong bản gốc.

$ 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 

Tạo chi nhánh v4 và thay đổi nội dung của 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(-) 

Quay trở lại master và thay đổi nội dung của version.txt để sẽ có một conflit trong rebase.

$ 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(-) 

Chuyển về chi nhánh v4 và thử rebase. Nó thất bại với một conflit trong version.txt như kế hoạch.

$ 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 

Chúng tôi giải quyết xung đột bằng cách chọn nội dung master của version.txt. Chúng tôi thêm tệp và cố gắng tiếp tục việc rebase của chúng tôi.

$ 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". 

Không thành công! Hãy xem những gì thay đổi git nghĩ rằng có trong kho của chúng tôi.

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

Ah ah, không có thay đổi.Nếu bạn đọc chi tiết thông báo lỗi trước, git hãy thông báo cho chúng tôi về điều này và được đề nghị sử dụng git rebase --skip. Ông nói với chúng tôi "Nếu không có gì để lại sân khấu, có thể là một cái gì đó khác đã được giới thiệu cùng một thay đổi, bạn có thể muốn bỏ qua miếng vá này." Vì vậy, chúng tôi chỉ bỏ qua các cam kết và rebase thành công.

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

Lời thận trọng: Xin lưu ý rằng git rebase --skip sẽ hoàn toàn thả các cam kết rằng git cố gắng rebase. Trong trường hợp của chúng tôi, điều này sẽ không sao vì git đang khiếu nại đây là một cam kết trống. Nếu bạn nghĩ rằng bạn đã mất các thay đổi khi hoàn tất quá trình rebase, bạn có thể sử dụng git reflog để nhận id cam kết của kho lưu trữ trước khi rebase và sử dụng git reset --hard để đưa kho của bạn trở lại trạng thái đó (đây là một hoạt động phá hoại khác).

+4

Cảm ơn bạn đã dành thời gian để viết lời giải thích dài dòng Sylvain! Điều đó làm cho nó rõ ràng hơn. Tôi nghĩ rằng tôi luôn lo lắng về việc bỏ qua một bản vá vì nó cảm thấy như công việc có thể bị mất: tức là bản vá liên quan đến tất cả các tệp bị ảnh hưởng bởi việc rebase, chứ không phải chỉ là một cuộc xung đột. Là một bản vá chỉ là một hợp nhất trên một tập tin duy nhất sau đó? –

+3

Không, một bản vá chứa tất cả sự khác biệt trên tất cả các tệp được sửa đổi trong một lần commit. Nhưng khi sử dụng 'git rebase --skip', bạn chỉ bỏ qua một lần commit. Tôi thường phát hành trạng thái 'git' trước khi bỏ qua một cam kết để xem liệu tôi có đang ở trong tình huống này hay không. –

+1

Tôi chỉ muốn lặp lại Max khi cảm ơn vì đã dành thời gian để viết một lời giải thích tuyệt vời — cuối cùng tôi cũng hiểu tại sao điều này lại xảy ra. Tôi cũng không còn sợ 'rebase --skip' :) nữa. –

6

Thay đổi app/views/common/version.txt để

v1.4-alpha-01 

Tại thời điểm này trong quá trình rebase, hãy nhớ rằng bạn đang giải quyết xung đột hợp nhất để hiển thị tiến trình của chi nhánh phi phi chính.

Vì vậy, trong rebasing từ

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

để

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

cuộc xung đột bạn đang giải quyết là làm thế nào để tạo ra A * trên cành chủ đề.

Vì vậy, sau khi làm git rebase --abort, các lệnh nên

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

Cảm ơn unutbu, tôi đã thử nhưng không may mắn: xem OP cho chỉnh sửa mới. cổ vũ –

3

Các hành vi bạn thấy không phải là những gì tôi mong chờ từ một rebase điển hình chỉ với cuộc xung đột này. Hãy xem xét sử dụng một nhánh riêng biệt để thực hiện việc rebase này (đặc biệt nếu bạn đã đẩy các cam kết từ xa mà bạn đang chuyển tiếp nhanh). Ngoài ra, git mergetool có thể hữu ích để giải quyết xung đột và ghi nhớ phát hành git add.

Trong ví dụ tối thiểu này, quá trình rebase hoạt động như mong đợi. Bạn có thể cung cấp một ví dụ cho thấy hành vi bạn đang thấy không?

#!/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 
3

Dưới đây là một số ý tưởng:

  • Trước khi bắt đầu rebase, hãy chắc chắn bạn không phải là ở giữa một rebase hoặc là. Đừng: rm -rf .git/rebase-apply
  • Một chút bạn đề cập đến tôi không hiểu: "và sau đó cố gắng tiếp tục: lúc đầu tôi cố gắng một cam kết:" ... tại sao cam ? Ở giữa của một rebase tôi nghĩ rằng bạn chỉ nên "git thêm" sau khi bạn dọn dẹp hoặc "git rm" để quăng thay đổi hoặc xác nhận một tập tin xóa. Có lẽ điều đó đã làm rối tung điều gì đó?
  • thử một merge instead of a rebase
  • thử some of Ethan Rowe's ideas
16

Trích dẫn từ đây: http://wholemeal.co.nz/node/9

Huh?!? No, I didn't forget to use git add, I did it ... like ... 2 seconds ago!

Turns out that because there is no change from the patch git suspects something has gone wrong. Git expects a patch to have been applied, but the file has remained unchanged.

The error message is not very intuitive, but it does contain the answer. We just need to tell rebase to skip this patch. It's also not necessary to fix the conflict markers in the file. You will end up with the file version from the branch you are rebasing on.

$ git rebase --skip 
+0

Sau khi tôi sử dụng git mergetool và sửa các thay đổi, sau đó thêm chúng và cam kết chúng, tôi chỉ cần nhập git rebase --skip trong khi 'Hiện không thuộc bất kỳ chi nhánh nào'. Và mọi thứ đã được sửa. Cảm ơn! – geerlingguy

+0

Thực ra, tôi nghĩ đó là sự kết hợp giữa git mergetool liên tục, sau đó git rebase --continue, sau đó git mergetool, v.v. cuối cùng đã khắc phục tình trạng của tôi. – geerlingguy

4

Thông báo lỗi đó là kết quả của số git commit -a -m "merged" của bạn. Nếu bạn chỉ sửa tệp, hãy chạy git add <file>git rebase --continue, tệp sẽ hoạt động tốt. git rebase --continue đang cố gắng thực hiện cam kết, nhưng việc tìm kiếm không có thay đổi đang chờ xử lý nào (vì bạn đã cam kết với họ).

+1

Điều này có vẻ là một việc tốt hợp lý hơn là bỏ qua, ít nhất là trong trường hợp chung. Tôi ngạc nhiên nó không được liệt kê là câu trả lời hay nhất. –

+1

@EmeraldD., Không hoạt động. Sửa tệp và chạy 'git add ' sẽ không giải quyết được sự cố. 'git rebase --continue' ** vẫn ** báo cáo *' Không có thay đổi - bạn đã quên sử dụng 'git add'? '* – Pacerier

Các vấn đề liên quan