2012-11-18 26 views
27

Tôi đang tìm cách 'ẩn' các thay đổi nhỏ được thực hiện cho một vài tệp trong Git, như vậy chúng sẽ không hiển thị ở trạng thái git cho đến khi thay đổi khác các tập tin.Git - Tạm thời bỏ qua những thay đổi nhỏ nhặt đối với các tệp

Ví dụ: Tôi có tệp java nơi thay đổi duy nhất được thực hiện là loại bỏ nhập không sử dụng (người đóng góp quên chạy một tổ chức nhập trước khi cam kết). Bây giờ tôi đã loại bỏ việc nhập và thay đổi (hiển nhiên) xuất hiện trong git. Vì tôi không có thay đổi nào khác để thực hiện cho tệp đó, tôi không thực sự thích cam kết tệp như một phần của thay đổi khác (không có liên quan) hoặc cam kết thay đổi này độc lập. Chắc chắn, tôi có thể hoàn nguyên thay đổi và chỉ áp dụng thay đổi bất cứ khi nào tôi sẽ phải thực hiện thay đổi đối với tệp đó, nhưng tôi có thể "mạo hiểm" quên nó.

Lệnh có tồn tại cho một tác vụ như vậy không? Nó sẽ làm việc phần nào giống như lệnh giả định không thay đổi nhưng theo một cách không vĩnh viễn.

Điều gì sẽ là cách thích hợp để giải quyết vấn đề này nếu không có lệnh như vậy?

Xin cảm ơn trước.

+1

Tại sao bạn không chỉ đơn giản là tạo ra một "bản vá tầm thường" chi nhánh cho điều đó? – Mat

+0

@Những gì sẽ là lợi ích từ một chi nhánh như vậy? Tôi vẫn sẽ phải hợp nhất nó thành master để thay đổi tầm thường không hiển thị. – Zelgadis

+0

Bạn sẽ giữ tất cả những thay đổi nhỏ nhặt ở đó và hợp nhất chúng bất cứ khi nào nó ổn trong chu kỳ dev của bạn. Bằng cách đó họ không can thiệp vào các cam kết "đúng", nhưng họ cũng không quên. – Mat

Trả lời

36

Trong trường hợp sử dụng của tôi (đang phát triển sử dụng một tập tin cấu hình đã chỉnh sửa trên máy tính cá nhân của tôi, chạy trên máy khác với cấu hình không thay đổi), đây là giải pháp cho tôi:

bắt đầu phớt lờ những thay đổi vào một tập tin:

git update-index --assume-unchanged path/to/file 

giữ theo dõi lại:

git update-index --no-assume-unchanged path/to/file 
+2

Hah, cảm ơn ví dụ về sao chép-dán. Tôi tiếp tục quên cú pháp chính xác của những điều này do việc sử dụng không thường xuyên của nó: p –

+0

Đây là giải pháp tốt nhất cho việc này. Được đăng lần đầu vào ngày 18 tháng 2 năm 2009, Nguồn: http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html –

1

Có nhiều cách [mặc dù không thể được sạch sẽ và gọn gàng và sẽ đòi hỏi sự chú ý của bạn]

  1. Thêm tập tin trong mối quan tâm đến .gitignore trong repo của bạn để nó không hiển thị cho cam kết. Hãy cẩn thận để loại bỏ điều này từ .gitignore khi bạn sẵn sàng cam kết tệp
  2. Đảm bảo bạn không 'đặt giai đoạn' tệp trong khi cam kết các thay đổi còn lại của bạn. Bạn có thể muốn viết trình bao bọc trên git để đảm bảo các lệnh như git commit -a hoặc git add . chạy trên tất cả ngoại trừ tệp đang được hỏi. Một lựa chọn khác là sử dụng git gui hoặc git citool nơi bạn có thể đảm bảo trực quan tệp của mình không nằm trong khu vực 'dàn dựng' và do đó không bao giờ được cam kết
  3. Một cách khác là cam kết tất cả các thay đổi 'được ủy thác' của bạn và sau đó git stash save tập tin. Sau đó khi bạn đã sẵn sàng thay đổi tệp, bạn có thể git stash pop và tiếp tục làm việc và cam kết.

Hy vọng rằng sẽ giúp :)

+1

Rất tiếc, giải pháp đầu tiên không hoạt động vì các tệp đã được theo dõi. Một kết hợp của 2 và 3 là những gì tôi đang sử dụng ngay bây giờ, nhưng tôi muốn một cái gì đó tự động hơn. Cảm ơn câu trả lời anyway! – Zelgadis

+0

Thật không may, 'git' chưa thể đọc được suy nghĩ của nhà phát triển để tìm hiểu xem sự thay đổi có quan trọng không (và phải được cam kết) hay không (giữ nguyên). Các tùy chọn rõ ràng nhất là (a) nhánh riêng biệt cho "các bản sửa lỗi nhỏ", được loại bỏ thường xuyên và hợp nhất tại một số điểm; (b) đánh dấu thay đổi là "tầm thường" trong thông điệp cam kết. IMHO (b) là thích hợp hơn, vì nó tránh các skew và các phiên bản mà không ai từng thử nghiệm. – vonbrand

3

Giữ thay đổi của bạn mà không phải là sẵn sàng trong một nhánh riêng biệt. git rebase chi nhánh này trên đỉnh thay đổi mới trong lịch sử chính khi cần thiết.

Có thể phát triển trong tiến trình, những điều tạm thời, ngay cả những thứ không bao giờ được đưa vào lịch sử dự án chính - quá trình tương tự cũng hoạt động tốt như nhau.

Nếu/khi các thay đổi của chi nhánh sẵn sàng đưa vào lịch sử chính; hợp nhất nó. Nếu không, hãy giữ chúng trong nhánh riêng biệt và tiếp tục rebasing.

(mặt lưu ý: git merge --no-ff có thể được sử dụng để tạo ra một hợp nhất cam kết ngay cả khi một nhanh về phía trước hợp nhất có thể - tùy thuộc vào các quy tắc của dự án của bạn, đây có thể là một lợi thế)

+0

Đây là những gì tôi thấy là giải pháp phù hợp nhất với tôi. Cảm ơn! – Zelgadis

+0

Bạn được chào đón! Tôi vui vì tôi có thể giúp. – jsageryd

1

Chỉ cần don' t thêm những thay đổi tầm thường.

Thực tiễn tốt là xem xét cẩn thận những điều bạn thêm trước khi cam kết.

Bạn thậm chí có thể bỏ qua một số thay đổi trong một tập tin trong khi thêm người khác, sử dụng

git add -p. 

này thậm chí còn dễ dàng hơn nếu bạn sử dụng gitx (R).

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