Lỗi khi thay đổi thành nhánh chính: các thay đổi cục bộ của tôi sẽ bị ghi đè khi thanh toán


127

Câu hỏi này tương tự như câu hỏi này , nhưng cụ thể hơn.

Tôi có một dự án với hai chi nhánh ( stagingbeta).

Tôi phát triển stagingvà sử dụng masterchi nhánh để sửa lỗi. Vì vậy, nếu tôi đang làm việc trên sân khấu và tôi thấy một lỗi, tôi đổi sang masterchi nhánh:

git checkout master

và làm những thứ:

git add fileToAdd
git commit -m "bug fixed"

và sau đó tôi hợp nhất với cả hai nhánh:

git checkout staging
git merge master
git checkout beta
git merge beta

Và không có vấn đề gì nếu có các tệp khác trên cây làm việc.

Nhưng bây giờ, khi tôi cố gắng đổi sang masterchi nhánh, tôi gặp lỗi :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Tôi nghĩ rằng tôi nên xóa tập tin khỏi khu vực tổ chức:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

Nhưng tôi đang nhận được cùng một lỗi. Nếu tôi làm git statustôi nhận đượcNo changes to commit


4
Bạn đã thử reset --hardchưa Nếu bạn thực sự chắc chắn muốn loại bỏ những thay đổi của bạn. Hoặc sử dụng stash nếu bạn không.
keltar

@keltar - Không. Tôi không muốn loại bỏ những thay đổi của mình. Chỉ cần giữ chúng trên cây làm việc cho một cam kết sau này
Manolo

1
Tôi không nghĩ bạn có thể chuyển đổi chi nhánh trong khi vẫn giữ những thay đổi không được cam kết, nhưng tôi có thể dễ dàng sai - không thực sự là lĩnh vực của tôi. Hãy thử git add your-filevà cam kết.
keltar

@keltar - Tôi đã từng làm việc trước đây theo cách này. Tôi không muốn thực hiện bất kỳ thay đổi nào lúc này staging.
Manolo

Có lẽ tập tin xung đột của bạn đã không thay đổi khi bạn thử điều đó trước đây. Bạn có thay đổi, git phải lưu chúng ở đâu đó để khôi phục lại sau này. Nó là rất khó có thể có thể mà không có cam kết. Nhưng nếu bạn thực sự không muốn - sử dụng stash, thì đó chính xác là lý do tại sao nó tồn tại.
keltar

Câu trả lời:


128

Lỗi của bạn xuất hiện khi bạn đã sửa đổi một tệp và nhánh mà bạn đang chuyển sang cũng có các thay đổi cho tệp này (từ điểm hợp nhất mới nhất).

Các tùy chọn của bạn, như tôi thấy, là - cam kết, và sau đó sửa đổi cam kết này với các thay đổi bổ sung (bạn có thể sửa đổi các cam kết trong git, miễn là chúng không phù pushhợp); hoặc - sử dụng stash:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savesẽ tạo stash chứa các thay đổi của bạn, nhưng nó không được liên kết với bất kỳ cam kết hoặc thậm chí chi nhánh. git stash popsẽ áp dụng mục nhập mới nhất cho chi nhánh hiện tại của bạn, khôi phục các thay đổi đã lưu và xóa nó khỏi stash.


3
Cảm ơn bạn. Bạn có chắc chắn rằng điều này sẽ không làm bất kỳ thay đổi nào trên cây làm việc của tôi (không thêm tệp) không? Tôi không muốn mất các thay đổi của mình: - /
Manolo

Rất tiếc, nhầm lẫn addkhi nó thực sự save.. được cập nhật. Ý bạn là, đối với các tập tin khác? git stash savekhông có tham số tên tệp sẽ lưu tất cả các tệp đã sửa đổi, nếu bạn muốn (và hoàn nguyên chúng về trạng thái cam kết mới nhất). Và có thêm bản sao của cây thư mục không bao giờ bị tổn thương, nhưng tôi luôn hoang tưởng về nó.
keltar

Điều này sẽ được lưu tất cả các tập tin sửa đổi, ngoại trừ tập tin tôi muốn thêm vào masterchi nhánh. Ngoài ra, một lựa chọn sẽ là popnhững thay đổi trên chi nhánh khác?
Manolo

Tôi không chắc ý của bạn là gì. Có, bạn có thể áp dụng stash trên một nhánh khác, nhưng nó sẽ chỉ thay thế nội dung tệp chứ không hợp nhất chúng.
keltar

1
@Honey nó không liên quan gì đến các chi nhánh, vấn đề là những thay đổi không được cam kết. Theo định nghĩa, Checkout phải đặt lại các tệp của bạn về trạng thái master, nhưng bằng cách đó, nó sẽ mất nội dung hiện tại và vì nội dung này không được cam kết nên không thể quay lại trạng thái này sau đó, do đó bạn gặp lỗi sẽ không buồn về những thay đổi bị mất sau này.
keltar

149

Tôi đã gặp vấn đề tương tự và giải quyết nó bằng cách

git checkout -f branch

và đặc điểm kỹ thuật của nó là khá rõ ràng.

-f, - lực lượng

Khi chuyển nhánh, tiến hành ngay cả khi chỉ mục hoặc cây làm việc khác với HEAD. Cái này dùng để vứt đi những thay đổi địa phương.

Khi kiểm tra các đường dẫn từ chỉ mục, không thất bại khi các mục không được trộn; thay vào đó, các mục không được trộn được bỏ qua.


7
Khi git của tôi bị kẹt (không có thay đổi cục bộ nhưng vẫn có lỗi đó), giải pháp này đã giúp tôi!
lukyer

5
Cảm ơn, bạn đã lưu màn hình của tôi khỏi bị nắm tay thông qua nó.

3
Tôi đã mất những thay đổi theo cách đó
Jacek Dziurdzikowski

1
Có bạn sẽ mất thay đổi bằng cách làm điều này, điều này sẽ đi kèm với một cảnh báo lớn.
Alexander Mills

Tôi muốn nó ở phía bên kia. chủ nhân đứng sau chi nhánh của tôi và tôi cập nhật với chủ nhưng vẫn không thể chuyển chi nhánh. Phải là một lỗi git.
jgmjgm

12

Bạn có thể buộc kiểm tra chi nhánh của mình, nếu bạn không muốn thực hiện các thay đổi cục bộ của mình.

git checkout -f branch_name

1
Điều sudonày là không cần thiết, nó sẽ chỉ phá vỡ các quyền của tập tin. Đó là lệnh git tương tự như được đăng bởi @kiki_yu một năm trước, nhưng thậm chí còn tệ hơn.
kenorb

2
Tôi đã mất những thay đổi theo cách đó
Jacek Dziurdzikowski

2
@JacekDziurdzikowski Vì vậy, bạn đã mất các thay đổi của mình hai lần (xem nhận xét về câu trả lời của kiki_yu), cả hai bằng cách áp dụng các giải pháp được đề cập rất rõ ràng rằng loại bỏ các thay đổi cục bộ là mục đích chính . Là máy dò châm biếm của tôi bị hỏng hoặc ... bạn nghiêm túc?
RomainValeri

@RomainValeri Hmm, tôi đoán đó là cách tôi cảnh báo những người khác là người mới bắt đầu với git (họ phải là người mới bắt đầu nếu đọc bài đăng này) để sẵn sàng nói lời tạm biệt với bất kỳ thay đổi nào họ đã thực hiện. Tôi nghĩ rằng thời gian mà những thay đổi được thực hiện trong một chi nhánh nên ở lại chi nhánh đó cho đến khi tôi kiểm tra lại. Gợi ý cho những người mới cũng nghĩ như vậy: sử dụng git stash :)
Jacek Dziurdzikowski

Câu trả lời trùng lặp, không có lý do. Câu trả lời đầu tiên có nhiều thông tin hơn.
MAChitgarha

9

Tôi đã gặp vấn đề tương tự và giải quyết nó bằng cách

kiểm tra git chi nhánh -f

Vâng, hãy cẩn thận với công -ftắc. Bạn sẽ mất mọi thay đổi không được cam kết nếu bạn sử dụng công -ftắc. Mặc dù có thể có một số trường hợp sử dụng rất hữu ích khi sử dụng -f, nhưng trong hầu hết các trường hợp, bạn có thể muốn stashthay đổi và sau đó là switchcác nhánh. Các stashingthủ tục được giải thích ở trên.


0

Bạn có thể cam kết trong chi nhánh hiện tại, thanh toán cho chi nhánh khác và cuối cùng là chọn cherry đó (thay cho hợp nhất).


Nó có thể hữu ích hơn nếu bạn đưa ra nhiều lời giải thích về điều này.
MAChitgarha

-1

Nếu bạn nhận được điều này khi cố gắng kiểm tra một chi nhánh khác:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Điều này có nghĩa là bạn đã có một số thay đổi bạn cần phải cam kết trên chi nhánh mà bạn đã kiểm tra - hoặc bạn cần xóa hoặc xóa chúng như hầu hết các điểm nêu trên. 19 trong số 20 lần tôi có nhiều khả năng chỉ để thực hiện các thay đổi của mình.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Bây giờ bạn đã làm điều đó, bạn có thể kiểm tra chi nhánh khác và chuyển đổi qua lại khá dễ dàng.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Chỉ cần đảm bảo rằng bạn đang ở cả nhánh bên phải và đẩy sang nhánh bên phải khi bạn chạy lệnh git push origin $ {Branch}. Lưu ý: nếu bạn có dự án của mình được nối trực tiếp vào Intellij, bạn có thể thấy rằng bạn đã thay đổi chi nhánh của mình ở góc dưới bên phải của cửa sổ chính.

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.