2013-06-02 21 views
5

Tôi có một số thay đổi cục bộ (không có trong các tệp riêng biệt .gitignore không hoạt động) mà tôi không muốn cam kết.
Tôi làm git reset --hard đôi khi sau khi cam kết xóa các thay đổi không thường xuyên nhưng đáng ngại tôi cũng mất các thay đổi hữu ích mà tôi muốn rời khỏi.

Làm cách nào để giữ các thay đổi hữu ích?Cách tôi có thể lưu trữ một số thay đổi cục bộ tồn tại git reset --hard

Trả lời

3

Bạn cũng có thể thử:

git update-index --skip-worktree -- file 
# to cancel it: 
git update-index --no-skip-worktree -- file 

Nó nên cưỡng lại một git reset --hard. (xem this answer về cách sử dụng dấu gạch nối kép '--')
Xem này blog post.

  • Dường như skip-worktree đang cố gắng hết sức để bảo vệ dữ liệu trên máy của bạn. Nhưng nó không ngăn cản bạn thay đổi ngược dòng nếu nó an toàn. Plus git không đặt lại cờ khi kéo. Nhưng bỏ qua lệnh ‘reset --hard’ có thể trở thành một bất ngờ khó chịu cho một nhà phát triển.
  • assume-unchanged cờ có thể bị mất khi thao tác kéo và thay đổi cục bộ bên trong các tệp như vậy dường như không quan trọng đối với git.
    Giả sử không thay đổi giả định rằng nhà phát triển không nên thay đổi tệp. Nếu một tệp đã được thay đổi - thay đổi đó không quan trọng. Cờ này có nghĩa là để cải thiện hiệu suất cho các thư mục không thay đổi như SDK. Nhưng nếu lời hứa bị hỏng và một tệp thực sự bị thay đổi, git sẽ chuyển đổi cờ để phản ánh thực tế. Có lẽ nó là ok để có một số lá cờ không nhất quán trong các thư mục thường không có nghĩa là để được thay đổi.

Mặt khác, skip-worktree hữu ích khi bạn hướng dẫn git không chạm vào tệp cụ thể. Đó là hữu ích cho một tập tin cấu hình đã được theo dõi. Upstream lưu trữ chính lưu trữ một số cấu hình sẵn sàng sản xuất nhưng bạn muốn thay đổi một số thiết lập trong cấu hình để có thể làm một số thử nghiệm địa phương. Và bạn không muốn vô tình kiểm tra các thay đổi trong tệp như vậy để ảnh hưởng đến cấu hình sản xuất. Trong trường hợp đó, skip-worktree sẽ tạo cảnh hoàn hảo.

+0

Cảm ơn, nó hoạt động! Làm thế nào tôi có thể loại bỏ lá cờ này? – freemanoid

+1

@freemanoid chỉ đơn giản là 'git update-index --no-skip-worktree - aFile' – VonC

+0

Hmm Tôi không tìm thấy điều này khi nhìn qua người đàn ông nhưng nó đã ở đó. Vì vậy, '' 'git update-index --no-skip-worktree my_file''' hoạt động. – freemanoid

5

Bạn có thể sử dụng git stash để lưu trữ các thay đổi của mình tạm thời, sau đó kéo lại các thay đổi sau - xem Pro Git chapter on stashing.

+0

Có Tôi biết về '' 'git stash''' nhưng tôi không muốn giấu các thay đổi của mình mỗi lần. – freemanoid

+3

@freemanoid, được rồi, hãy giả vờ lệnh 'git preserve-these-and-these-changes 'của bạn có tồn tại; sau đó mỗi lần bạn muốn giữ gì đó để tồn tại 'git reset --hard', bạn cần gọi lệnh tưởng tượng đó và sau đó gọi một lệnh khác để" hoàn tác "trạng thái lưu trữ được đặt trên các tệp đã chọn. Bây giờ làm thế nào điều này sẽ khác với 'git stash' /' git stash pop'? – kostix

1

Nếu bạn không bao giờ muốn những thay đổi này được cam kết nhưng luôn cần chúng cục bộ thì hãy xem xét tạo và cam kết tập lệnh hoặc tệp vá cho các thay đổi cục bộ của bạn. Sau đó, bạn có thể giữ và ghi lại các thay đổi của mình cũng như dễ dàng áp dụng chúng sau khi khôi phục cài đặt gốc.

Nếu bạn có những thay đổi cụ thể đối với môi trường của mình thì có thể đáng để chúng bên ngoài chúng thành tệp cấu hình.

Các vấn đề liên quan