2009-10-31 19 views
65

Tôi có một kho git của dự án của tôi với khoảng 20 cam kết. Tôi biết cách sao chép cam kết thực tế với git clone,làm thế nào để sao chép một git-cam cũ (và một số câu hỏi thêm về git)

  • nhưng làm cách nào tôi có thể "nhân bản" một cam kết cũ?
  • là có một git-GUI thực sự tốt (imho qgit không phải là một GUI tốt)?
  • chính xác "nhánh" là gì?
  • khi tôi muốn phát hành 0,1, 0,2 và như vậy, cách tốt nhất để đánh dấu những cam kết này trong git là gì?
  • sự khác biệt lớn với svn là gì?

Trả lời

112

Kho lưu trữ git chứa tất cả lịch sử mọi lúc.
Vì vậy, khi bạn đang nhân bản một kho lưu trữ, bạn đang sao chép nó với lịch sử đầy đủ của nó, và sau đó, bạn có thể tạo ra một ngành từ bất cứ cam kết mà bạn muốn:

$ git checkout -b aNewBranch SHA1 

với SHA1 đại diện cho cam kết id từ đó bạn muốn tiếp tục.


Chi nhánh tại Git chỉ là một cách để theo dõi một con đường của một DAG (Directed Acyclic Graph) mà là tập hợp các cam kết đại diện cho lịch sử của một kho Git.
Nó chỉ là một con trỏ bạn gán cho một trong những cam kết đó và nó sẽ tiếp tục di chuyển cùng với mỗi lần commit mới.

branches

Xem Pro Git cuốn sách để biết thêm.


Bạn có thể đánh dấu một cụ thể cam kết với a tag, trong đó, giống như một chi nhánh, là một con trỏ chỉ, nhưng là một bất biến (nó sẽ không di chuyển khi bạn thực hiện mới cam kết).
Bạn sẽ sử dụng tốt hơn các thẻ được chú thích, được lưu trữ dưới dạng đối tượng đầy đủ trong cơ sở dữ liệu Git. Chúng được kiểm tra; chứa tên, email và ngày của người gắn thẻ; có một thông điệp gắn thẻ; và có thể được ký và xác minh với GNU Privacy Guard (GPG).


Phần "Giao diện đồ họa" của trang InterfacesFrontendsAndTools trên Git Wiki liệt kê GUI khác nhau cho Git tại thời điểm này.


Bạn sẽ thấy rất nhiều câu hỏi về sự khác biệt giữa Git và SVN: xem my answer (hoặc this one) ví dụ.
Câu trả lời hoàn chỉnh nhất của tôi về sự khác biệt cơ bản giữa Git và SVN là ở đây:
"which of the two is better:git or SVN".

+1

Thực ra, câu hỏi SO cuối cùng "trong đó hai câu hỏi hay hơn: git hoặc SVN" đã bị xóa. Tôi đã sao chép nó vào một câu trả lời cũ hơn: http://stackoverflow.com/questions/161541/svn-vs-git/2549128#2549128 – VonC

+4

để tạm dừng xung quanh trong một cam kết cũ mà không cần thực hiện một chi nhánh mới: 'git checkout SHA1' và sau đó nếu bạn quyết định giữ nó xung quanh: 'git checkout -b aNewBranch' – rymo

4

Có một vài câu hỏi trong bài này, đây là quan điểm của tôi về một số câu trả lời:

Trước tiên, để "nhân bản" một trước cam kết, bạn có thể làm một cái gì đó như thế này:

git clone REPO_URL 
git checkout HEAD~1 // checks out the last commit's first parent 

Sử dụng ~1 để truy cập vào phụ huynh đầu tiên của cam kết cuối cùng, và tăng số để có được cha mẹ của cha mẹ và như vậy. More on tilde and caret notation.

Hai lệnh ở trên sẽ đưa bạn vào trạng thái HEAD tách rời, có thể hoặc có thể không quan trọng dựa trên ngữ cảnh. Ví dụ, nó không quan trọng nếu bạn đang nhân bản như một phần của các kịch bản triển khai của bạn và tất cả những gì bạn quan tâm là truy cập vào một cam kết trước đó (nói, như là một phần của một chiến lược rollback).

Nếu bạn cần phải bắt đầu làm việc từ thời điểm này trong lịch sử, bạn có thể chạy

git checkout -b NEW_BRANCH_NAME 

Một git GUI tốt? Đối với tôi SourceTree là tốt nhất.

Chi nhánh là gì? Nói cách riêng của tôi, một chi nhánh chỉ là một cách rất dễ dàng để xoay vòng. Giả sử bạn đang làm việc trên một chi nhánh, master và bạn muốn thử nghiệm. Dễ dàng, chỉ cần git checkout -b experiment và bạn nhanh chóng ở nơi an toàn để phá vỡ nội dung.

Điều gì khác biệt giữa git và svn?

git là distribute version control system. svn thì không. Ngoài ra, phân nhánh (được đề cập ở trên) là dễ dàng hơn trong git.

Để gắn thẻ, tôi không biết nếu có "Một cách thực sự" (có bao giờ?) Nhưng chỉ cần khám phá lệnh git tag. Một điều tuyệt vời về git là cách dễ dàng sao chép một bản sao của repo của bạn trên máy tính cục bộ của bạn (hoặc bất cứ nơi nào) và làm bất cứ điều gì bạn muốn và xem điều gì xảy ra. Nếu bạn làm hỏng thứ gì đó, chỉ cần xóa thư mục. Vì vậy, bạn có thể thử nghiệm với git tag trong một số thư mục thử nghiệm và xem những gì bạn thích.

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