Lỗi: Không thể kéo với rebase: Bạn có những thay đổi chưa được thực hiện


138

Tôi đã bắt đầu hợp tác với một vài người bạn trong một dự án và họ sử dụng kho lưu trữ heroku git.

Tôi đã nhân bản kho lưu trữ một vài ngày trước và họ đã thực hiện một số thay đổi vì vậy tôi đang cố gắng để có được các bản cập nhật mới nhất

Tôi đã chạy git pull --rebaselệnh như đã nêu ở đây (Đây có phải là cách đúng đắn để làm điều đó không?): Https://devcenter.heroku.com/articles/shared#merging-code-changes

Tôi nhận được lỗi sau đây:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Tôi đoán là tôi đã làm hỏng mã và bây giờ nó muốn tôi cam kết hoặc loại bỏ (đó có phải là stash nghĩa là gì không?) Những thay đổi. Đây có phải là những gì đang xảy ra? Nếu đây là trường hợp tôi muốn loại bỏ bất kỳ thay đổi nào tôi có thể đã thực hiện và chỉ cần lấy mã cập nhật từ kho git.

Bất cứ ý tưởng về những gì tôi có thể làm?

Câu trả lời:


173

Làm git status, điều này sẽ cho bạn thấy những gì các tập tin đã thay đổi. Vì bạn đã tuyên bố rằng bạn không muốn giữ những thay đổi bạn có thể làm git checkout -- <file name>hoặc git reset --hardloại bỏ những thay đổi đó.

Đối với hầu hết các phần, git sẽ cho bạn biết phải làm gì về những thay đổi. Ví dụ, thông báo lỗi của bạn cho biết git stashnhững thay đổi của bạn. Điều này sẽ là nếu bạn muốn giữ chúng. Sau khi kéo, bạn sẽ làm git stash popvà thay đổi của bạn sẽ được áp dụng lại.

git status cũng có cách loại bỏ các thay đổi tùy thuộc vào việc tệp có được phân loại cho cam kết hay không.


1
Điều này dường như đã có tác dụng nhưng bây giờ tôi đang gặp phải một lỗi khác (bắt đầu một câu hỏi mới để không nhầm lẫn giữa các khách hàng
tiềm năng

Tôi thực sự có điều này mỗi lần, chỉ gần đây. Trước đây, việc kéo các tệp không ảnh hưởng đến các thay đổi hiện tại của bạn là ổn nhưng bây giờ, nó yêu cầu mọi thứ bạn thay đổi để bỏ rác. Tôi thậm chí không thể đẩy, tôi buộc phải sử dụnggit push -f
Karma Blackshaw

@KarmaBlackshaw Bạn không cần phải ép. Nếu bạn phải thực hiện một động tác thúc đẩy, điều đó có nghĩa là lịch sử địa phương và lịch sử từ xa của bạn khác nhau và đó là một câu hỏi khác với câu trả lời này.
Schleis

Nó thực sự là một khác biệt mà những gì phạm vi của câu hỏi này cung cấp. Nhưng tôi đã tìm ra cách bằng cách xóa chi nhánh hiện tại và tạo một chi nhánh mới để phát triển. Tôi đoán đó là chi nhánh của tôi có một số thứ được cấu hình sai.
Karma Blackshaw

91

Nếu bạn muốn giữ các thay đổi làm việc của mình trong khi thực hiện rebase, bạn có thể sử dụng --autostash. Từ tài liệu :

Trước khi bắt đầu rebase, hãy bỏ các sửa đổi cục bộ (xem git-stash [1] ) nếu cần và áp dụng stash khi hoàn tất.

Ví dụ:

git pull --rebase --autostash

7
Đây là câu trả lời hiện đại.
adl

13
Nếu bạn muốn autostash là hành vi mặc định bạn có thể đặt git config --global rebase.autoStash true thì bạn không cần phải chuyển công tắc.
Zoredache

1
NÀY, những gì tôi đang tìm kiếm! (lưu ý rằng công tắc dòng lệnh có sẵn từ git 2.9, nhưng tùy chọn rebase.autostashcó sẵn từ 2.6).
jjmontes

Điều này làm việc tuyệt vời cho git rebase --interactivequá!
Dan Dascalescu

6
Tại sao đây không phải là mặc định?
Nick

49

Kéo theo rebase là một thực hành tốt nói chung.

Tuy nhiên, bạn không thể làm điều đó nếu chỉ mục của bạn không sạch, tức là bạn đã thực hiện các thay đổi chưa được cam kết.

Bạn có thể làm điều này để giải quyết, giả sử bạn muốn giữ các thay đổi của mình:

  1. cất các thay đổi của bạn với: git stash
  2. kéo từ chủ với rebase
  3. áp dụng lại các thay đổi bạn đã lưu trong (1) với: git stash apply stash@{0}hoặc đơn giản hơngit stash pop

1
Điều này dường như đã có tác dụng nhưng bây giờ tôi đang gặp phải một lỗi khác (bắt đầu một câu hỏi mới để không nhầm lẫn giữa các khách hàng
tiềm năng

6
@nehemiahjacob Bạn cũng có thể git stash popáp dụng các thay đổi được lưu gần đây nhất và để tránh ghi nhớ lâu hơn apply stash@{0}.
Kostas Rousis

Tôi phải làm điều này mọi lúc. Cách nào dễ hơn?
Alper

@alper thường bạn làm việc trên một nhánh (tính năng) khác. Theo kinh nghiệm của tôi, tôi chỉ tìm nạp và nổi loạn chống lại chủ sau khi tôi đã hoàn thành công việc của mình, vì vậy không cần phải stash / pop. Nếu bạn thấy mình mặc dù làm điều đó rất nhiều trong quá trình phát triển, bạn luôn có thể tạo bí danh trong .bashrc(hoặc bất cứ thứ gì bạn sử dụng):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis Tôi có bí danh chính xác đó, lol. Tôi gọi nó là 'sppgit'
luizfls

30

Đầu tiên bắt đầu với một git status

Xem nếu bạn có bất kỳ thay đổi đang chờ xử lý. Để loại bỏ chúng, chạy

git reset --hard

Điều này dường như đã có tác dụng nhưng bây giờ tôi đang gặp phải một lỗi khác (bắt đầu một câu hỏi mới để không nhầm lẫn giữa các khách hàng
tiềm năng

16

Điều này làm việc cho tôi:

git fetch
git rebase --autostash FETCH_HEAD

1
Ah autostash, giúp tôi tiết kiệm thêm hai lệnh. Đây phải là câu trả lời đúng IMO.
Erik Berkun-Drevnig

10

Bạn luôn có thể làm

git fetch && git merge --ff-only origin/master

và bạn sẽ không nhận được (a) thay đổi nếu bạn có những thay đổi không được cam kết xung đột với thay đổi ngược dòng hoặc (b) có tác dụng tương tự như stash / pull / áp dụng: một cuộc nổi loạn để đưa bạn vào những thay đổi mới nhất từ ​​HEAD và những thay đổi không được cam kết của bạn như là


6

Khi thay đổi không được thực hiện là do git đang cố gắng sửa các quy ước eol trên một tệp (như mọi khi là trường hợp của tôi), không có số lượng stashing hoặc check-out hoặc đặt lại sẽ khiến nó biến mất.

Tuy nhiên, nếu mục đích thực sự là phản ứng lại và bỏ qua những thay đổi chưa được thực hiện, thì việc tôi làm là xóa chi nhánh cục bộ sau đó kiểm tra lại.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! Nó chưa làm tôi thất bại.


2

Nếu bạn muốn tự động bỏ các thay đổi của mình và hủy bỏ chúng cho mỗi lần nổi loạn, bạn có thể làm điều này:

git config --global rebase.autoStash true

1
Đây là câu trả lời duy nhất làm cho phiên bản Git mới nhất hoạt động giống như cách mà Git luôn hoạt động trong quá khứ. Tại sao làm cho mọi người thêm --autostashkhi nó chỉ có thể là ... tự động?
Andrew Koster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.