2010-12-29 22 views
7

Tôi hiện đang học git, thường là tôi có chút hoài nghi về VCS vì tôi khó có thể quen với chúng.Không có gì thực sự bị xóa trong git?

Tôi đã xóa một chi nhánh có tên là "thử nghiệm" với một số tệp tmp, tôi thấy các tệp đã bị xóa trong thư mục làm việc của mình nên tôi gãi đầu và tự hỏi nếu điều này là bình thường, tôi có thể mang nó trở lại trong trường hợp tôi cần lại không v.v.

Tôi tìm thấy SHA thực hiện cam kết của các tệp tmp và tạo lại chi nhánh với sha được cung cấp và thấy nó một lần nữa với tất cả các tệp và nội dung hiện tại của chúng.

Mọi thứ tôi làm trong thư mục làm việc đều có thể được hoàn nguyên sau khi tôi cam kết?

Có thể có vẻ như một câu hỏi ngớ ngẩn với nhiều người, nhưng nó kinda âm mưu cho tôi vì vậy tôi muốn biết các giới hạn

Trả lời

7

Hầu như mọi hành động đều có thể được đảo ngược nếu bạn đã cam kết các thay đổi tương ứng với tệp của mình. Ngay cả khi bạn buộc xóa một chi nhánh hoặc tiến hành khôi phục cài đặt gốc, bạn có thể tìm thấy các đối tượng cam kết lỏng lẻo bằng cách sử dụng git reflog hoặc git fsck.

Tuy nhiên, các đối tượng lỏng lẻo đôi khi được làm sạch bởi git gc, vì vậy bạn không thể khôi phục chúng sau một thời gian.

+0

Bạn phải cố tình đặt cài đặt 'gc.pruneexpire' thấp cho' git gc' để cắt ngay các đối tượng không thể truy cập được. Câu cuối cùng của bạn ngụ ý rằng việc chạy 'git gc' theo cách thủ công có thể là đặc biệt. –

+0

@Charles: Tôi rephrased câu cuối cùng. Bạn nói đúng, tôi không có nghĩa là một hướng dẫn sử dụng 'git gc' ngay lập tức tạo ra những vật thể lỏng lẻo. Tôi chỉ muốn lưu ý rằng 'git gc' chạy tự động, nhưng cũng có thể được chạy thủ công. – 3lectrologos

+0

Câu trả lời này có áp dụng cho kho lưu trữ git cục bộ hay không, hay cả điều khiển từ xa khi được đẩy (ví dụ như trong trường hợp điều khiển từ xa tập trung)? – nha

1

git reset --hard có thể loại bỏ những thay đổi không thể đảo ngược

+0

-1: 'git reset --hard' không thể đảo ngược. – 3lectrologos

+0

@ 3lectrologos hmm thú vị ... Làm thế nào tôi có thể Hoàn tác khó thiết lập lại? – seriyPS

+2

Tôi nghĩ rằng @ 3lectrologos giả định trạng thái "một lần tôi cam kết". –

2

Tất cả những gì tôi làm trong thư mục làm việc có thể được hoàn nguyên sau khi tôi cam kết?

Có thể. Ví dụ: hãy thử git reflog. Điều này sẽ cung cấp cho bạn danh sách các cam kết được thực hiện trên chi nhánh hiện tại. Chọn một cái bằng tổng sha1, sau đó nhập git checkout 45db2a.... Điều đó kiểm tra cam kết đó. Hãy chắc chắn git checkout HEAD hoặc git checkout -b newbranch từ thời điểm đó nếu bạn muốn thực hiện thay đổi.

Bạn cũng có thể sử dụng git để anh đào chọn các cam kết này trên đầu trang HEAD hiện tại của bạn (nghĩa là nếu chúng được thực hiện ở một nhánh khác, bạn có thể kéo chúng vào). This câu hỏi thảo luận về nó tốt hơn nhiều so với tôi có thể.

+0

Sau khi nhìn vào các câu trả lời, tôi cảm thấy khó chịu nhưng không quá nhiều, sự khác biệt (ít nhất là đối với tôi) khi đẩy/kéo đến máy chủ. Bây giờ, tôi không biết phải hỏi trong stackoverflow hay ở đây, nhưng tại sao "git rm" dry-run không hoạt động? Tôi đã phải xóa toàn bộ thư mục của tôi để phản ánh nó trong máy chủ riêng. Tôi muốn giữ các tệp của mình và xóa các tệp đó qua máy chủ – allenskd

+0

Ah, tôi hiểu. Bạn có thể buộc các nhánh phải được loại bỏ khỏi kho lưu trữ từ xa bằng cách thực hiện điều này: 'git push remotename: branchname' (cú pháp lạ,' git push branchname' đẩy nó. Sự khác biệt chỉ là một ':'). Tôi không biết nếu bạn có thể làm điều này bằng cách sử dụng cam kết cá nhân, đó là một câu hỏi thú vị. –

2

Điểm chính trong bất kỳ VCS nghiêm trọng nào là giữ toàn bộ lịch sử của một dự án theo cách vĩnh viễn và bất biến. Vì vậy, bạn có thể bất cứ lúc nào đi đến một phiên bản tùy ý của công việc của bạn.

Có một hành vi đặc biệt của git khi nói đến bộ nhớ của nó, ở chỗ nó có thể loại bỏ các đối tượng nếu không có tham chiếu đến nó. Tài liệu tham khảo là:

  • mỗi HEAD của một chi nhánh
  • thẻ (Tôi không chắc chắn nếu một thẻ chú thích unreferenced vẫn hoạt động như một tài liệu tham khảo hoạt động)
  • từng cam kết đó được tham chiếu bởi một cam kết
  • nội dung của một chi nhánh reflog

Điều này có nghĩa là tất cả các cam kết, là một phần của một chi nhánh được lưu giữ, cũng mỗi đối tượng (= chủ yếu là cam kết) được gắn thẻ.Ngoài ra còn có một reflog được gọi là trên mỗi chi nhánh (trừ khi ngừng hoạt động), nơi git giữ tài liệu tham khảo cho tất cả các đối tượng bạn tạo ra trong những ngày cuối cùng. Khi một đối tượng không được tham chiếu bởi bất kỳ nhánh, thẻ hoặc reflog nào, git gc sẽ loại bỏ nó tạo thành cơ sở dữ liệu. Đây là trường hợp điển hình khi bạn tạo ra một nhánh hacking, đã cam kết một số thứ ở đó và loại bỏ nhánh này mà không cần sáp nhập nó vào một nhánh khác.

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