Làm cách nào để tôi giải quyết git nói rằng Cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể hợp nhất với nhau?


763

Tôi đã thực hiện một số cập nhật trên máy cục bộ của mình, đẩy chúng vào một kho lưu trữ từ xa và bây giờ tôi đang cố gắng kéo các thay đổi đến máy chủ và tôi nhận được thông báo;

lỗi: Thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè bằng cách hợp nhất:

wp-content / w3tc-config / master.php

Xin vui lòng, cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể hợp nhất.

Vì vậy, tôi đã chạy,

git checkout -- wp-content/w3tc-config/master.php

và thử lại và tôi nhận được tin nhắn tương tự. Tôi giả sử rằng w3tcđã thay đổi một cái gì đó trong tập tin cấu hình trên máy chủ. Tôi không quan tâm liệu bản sao cục bộ hoặc bản sao từ xa có trên máy chủ hay không (tôi cho rằng bản sao từ xa là tốt nhất), tôi chỉ muốn có thể hợp nhất các thay đổi còn lại của mình (cập nhật plugin).

Có ý kiến ​​gì không?



11
Đây là một câu hỏi rõ ràng hơn với nhiều chi tiết hơn và một câu trả lời tốt hơn. Tôi nghĩ rằng nó có giá trị để giữ cái này xung quanh. Vâng, câu hỏi khác được hỏi trước tiên về mặt kỹ thuật, nhưng loại bỏ câu hỏi này sẽ khiến mọi người gặp khó khăn hơn trong việc tìm câu trả lời mà họ đang tìm kiếm.
Jo Sprague

Câu trả lời:


1300

Bạn không thể hợp nhất với sửa đổi cục bộ. Git bảo vệ bạn khỏi mất những thay đổi quan trọng.

Bạn có ba lựa chọn:

  • Cam kết thay đổi bằng cách sử dụng

    git commit -m "My message"
    
  • Stash nó.

    Stashing hoạt động như một ngăn xếp, nơi bạn có thể đẩy các thay đổi và bạn bật chúng theo thứ tự ngược lại.

    Để stash, gõ

    git stash
    

    Thực hiện hợp nhất, và sau đó kéo stash:

    git stash pop
    
  • Hủy các thay đổi cục bộ

    sử dụng git reset --hard
    hoặcgit checkout -t -f remote/branch

    Hoặc: Hủy các thay đổi cục bộ cho một tệp cụ thể

    sử dụng git checkout filename


104
Bạn cũng có thể loại bỏ các thay đổi cục bộ cho một tệp cụ thể bằng cách thực hiện: git checkout tên tệp
ckb

6
Cảm ơn. Tôi sẽ thêm vào điều này, nếu bạn cũng git reset --hardcó thể muốn xóa các tệp không bị theo dõi vớigit clean -dfx
Jo Sprague

13
Theo mặc định git stashsẽ không stash các tập tin mà không có lịch sử. Vì vậy, nếu bạn có các tệp mà bạn chưa thêm nhưng sẽ bị ghi đè hoặc "tạo" bởi hợp nhất, thì hợp nhất vẫn sẽ bị chặn. Trong tình huống đó, bạn cũng có thể sử dụng git stash -uđể bỏ các tệp không được cam kết. Hoặc bạn chỉ có thể xóa chúng!
joeytwiddle

25
chạy git clean -dfxlà một ý tưởng khủng khiếp. Đã xóa một số tệp .gitignored tôi thực sự cần.
ezuk

5
Tôi đã gặp một tình huống mà một người dùng, sau khi thực hiện git reset --hard, vẫn có những thay đổi không thể thay đổi!
Amedee Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Lệnh đầu tiên lưu trữ các thay đổi của bạn tạm thời trong ngăn chứa và xóa chúng khỏi thư mục làm việc.

Lệnh thứ hai chuyển nhánh.

Lệnh thứ ba khôi phục các thay đổi mà bạn đã lưu trữ trong stash ( --indextùy chọn này hữu ích để đảm bảo rằng các tệp được phân đoạn vẫn được phân loại).


1
stackoverflow.com/questions/15286075/ , cũng có thể hữu ích
vikramvi

2
để giải thích quan điểm của @ vikramvi: chúng ta cũng có thể sử dụng git stash popthay vì git stash apply. Cái trước loại bỏ nó khỏi stash trong khi cái sau vẫn giữ nó ở đó
Anupam

27

Bạn có thể thử một trong các phương pháp sau:

nổi loạn

Đối với các thay đổi đơn giản, hãy thử khởi động lại trên đầu trang trong khi kéo các thay đổi, ví dụ:

git pull origin master -r

Vì vậy, nó sẽ áp dụng chi nhánh hiện tại của bạn trên đầu chi nhánh ngược dòng sau khi tìm nạp.

Điều này tương đương với : checkout master, fetchrebase origin/mastercác lệnh git.

Đây là một chế độ hoạt động nguy hiểm tiềm tàng. Nó viết lại lịch sử, điều đó không tốt cho lắm khi bạn đã xuất bản lịch sử đó. Không sử dụng tùy chọn này trừ khi bạn đã đọc git-rebase(1)kỹ.


Thủ tục thanh toán

Nếu bạn không quan tâm đến những thay đổi cục bộ của mình, bạn có thể chuyển sang chi nhánh khác tạm thời (có hiệu lực) và chuyển lại, ví dụ:

git checkout origin/master -f
git checkout master -f

cài lại

Nếu bạn không quan tâm đến những thay đổi cục bộ của mình, hãy thử đặt lại thành CHÍNH (trạng thái ban đầu), vd

git reset HEAD --hard

Nếu ở trên sẽ không có ích, đó có thể là các quy tắc trong tệp chuẩn hóa git của bạn ( .gitattributes) vì vậy tốt hơn là bạn nên cam kết những gì nó nói. Hoặc hệ thống tệp của bạn không hỗ trợ quyền, vì vậy bạn nên vô hiệu hóafilemode cấu hình git của mình.

Liên quan: Làm cách nào để buộc "git pull" ghi đè lên các tệp cục bộ?


1
Không hiệu quả: Tôi vẫn nhận được thông báo tương tự như "bỏ qua các thay đổi của bạn trước". Khi tôi gõ "git stash" và sau đó là "git pull" -> "lỗi: bạn có các thay đổi chưa được lưu .. hãy thực hiện một stash trước". Ngắn trước khi phá hủy máy tính của tôi
trinity420

@ trinity420 Có thể là quyền của tập tin của bạn, hãy kiểm tra git statusnhững thay đổi bạn có sau khi lưu trữ. Nếu không có câu trả lời nào hữu ích, hãy xem xét thêm một câu hỏi mới.
kenorb

cảm ơn bạn nhưng vấn đề của tôi đã được giải quyết, đã thử mọi thứ ở đây, không có gì hiệu quả, sau đó nhấp vào "cam kết thay đổi" "hợp nhất" trong PHPStorm và sau đó tôi đã hủy bỏ các thay đổi và nó đã hoạt động ..
trinity420


13

Vì vậy, tình huống mà tôi gặp phải là như sau:

lỗi: Các thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè bằng cách hợp nhất: wp-content / w3tc-config / master.php Xin vui lòng, cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể hợp nhất.

ngoại trừ, ngay trước đó, là từ xa: vì vậy thực sự điều này:

remote: error: Các thay đổi cục bộ của bạn đối với các tệp sau sẽ được ghi đè bằng cách hợp nhất: some / file.ext Xin vui lòng, cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể hợp nhất.

Điều đang xảy ra là (tôi nghĩ, không phải là 100% tích cực), móc nhận bài git đã bắt đầu chạy và vặn lên do thay đổi chuyển động trong kho lưu trữ máy chủ từ xa, theo lý thuyết, không nên chạm vào.

Vì vậy, những gì tôi đã kết thúc bằng cách lần theo dấu móc nhận và tìm thấy cái này, là phải đi đến kho lưu trữ từ xa trên máy chủ, và có một sự thay đổi (trên thực tế, đó không phải là kho lưu trữ cục bộ của tôi nói rằng nó phù hợp, không thay đổi, không có gì để cam kết, cập nhật, v.v.) Vì vậy, trong khi ở địa phương, không có thay đổi nào, trên máy chủ, sau đó tôi đã thực hiện một git checkout -- some/file.extvà sau đó các kho lưu trữ cục bộ và từ xa thực sự phù hợp và tôi có thể tiếp tục làm việc, và triển khai. Không hoàn toàn chắc chắn làm thế nào tình huống này xảy ra, mặc dù một vài chục nhà phát triển cộng với những thay đổi CNTT có thể có liên quan đến nó.


2
Đó là một câu hỏi hoặc một câu trả lời?
stdcall

2
@stdcall - Một chút của cả hai. Khi tôi gặp phải tình huống này như được mô tả trong câu hỏi, đây là điều tôi phải làm để khắc phục nó. Nó chắc chắn không phải là một git giải quyết bình thường, và từ câu hỏi, có vẻ như đó có thể là tình huống bất thường tương tự (nghĩa là thay đổi cấu hình trên máy chủ, nhưng cục bộ không có thay đổi). Nếu bất cứ ai có nhiều ý tưởng về lý do tại sao (hoặc làm thế nào) điều này xảy ra, tôi sẽ hoan nghênh mọi hiểu biết.
Mike

7

CẢNH BÁO: Điều này sẽ xóa các tập tin không bị theo dõi, vì vậy nó không phải là một câu trả lời tuyệt vời cho câu hỏi này.

Trong trường hợp của tôi, tôi không muốn giữ các tệp này, vì vậy điều này hiệu quả với tôi:

Git 2.11 và mới hơn:

git clean  -d  -fx .

Git cũ hơn:

git clean  -d  -fx ""

Tham khảo: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x có nghĩa là các tệp bị bỏ qua cũng bị xóa cũng như các tệp không xác định với git.

  • -d có nghĩa là loại bỏ các thư mục không bị theo dõi ngoài các tệp không bị theo dõi.

  • -f là bắt buộc để buộc nó chạy.


4

Để ghi lại các tệp mới tạo của bạn trong khi giải quyết vấn đề này:

Nếu bạn đã tạo các tệp mới , bạn có thể tạo một bản vá các thay đổi cục bộ, kéo các kết hợp từ xa và áp dụng bản vá cục bộ của bạn sau khi hợp nhất từ ​​xa hoàn tất như được xác định từng bước dưới đây:

  1. Giai đoạn thay đổi địa phương của bạn. (không cam kết). Việc dàn dựng là cần thiết để tạo bản vá của các tệp mới được tạo (vì chúng vẫn chưa được theo dõi)

git add .

  1. Tạo một bản vá để lưu giữ hồ sơ

git diff --cached > mypatch.patch

  1. Hủy thay đổi cục bộ và xóa các tệp cục bộ mới

git reset --hard

  1. Kéo thay đổi

git pull

  1. Áp dụng bản vá của bạn

git apply mypatch.patch

Git sẽ hợp nhất các thay đổi và tạo các tệp .rej cho các thay đổi không được hợp nhất.

Theo đề xuất của Anu, nếu bạn gặp vấn đề khi áp dụng bản vá, hãy thử:

git apply --reject --whitespace=fix mypatch.patch Câu trả lời này git: patch không áp dụng các cuộc đàm phán chi tiết về vấn đề này

Tận hưởng công việc liên tục của bạn trên tính năng của bạn và cam kết thay đổi cục bộ của bạn khi hoàn tất.


Tôi muốn đẩy một phần mã với các thay đổi mới vì vậy tôi đã thực hiện: 1. đã tạo một bản vá ra khỏi nhánh dev cục bộ của mình 2. đã thiết lập lại cứng 3. kéo các thay đổi mới từ master sang dev (để tránh mọi xung đột hợp nhất) 4 . đã thực hiện một thay đổi nhỏ trong dev cục bộ của tôi 5. bị đẩy sang dev dev 6. đã áp dụng bản vá lại -> Có lỗi : error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply, Tôi vẫn có mypatch.patch, nhưng không biết tại sao nó không được áp dụng và tôi đã mất các thay đổi của mình !
Anu

Tôi đã nhận nó, lệnh chính xác là git apply --reject --whitespace=fix mypatch.patch, tôi đã nhận lại các thay đổi của mình !!! [Cảm ơn] ( stackoverflow.com/a/15375869/6484353 )
Anu

1
Anu, lệnh git áp dụng mypatch.patch là chính xác để áp dụng bản vá, đây là điều tôi sử dụng mọi lúc, có thể có một số vấn đề với bản vá đã tạo và bạn không bao giờ mất các thay đổi nếu bạn có bản vá của mình, nó chứa tất cả các thay đổi hợp nhất.
Manpreet

2

Yêu cầu cam kết trước khi kéo

  • git stash
  • nguồn gốc git kéo << tên nhánh >>

Nếu cần thiết :

  • git stash áp dụng

1
Sử dụng git stash khi bạn muốn ghi lại trạng thái hiện tại của thư mục làm việc và chỉ mục, nhưng muốn quay lại thư mục làm việc sạch. Lệnh lưu các sửa đổi cục bộ của bạn đi và hoàn nguyên thư mục làm việc để khớp với cam kết CHÍNH.
Pushpak Sharma

2

Đối với tôi, chỉ git reset --hardlàm việc.

Cam kết không phải là một lựa chọn, vì không có gì để cam kết.

Stashing không phải là một lựa chọn vì không có gì để stash.

Có vẻ như nó có thể là từ các tệp bị loại trừ .git/info/excludevà có git update-index --assume-unchanged <file>một số tệp.


0

Trong trường hợp của tôi, tôi đã sao lưu và sau đó xóa tệp mà Git đã khiếu nại, đã cam kết, sau đó tôi đã có thể kiểm tra một chi nhánh khác.

Sau đó tôi thay thế tệp, sao chép lại trong nội dung và tiếp tục như không có gì xảy ra.



0

Tôi đã thử câu trả lời đầu tiên: git stashvới số điểm cao nhất nhưng thông báo lỗi vẫn bật lên, và sau đó tôi thấy bài viết này để thực hiện các thay đổi thay vì stash 'Cam kết bất đắc dĩ'

và thông báo lỗi cuối cùng đã biến mất:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

sau đó nó làm việc hy vọng câu trả lời này có ích. :)


0

Nếu bạn đang sử dụng Tiện ích mở rộng Git, bạn sẽ có thể tìm thấy các thay đổi cục bộ của mình trong Working directorynhư hiển thị bên dưới:

nhập mô tả hình ảnh ở đây

Nếu bạn không thấy bất kỳ thay đổi nào, có thể là do bạn đang sử dụng mô-đun phụ sai. Vì vậy, hãy kiểm tra tất cả các mục với biểu tượng tàu ngầm như dưới đây:

nhập mô tả hình ảnh ở đây

Khi bạn tìm thấy một số thay đổi không được cam kết:

Chọn dòng với Working directory, điều hướng đến tab Diff , Nhấp chuột phải vào các hàng bằng biểu tượng bút chì (hoặc +hoặc -), chọn Đặt lại để cam kết đầu tiên hoặc cam kết hoặc stash hoặc bất cứ điều gì bạn muốn làm với nó.


0

Đối với tôi điều này đã làm việc:

git reset --hard

và sau đó

git pull origin <*current branch>

sau đó

git checkout <*branch>


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.