Các tệp cây làm việc không được theo dõi sau đây sẽ được ghi đè bằng cách hợp nhất, nhưng tôi không quan tâm


343

Trên nhánh của tôi, tôi đã có một số tệp trong .gitignore

Trên một nhánh khác, những tập tin này không có.

Tôi muốn hợp nhất các chi nhánh khác nhau vào của tôi và tôi không quan tâm nếu các tệp đó không còn bị bỏ qua hay không.

Thật không may, tôi nhận được điều này:

Các tệp cây làm việc không được theo dõi sau đây sẽ được ghi đè bằng cách hợp nhất

Làm cách nào để tôi sửa đổi lệnh pull của mình để ghi đè lên các tệp đó mà không phải tự mình tìm, di chuyển hoặc xóa các tệp đó?





1
Đây là câu trả lời tốt nhất vì nó sẽ chỉ xóa các tệp đang chặn bạn hợp nhất: stackoverflow.com/a/52255219/551045
RedX 22/11/18

Câu trả lời:


537

Vấn đề là bạn không theo dõi các tệp cục bộ nhưng các tệp giống hệt nhau được theo dõi từ xa để "kéo" hệ thống của bạn sẽ bị buộc phải ghi đè lên các tệp cục bộ không được kiểm soát phiên bản.

Hãy thử chạy

git add * 
git stash
git pull

Điều này sẽ theo dõi tất cả các tệp, xóa tất cả các thay đổi cục bộ của bạn đối với các tệp đó và sau đó lấy các tệp từ máy chủ.


59
git add -A .; git stashđã làm cho tôi. Các git add *biến thể phàn nàn về các con đường bị bỏ qua.
imsky

11
Tôi đã thử git add., Git stash, git pull. Nó đã làm việc, nhưng tôi vẫn không hiểu tại sao?
ARK

1
Đối với tôi, tôi có một tập tin từ xa được theo dõi và tôi có một tập tin cùng tên trong repo địa phương của tôi đã không bị theo dõi. Vì vậy, nếu bạn thêm tệp cục bộ ngăn chặn các thay đổi và sau đó kéo, tệp từ xa sẽ ghi đè lên tệp cục bộ.
userFog

2
Đây là một liên kết tốt để hiểu cách thức hoạt động của nó, nếu có ai quan tâm. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, Điều này thực sự không đi quá xa vào mục đích của lỗi này, thực sự.
Nathan Basan

136

Bạn có thể thử lệnh để xóa các tệp không bị theo dõi khỏi cục bộ

Git 2.11 và các phiên bản mới hơn:

git clean  -d  -f .

Các phiên bản cũ hơn của Git:

git clean  -d  -f ""

Nơi -dcó thể được thay thế bằng những điều sau đây:

  • -x 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 loại bỏ các thư mục không bị theo dõi ngoài các tập tin không bị theo dõi.

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

Đây là liên kết có thể hữu ích là tốt.


23
Tôi sẽ thêm -icho chế độ tương tác. Cũng như xóa thư mục không mong muốn, tôi cũng vừa xóa cài đặt người dùng của mình cho dự án :-(
dumbledad

6
Thật đáng để quét qua các bình luận cho một câu trả lời tương tự như -xcó thể làm tổn thương.
dumbledad

10
Nhưng điều này rất nguy hiểm, và nhiệm vụ không thể hoàn tác !! bạn có thể mất rất nhiều tập tin HÃY CẨN THẬN!!
Mohamed Kawsara

16
Điều này đã xóa tất cả thư mục nhà cung cấp của tôi trên Slim Framework . HÃY RẤT CẨN THẬN VỚI QUY ĐỊNH NÀY
RousseauAlexandre

2
Bạn nên xóa 'x' khỏi câu trả lời của mình. Nó rất nguy hiểm!
Earl3s

106

Các lệnh duy nhất làm việc cho tôi là:

git fetch --all
git reset --hard origin/{{your branch name}}

5
Cần lưu ý rằng câu trả lời này là cần thiết nếu bạn đã loại bỏ các mô hình con và tập hợp lại chúng thành các thư viện trong repo gốc. Tôi cần một câu trả lời và đây là tất cả những gì đã làm việc.
Routhinator

Tôi đã không có mô hình con, và đã thử git sạch và git stash như được đề xuất trong các câu trả lời khác, nhưng chỉ điều này mới có ích.
kslstn

Sau khi xóa một loạt các mô hình con, đây là điều duy nhất phù hợp với tôi. Đặc biệt lưu ý, tôi có một vấn đề nhạy cảm trường hợp cũng như trên một tập tin. Ví dụ. XML.php đến Xml.php trong thư mục nhà cung cấp của tôi từ nhà soạn nhạc.
KazaJhodo

1
Nó làm việc cho tôi quá. Bạn có thể vui lòng giải thích những gì đang xảy ra? Tôi không hiểu
Dimitris Karamanis

1
Điều này đã xóa hai cam kết địa phương của tôi, hãy cẩn thận trước khi sử dụng này!
David Cian

27

Một sự thay thế cho git mergeđiều đó sẽ ghi đè lên các tập tin không bị theo dõi

Các ý kiến ​​bên dưới sử dụng 'FOI' cho 'tệp quan tâm', các tệp mà

  • tồn tại trong các nhà tài trợ,
  • không tồn tại trong nhánh nhận
  • và đang chặn hợp nhất vì chúng có mặt và không bị theo dõi trong thư mục làm việc của bạn.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Một sự thay thế cho git pullđiều đó sẽ ghi đè lên các tập tin không bị theo dõi

pull = fetch + merge, vì vậy chúng tôi làm git fetchtheo các git checkout -f, git checkout, git mergemẹo ở trên.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Giải thích chi tiết

git merge -f không tồn tại, nhưng git checkout -f không.

Chúng tôi sẽ sử dụng git checkout -f+git checkout để xóa Files Of Interest (xem bên trên) và sau đó việc hợp nhất của bạn có thể tiến hành bình thường.

Bước 1. Bước này buộc thay thế FOI chưa được mã hóa bằng các phiên bản được theo dõi của chi nhánh nhà tài trợ (nó cũng kiểm tra chi nhánh nhà tài trợ và cập nhật phần còn lại của thư mục làm việc).

git checkout -f donor-branch

Bước 2. Bước này loại bỏ FOI vì chúng được theo dõi trong nhánh (nhà tài trợ) hiện tại của chúng tôi và vắng mặt trong receiving-branchchúng tôi chuyển sang.

git checkout receiving-branch

Bước 3. Bây giờ FOI vắng mặt, việc hợp nhất trong nhánh nhà tài trợ sẽ không ghi đè lên bất kỳ tệp nào chưa được theo dõi, vì vậy chúng tôi không gặp lỗi.

git merge donor-branch

3
Điều này quá sạch sẽ là câu trả lời thứ 7 hoặc thứ 8!
Majed DH

1
Cảm ơn, @MajedDH, bạn đã tạo nên một ngày của tôi! <3
Esteis

1
Đây là quyền mà tôi đang tìm kiếm! Cảm ơn
AFM-Horizon

Rất vui được giúp bạn, @ AFM-Horizon!
Esteis

20

Xóa tất cả các tệp không bị theo dõi:

git clean  -d  -fx .

8
xóa các tập tin có thể được sử dụng trong một dự án không nên là giải pháp thực sự
Erdinç orbacı

4
yike, cũng đã dọn sạch các tệp IDE :(
kisna

18

Nếu đây là hoạt động một lần, bạn có thể xóa tất cả các tệp không bị theo dõi khỏi thư mục làm việc trước khi thực hiện thao tác kéo. Đọc Làm thế nào để loại bỏ các tệp cục bộ (không bị theo dõi) khỏi cây làm việc Git hiện tại? để biết thông tin về cách loại bỏ tất cả các tệp không bị theo dõi.

Đảm bảo không vô tình xóa tệp không bị theo dõi mà bạn vẫn cần;)


15

Bạn có thể thử lệnh đó

git clean -df

5
Việc sử dụng xóa các thư mục không bị theo dõi là gì? .. chúng có thể có giá trị, bạn biết đấy.
zhekaus

Bạn có thể giải thích những gì nó làm ??
Safak Ozkan

12

Cập nhật - phiên bản tốt hơn

Công cụ này ( https://github.com/mklepaczewski/git-clean-b Before-emge ) sẽ:

  • xóa các tệp không bị theo dõi giống hệt với các tệp git pulltương đương của chúng ,
  • hoàn nguyên các thay đổi đối với các tệp đã sửa đổi, phiên bản đã sửa đổi giống hệt với các tệp git pulltương đương của chúng ,
  • báo cáo các tệp đã sửa đổi / không bị theo dõi khác với git pullphiên bản của chúng ,
  • công cụ có --pretendtùy chọn sẽ không sửa đổi bất kỳ tập tin.

Phiên bản cũ

Câu trả lời này khác với câu trả lời khác như thế nào?

Phương pháp được trình bày ở đây chỉ xóa các tệp sẽ được ghi đè bằng cách hợp nhất. Nếu bạn có các tệp khác chưa được theo dõi (có thể bị bỏ qua) trong thư mục, phương thức này sẽ không xóa chúng.

Giải pháp

Đoạn mã này sẽ trích xuất tất cả các tệp chưa được theo dõi sẽ bị ghi đè git pullvà xóa chúng.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

và sau đó chỉ cần làm:

git pull

Đây không phải là lệnh git sứ nên luôn luôn kiểm tra xem nó sẽ làm gì với:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Giải thích - bởi vì một lớp lót rất đáng sợ:

Đây là một sự cố về những gì nó làm:

  1. git pull 2>&1- chụp git pullđầu ra và chuyển hướng tất cả sang thiết bị xuất chuẩn để chúng tôi có thể dễ dàng nắm bắt nó grep.
  2. grep -E '^\s - mục đích là để nắm bắt danh sách các tệp không bị theo dõi sẽ bị ghi đè bởi git pull . Tên tệp có một loạt các ký tự khoảng trắng ở phía trước chúng vì vậy chúng tôi sử dụng nó để lấy chúng.
  3. cut -f2- - xóa khoảng trắng từ đầu mỗi dòng được chụp trong 2.
  4. xargs -I {} rm -rf "{}"- chúng tôi xargslặp lại tất cả các tệp, lưu tên của chúng trong "{}" và gọi rmcho từng tệp. Chúng tôi sử dụng -rfđể buộc xóa và loại bỏ các thư mục không bị theo dõi.

Sẽ thật tuyệt khi thay thế các bước 1-3 bằng lệnh sứ, nhưng tôi không biết bất kỳ tương đương nào.


Cảm ơn bạn, tôi thường có các tệp không bị theo dõi trong thư mục làm việc của mình mà tôi không muốn xóa hoặc cam kết. Trong trường hợp của tôi, tôi cần phải thay thế git pullbằnggit checkout <branch_name>
mihow

6

Nếu bạn xem xét sử dụng -fcờ, trước tiên bạn có thể chạy nó dưới dạng chạy khô. Chỉ cần bạn biết trước tình huống thú vị nào bạn sẽ kết thúc tiếp theo ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

Ngoài câu trả lời được chấp nhận, tất nhiên bạn có thể xóa các tệp nếu chúng không còn cần thiết bằng cách chỉ định tệp:

git clean -f '/path/to/file/'

Hãy nhớ chạy nó với cờ -n trước nếu bạn muốn xem tập tin nào git clean sẽ xóa. Lưu ý rằng những tập tin này sẽ bị xóa. Trong trường hợp của tôi, dù sao tôi cũng không quan tâm đến họ, vì vậy đó là giải pháp tốt hơn cho tôi.


5

Một cách để làm điều này là bằng cách bỏ qua các thay đổi cục bộ và lấy từ repo từ xa. Bằng cách này, bạn sẽ không mất các tệp cục bộ của mình vì các tệp sẽ chuyển đến stash.

git add -A
git stash
git pull

Bạn có thể kiểm tra các tệp được lưu cục bộ bằng lệnh này - git stash list


3

Đối với những người không biết, git bỏ qua sự khác biệt tên chữ hoa / chữ thường trong các tệp và thư mục. Điều này hóa ra là một cơn ác mộng khi bạn đổi tên chúng thành cùng một tên với một trường hợp khác.

Tôi gặp phải vấn đề này khi tôi đổi tên một thư mục từ "Petstore" thành "petstore" (chữ hoa thành chữ thường). Tôi đã chỉnh sửa tệp .git / config của mình để dừng bỏ qua trường hợp, thực hiện các thay đổi, xóa sạch các cam kết của mình và xóa các thay đổi của tôi để chuyển sang một nhánh khác. Tôi không thể áp dụng các thay đổi được lưu trữ của mình cho chi nhánh khác này.

Cách khắc phục mà tôi thấy có hiệu quả là tạm thời chỉnh sửa tệp .git / config để tạm thời bỏ qua trường hợp. Điều này gây ra git stash applythành công. Sau đó, tôi đã thay đổi ignCase trở lại false. Sau đó, tôi đã thêm tất cả mọi thứ ngoại trừ các tệp mới trong thư mục petstore mà git tuyên bố kỳ lạ đã bị xóa, vì bất kỳ lý do gì. Tôi đã cam kết thay đổi của mình, sau đó chạygit reset --hard HEAD để loại bỏ những tệp mới không bị theo dõi. Cam kết của tôi xuất hiện chính xác như mong đợi: các tệp trong thư mục đã được đổi tên.

Tôi hy vọng rằng điều này sẽ giúp bạn tránh được cơn ác mộng tương tự của tôi.


Không làm việc cho tôi. Tôi đã xóa tất cả các tập tin trong thư mục. Sau git pull -fđó git checkout .. Thật là một cơn ác mộng.
m.rufca

Có thật không? Nó làm việc tốt cho tôi chỉ một vài tuần trước. Bạn đã thử chỉnh sửa tệp gitconfig để bắt đầu / dừng bỏ qua trường hợp phù hợp chưa?
A. Davidson

Cảm ơn bạn. Tôi cần hợp nhất từ ​​chủ sau khi sửa vỏ trong đường dẫn thư mục. Tôi đã có thể hợp nhất nó với trường hợp bỏ qua git, sau đó tôi chỉ kích hoạt lại độ nhạy của vỏ.
Rubenisme

3

Không làm sạch / thiết lập lại / kiểm tra cứng / rebase làm việc cho tôi.

Vì vậy, tôi chỉ xóa các tệp mà git phàn nàn về *

rm /path/to/files/that/git/complained/about

* Tôi đã kiểm tra xem các tệp này có thể được gỡ bỏ hay không bằng cách kiểm tra một repo hoàn toàn mới trong một thư mục riêng (các tệp không có ở đó)


1

Trong trường hợp của tôi khi tôi gặp vấn đề này. Tôi đã có một tập tin cục bộ mà tôi đã đổi tên trên điều khiển từ xa.

Khi cố gắng git pullGit nói với tôi tên tệp mới không được theo dõi - nó nằm trên điều khiển từ xa mặc dù nó chưa tồn tại trên địa phương.

Bởi vì không có sự thể hiện của nó tại địa phương tôi không thể làm được git pullcho đến khi tôi đã làm git rmtrên filename (mà không phải là rõ ràng lúc đầu vì ý tưởng ngu ngốc của tôi đổi tên nó).


0

Nếu bạn có các tệp được ghi dưới .gitignore, hãy xóa các tệp và chạy lại git pull. Điều đó đã giúp tôi ra ngoài.

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.