Làm cách nào để bỏ qua lỗi trên 'git pull' về các thay đổi cục bộ của tôi sẽ bị ghi đè bằng cách hợp nhất?


568

Làm cách nào để bỏ qua thông báo lỗi sau trên Git pull?

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

Nếu tôi muốn ghi đè lên chúng thì sao?

Tôi đã thử những thứ như thế git pull -f, nhưng không có gì hoạt động.

Để rõ ràng, tôi chỉ muốn ghi đè các thay đổi cụ thể, không phải tất cả mọi thứ.


Liên quan nhưng không trùng lặp: stackoverflow.com/questions/52704/
Kẻ

7
@BrianKnoblauch hoàn toàn đồng ý! Ngoài ra, đó không phải là một sự 'hợp nhất' nếu đó là 'ghi đè' phải không? Tôi nhớ SVN mỗi ngày ...
user1944491

2
git config core.fileMode falsetiết kiệm thời gian của tôi
Nolwennig


Nếu tôi không muốn ghi đè lên chúng thì sao?
Philip Rego

Câu trả lời:


439

Nếu bạn muốn xóa tất cả các thay đổi cục bộ - bao gồm các tệp không được theo dõi bởi git - khỏi bản sao làm việc của bạn, chỉ cần bỏ chúng:

git stash push --include-untracked

Nếu bạn không cần chúng nữa, bây giờ bạn có thể bỏ tập tin đó:

git stash drop

Nếu bạn không muốn bỏ qua các thay đổi mà bạn đã dàn dựng - ví dụ với git add- thì hãy thêm tùy chọn --keep-index. Tuy nhiên, lưu ý rằng điều này vẫn sẽ ngăn việc hợp nhất nếu những thay đổi theo giai đoạn đó va chạm với những thay đổi từ thượng nguồn.


Nếu bạn muốn ghi đè chỉ các phần cụ thể của các thay đổi cục bộ của mình, có hai khả năng:

  1. Cam kết mọi thứ bạn không muốn ghi đè và sử dụng phương pháp trên cho phần còn lại.

  2. Sử dụng git checkout path/to/file/to/revertcho những thay đổi bạn muốn ghi đè. Hãy chắc chắn rằng tập tin không được dàn dựng thông qua git reset HEAD path/to/file/to/revert.


Khả năng # 2 không hoạt động. Sau khi thực hiện lệnh không có gì xảy ra. Khi kéo tôi vẫn nhận được lỗi tương tự.
mae

1
@ user1132363: Nó hoạt động với tôi. Vui lòng kiểm tra nó đầu tiên với một tập tin duy nhất. Ngoài ra, bạn phải đảm bảo rằng tệp bạn muốn ghi đè không được dàn dựng.
Daniel Hilgarth

3
Bí quyết là sử dụng git checkout HEAD^ path/to/file/to/revert. Sử dụng CHÍNH ^ làm cho tất cả sự khác biệt.
mae

2
@ user1132363: Điều đó kiểm tra phiên bản trước đó và không phải phiên bản hiện đang được đăng ký. Tôi không tin rằng đây là cách tiếp cận chính xác.
Daniel Hilgarth

1
Tôi đã phải rời khỏi " save --keep-index".
Peter Mortensen

318

Được rồi với sự giúp đỡ của hai câu trả lời khác Tôi đã đưa ra một giải pháp trực tiếp:

git checkout HEAD^ file/to/overwrite
git pull

7
Điều này làm việc cho tôi. Bạn có thể mở rộng về câu trả lời này, tức là. cái này thực sự đang làm gì vậy?
AC Patrice

3
Đó là bỏ các thay đổi cục bộ, trở lại tham chiếu CHÍNH, có lẽ là cam kết cuối cùng trong nhánh chính
k3a

32
Tại sao ĐẦU ^ thay vì ĐẦU?
Yura

19
HEAD ^ là viết tắt của HEAD ^ 1, về cơ bản có nghĩa là một cam kết trước HEAD. Bạn cũng có thể thực hiện CHÍNH ^ 2 cho cam kết trước đó. Để biết thêm thông tin, hãy xem git-scm.com/book/en/v2/ trên mạngstackoverflow.com/questions/1955985/ .
davidneedham

4
vui lòng giải thích điều này trong câu trả lời
endolith

242

Điều này hoạt động để tôi ghi đè tất cả các thay đổi cục bộ và không yêu cầu danh tính:

git reset --hard
git pull

4
SO cần phải làm việc trên bảng xếp hạng của họ, cồng kềnh để tìm một câu trả lời hiệu quả, được đánh giá cao cho đến nay.
Benedict K.

3
@BenedictK. Tôi tin rằng hệ thống xếp hạng phản ánh một cách thích hợp "những gì hầu hết mọi người thấy hữu ích nhất". Họ được xếp hạng theo phiếu bầu. Nhiều người thích các giải pháp khác. Đây là một giải pháp tốt, nhưng nhiều người tìm thấy các câu trả lời khác hữu ích hơn .
Kittsil

Hoạt động tốt với tôi
Ender

siêu dễ =) thx ^^
lestat_kim

xe tăng, hoạt động tốt cho tôi
Igor

76

Đây là một giải pháp giúp loại bỏ các thay đổi theo giai đoạn:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Khó chịu, nếu sự khác biệt nhận thức xuất phát từ thực tế là tập tin đã thay đổi dòng mới khi nó được kiểm tra, điều này sẽ không khắc phục vấn đề.
DanielSank

1
Giải quyết vấn đề của tôi.
Loïc N.

Đây là câu trả lời tốt nhất, imo, vì nó không phá vỡ bất kỳ mục dàn dựng nào, nhưng giải quyết vấn đề của tập tin ngăn chặn sự lôi kéo
theRiley

65

Bạn có thể cam kết các thay đổi của mình trước khi thực hiện hợp nhất hoặc bạn bỏ qua chúng:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Điểm là, bạn không cần phải làm điều này. Chỉ cần lấy tài liệu CHÍNH hiện tại và ..... hợp nhất nó vào! Nó thực sự đơn giản, Git, tất cả các VCS khác đều làm điều đó ... nhưng không. Linus đã phải làm cho nó khó chịu để sử dụng.
Jon

@Jon Giải pháp này dành cho Ubuntu, tôi chưa tìm thấy thứ gì tốt hơn thế này.
Suneel Kumar

Thật không may, --autostashtùy chọn chỉ khả dụng với --rebasetùy chọn (
Eugen Konkov

Điều đó sẽ giới thiệu rất nhiều vấn đề không đáng. Mất ít nhất 5 phút để tải. Cũng giới thiệu lỗi "Hủy liên kết tệp". downvote
Philip Rego

51

Nếu bạn muốn loại bỏ các thay đổi cục bộ của mình trên một tệp, bạn có thể thực hiện như sau:

git checkout -- <file>

Sau đó, bạn có thể ghi đè tệp [s] với phiên bản mới nhất vừa thực hiện:

git pull

@pabloasc Đây là phá hủy các thay đổi cục bộ của bạn trong tệp đó.
Suneel Kumar

6
Đúng vậy: "Nếu tôi muốn ghi đè lên chúng thì sao?"
David

1
Câu hỏi ban đầu là không thể, câu trả lời này có thể mang đến cho ai đó cơn ác mộng có thể sao chép một cách mù quáng dán lệnh.
Suneel Kumar

Trong trường hợp bạn đã thực hiện một cam kết, trước tiên bạn phải hoàn nguyên cam kết thông qua git reset HEAD~và sau đó thực hiệngit checkout
dopexxx

git checkout -- <file>thất bại vớierror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Nếu kho lưu trữ của bạn chứa một vài tệp bị xóa khỏi master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

Đôi khi, không ai trong số này làm việc. Thật khó chịu, do điều tôi nghĩ, những gì sẽ làm việc là xóa các tập tin, sau đó kéo. Không phải tôi khuyên bạn nên giải pháp này, nhưng nếu tệp không tồn tại, git sẽ không thông báo cho bạn một cách vô ích rằng những thay đổi của bạn (có thể không thay đổi) sẽ bị ghi đè và sẽ cho phép bạn tiếp tục.

Sử dụng có nguy cơ của riêng bạn.


Khi bạn bị mắc kẹt do kết thúc dòng, phương pháp này là một trình cứu sinh
Dan Pisarski

Điều này không làm việc cho tôi. Các tập tin không tồn tại cục bộ và tôi vẫn nhận được lỗi.
PRman

11

git stash save --keep-index đã không làm việc cho tôi.

lệnh dưới đây làm việc như mong đợi.

git reset --hard
git pull

Nó ghi đè tất cả các thay đổi cục bộ nếu bạn không cần chúng.


10

Vì vậy, nhiều câu trả lời ở đây mà tôi ghét phải thêm một câu trả lời khác, nhưng tất cả những câu hỏi trên đều vụng về hơn mức cần thiết. Tôi phải làm điều này mọi lúc vì Git dường như trở nên bối rối và nói rằng tôi đã sửa đổi các tệp không thay đổi (không thể hoàn nguyên vì chúng không thay đổi, nhưng tôi không thể kéo vì chúng được thay đổi) Đơn giản nhất và nhanh nhất tôi đã tìm thấy cho đến nay là:

git stash
git stash drop
git pull

làm việc như một lá bùa
Blaze

Kinh ngạc! giải pháp đơn giản và làm việc.
naïveRSA

rực rỡ, cảm ơn rất nhiều
Hamza

8

Trong Git gần đây, bạn có thể thêm -r/ --rebasebật pulllệnh để khởi động lại nhánh hiện tại của bạn trên đầu nhánh ngược dòng sau khi tìm nạp. Cảnh báo sẽ biến mất, nhưng có một rủi ro là bạn sẽ gặp phải một số xung đột mà bạn cần giải quyết.


Ngoài ra, bạn có thể kiểm tra chi nhánh khác nhau bằng vũ lực, sau đó quay lại masterlần nữa, ví dụ:

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

Sau đó kéo nó lại như bình thường:

git pull origin master

Sử dụng phương pháp này có thể giúp bạn tiết kiệm thời gian từ stashing ( git stash) và các vấn đề về quyền tiềm ẩn, đặt lại tệp ( git reset HEAD --hard), xóa tệp ( git clean -fd), v.v. Ngoài ra, ở trên cũng dễ nhớ hơn.


8

Vấn đề này là do bạn đã thực hiện các thay đổi cục bộ thành tệp / s và cùng một tệp tồn tại với các thay đổi trong kho Git, vì vậy trước khi kéo / đẩy, bạn sẽ cần phải thay đổi cục bộ:

Để ghi đè các thay đổi cục bộ của một tệp:

git reset file/to/overwrite
git checkout file/to/overwrite

Để ghi đè tất cả các thay đổi cục bộ (thay đổi trong tất cả các tệp):

git stash
git pull
git stash pop

Ngoài ra vấn đề này có thể là do bạn ở trên một nhánh không được hợp nhất với nhánh chính.


5

git reset --hard && git clean -df

Thận trọng : Điều này sẽ thiết lập lại và xóa bất kỳ tập tin chưa được theo dõi.


27
Người ta không sử dụng rìu để loại bỏ ruồi khỏi trán của bạn bè.
HonourMule

3
KHÔNG sử dụng điều này mà không biết rằng một số tệp sẽ bị xóa.
andromeda

4

Bạn có thể sử dụng điều này cho ghi đè tập tin

git checkout file_to_overwrite

4

Cách tốt nhất để giải quyết vấn đề này là:

git checkout -- <path/file_name>

Sau đó, bạn có thể ghi đè lên tệp bằng cách:

git pull origin master

Tôi gặp vấn đề được đề cập vì tôi đã cập nhật chỉ mục để giả sử các tệp không thay đổi. Nó vẫn không cho phép tôi làm. Tôi đã sử dụng git checkout -- path/*chỉ một lần và nó cho phép tôi thực hiện thao tác kéo sau.
Stephen O'Flynn

4

Điều này giúp tôi loại bỏ các thay đổi trên máy chủ từ xa trực tiếp và lấy từ điều khiển nguồn GitHub:

git reset --hard
git pull origin master

4

Đây là chiến lược của tôi để giải quyết vấn đề.

Báo cáo vấn đề

Chúng tôi cần thực hiện thay đổi trong hơn 10 tệp. Chúng tôi đã cố gắng PULL (git pull origin master), nhưng Git hét lên:

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

Chúng tôi đã cố gắng thực hiện commitvà sau đó pull, nhưng họ cũng không làm việc.

Giải pháp

Chúng tôi thực sự đang ở giai đoạn bẩn , vì các tệp nằm trong "Khu vực tổ chức" hay còn gọi là "Khu vực chỉ mục" và một số nằm trong "Khu vực đầu" hay còn gọi là "thư mục Git cục bộ". Và chúng tôi muốn lấy các thay đổi từ máy chủ.

Kiểm tra liên kết này để biết thông tin về các giai đoạn khác nhau của Git một cách rõ ràng: Các giai đoạn GIT

Chúng tôi đã làm theo các bước sau

  • git stash (điều này làm cho thư mục làm việc của chúng tôi sạch sẽ. Các thay đổi của bạn được lưu trữ trên ngăn xếp bởi Git).
  • git pull origin master (Kéo các thay đổi từ máy chủ)
  • git stash apply (Áp dụng tất cả các thay đổi từ ngăn xếp)
  • git commit -m 'message' (Cam kết thay đổi)
  • git push origin master (Đã đẩy các thay đổi đến máy chủ)
  • git stash drop (Thả chồng)

Hãy hiểu khi nào và tại sao bạn cần stashing

Nếu bạn ở trạng thái bẩn , có nghĩa là bạn đang thực hiện thay đổi trong tệp của mình và sau đó bạn bị ép buộc, vì bất kỳ lý do gì, phải kéo hoặc chuyển sang chi nhánh khác cho một số công việc rất khẩn cấp, vì vậy tại thời điểm này, bạn không thể kéo hoặc chuyển đổi cho đến khi bạn cam kết thay đổi của bạn. Các stashlệnh là ở đây như một bàn tay giúp đỡ.

Từ cuốn sách ProGIT , tái bản lần 2:

Thông thường, khi bạn đang làm việc trên một phần của dự án, mọi thứ ở trong tình trạng lộn xộn và bạn muốn chuyển đổi chi nhánh một chút để làm việc khác. Vấn đề là, bạn không muốn thực hiện một công việc nửa vời chỉ để bạn có thể quay lại điểm này sau. Câu trả lời cho vấn đề này là lệnh git stash. Stashing có trạng thái bẩn trong thư mục làm việc của bạn - nghĩa là, các tệp được theo dõi đã sửa đổi của bạn và thay đổi theo giai đoạn - và lưu nó vào một đống các thay đổi chưa hoàn thành mà bạn có thể áp dụng lại bất cứ lúc nào.


3

Nếu bạn muốn ghi đè lên các thay đổi cụ thể, bạn cần một số cách để nói với những thay đổi mà bạn muốn quên.

Bạn có thể thử chọn lọc các thay đổi mà bạn muốn từ bỏ bằng cách sử dụng git stash --patchvà sau đó loại bỏ ngăn đó git stash drop. Sau đó, bạn có thể lấy các thay đổi từ xa và hợp nhất chúng như bình thường.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Tôi không biết tại sao điều này chưa được trả lời, nhưng giải pháp, như bạn có thể thấy là đơn giản. Tất cả các câu trả lời ở đây đều đề xuất như nhau: để xóa / lưu các thay đổi cục bộ của bạn và áp dụng ngược dòng, sau đó (nếu bạn save) áp dụng các thay đổi cục bộ của bạn lên trên.

git pull --rebase --autostashTừng bước làm gì :

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Trường hợp của tôi (có lẽ bạn cũng vậy):

Tôi có thay đổi cục bộ (thay đổi tại thư mục làm việc):

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

Khi tôi cố gắng kéo các thay đổi từ xa, tôi gặp lỗi:

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

Những thay đổi này không giao nhau với những thay đổi cục bộ:

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

Vì vậy, khi tôi pull --rebase --autostashthay đổi cục bộ được lưu và áp dụng mà không có bất kỳ vấn đề nào tự động

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

Bây giờ những thay đổi cục bộ của tôi thấp hơn một chút: nhập mô tả hình ảnh ở đây


2

Tôi đã có một trường hợp đặc biệt về điều này: Tôi đã có một tập tin với --assume không thay đổi trên đó. Thật khó để xác định vị trí, vì git statuslệnh không hiển thị bất kỳ thay đổi nào


Tôi có cùng vấn đề này. Bạn đã tìm thấy một cách để có được xung quanh nó? Tôi cho rằng tôi có thể xóa và sau đó thêm lại giả định ... những gì tôi đã làm chỉ là kiểm tra các tệp đó theo cách thủ công để có phiên bản không thay đổi ... chỉ tự hỏi liệu có cách nào để thực hiện kiểm tra / rebase / hợp nhất chỉ ghi đè họ
David

1
Không, tôi đã phải từ bỏ toàn bộ điều "giả định không thay đổi".

2

Nếu bạn muốn tiếp tục thay đổi sản xuất trên máy chủ, chỉ cần hợp nhất vào một mục cấu hình mới. Phương pháp xử lý như sau:

git stash
git pull
git stash pop

Có lẽ bạn không thực hiện tất cả các hoạt động. Bạn có thể biết những gì bạn có thể làm tiếp theo.


Sau đó, bạn có thể sử dụng tên Git diff - w + của tệp để xác nhận hợp nhất mã tự động
YanQing

1

Tôi đã bỏ qua một tập tin trong repo của tôi và khi tôi đã git pull upstream masternhận được lỗi 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: myfile.js 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. Hủy bỏ

Để giải quyết nó tôi đã làm như sau

git update-index --no-assume-unchanged myfile.js

Sau đó tôi đã làm git statusvà nhận được tin nhắn này

Trên nhánh chính Chi nhánh của bạn đứng sau 'origin / master' bởi 4 lần xác nhận và có thể được chuyển tiếp nhanh. (sử dụng "git pull" để cập nhật chi nhánh địa phương của bạn)

Các thay đổi không được tổ chức cho cam kết: (sử dụng "git add ..." để cập nhật những gì sẽ được cam kết) (sử dụng "kiểm tra git - ..." để loại bỏ các thay đổi trong thư mục làm việc)

đã sửa đổi: myfile.js

không có thay đổi nào được thêm vào cam kết (sử dụng "git add" và / hoặc "git commit -a")

Sau đó tôi đã làm git checkout myfile.jstheo git pull upstream master. Lần này thao tác kéo git đã thành công.


1

Tôi gặp phải điều này khi kéo từ chủ.

Cách tôi xử lý nó, sử dụng Visual Studio;

  1. Đầu tiên, tôi thực hiện Hoàn tác cam kết về giải pháp của mình.
  2. Sau đó, tôi đã làm quá trình kéo Git.

Hi vọng điêu nay co ich!


1

Giải pháp đơn giản nhất là:

git reset --hard && git pull

1

Tôi mới tham gia git và không chắc giải pháp của tôi có phải là ý hay không.

Tôi đã kiểm tra TẤT CẢ các câu trả lời và không có câu trả lời nào phù hợp với tôi!

Nhưng tôi đã tìm thấy một giải pháp khác:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Hi vọng điêu nay co ich.


1

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" xuất hiện do bạn có một số thay đổi trong repo cục bộ chưa được cam kết, vì vậy trước khi kéo từ repo từ xa chỉ cần thực hiện thay đổi trong repo cục bộ.

Hãy nói rằng repo từ xa của bạn có một số chi nhánh xyz và bạn muốn chi nhánh repo xyz từ xa đó được hợp nhất vào (sao chép vào) chi nhánh repo xyz cục bộ sau đó,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Nếu lỗi này là do kết thúc dòng,

git add
git checkout mybranch

sẽ làm việc. Tôi không thực sự chắc chắn tại sao nó hoạt động.


0

Đối với Pycharm, bạn có thể thực hiện Git -> Hoàn nguyên và sau đó kéo.


0

Thông báo này cũng có thể xảy ra nếu git-lfsđược sử dụng và một con trỏ tệp được ghi đè bằng một tệp thực.

sau đó bạn sử dụng:

git stash
git lfs migrate import
git pull

đầu ra đầy đủ từ trường hợp của tôi

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

xem https://github.com/git-lfs/git-lfs/issues/2839


0

Tôi đã thử và thành công, trước khi kéo, hãy cam kết tất cả các tệp mà bạn chưa cam kết, sau đó bạn sẽ không nhận được tin nhắn đó từ AS.

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.