Vì điều này được gắn thẻ với git, tôi hy vọng rằng sự thiếu hiểu biết về SVN của tôi là không thể bỏ qua.
Hiện tại tôi đang nhân bản một repo và nhân bản một chi nhánh cụ thể bằng gitk.
Bạn đang nhân bản toàn bộ kho lưu trữ từ xa không chỉ là một nhánh cụ thể.
Kho lưu trữ được tưởng tượng tốt nhất như một cơ sở dữ liệu, vì vậy bạn đang tạo một bản sao của trạng thái hiện tại của cơ sở dữ liệu từ xa. Nhưng sau đó, bạn đang làm việc trên bản sao của cơ sở dữ liệu đó; nếu bạn cam kết, bạn thay đổi cơ sở dữ liệu địa phương của bạn.
Các fetch
lệnh được sử dụng để giữ cho cơ sở dữ liệu địa phương đồng bộ với một điều khiển từ xa.
Thông thường từ cơ sở dữ liệu cục bộ đó, bạn kiểm tra một chi nhánh để làm việc. Điều này không có gì khác giống như một điểm đánh dấu nội bộ cho git, nơi công việc hiện tại của bạn bắt đầu.
Giả sử, bạn đang làm việc trên một kho lưu trữ đơn giản, nơi không có chi nhánh bên cạnh master
, bạn có thể xem qua .git
thư mục để tiết lộ "ma thuật":
Giả sử lần cam kết cuối cùng của bạn là (bạn master
) 182e8220b404437b9e43eb78149d31af79040c66
, bạn sẽ tìm thấy chính xác điều đó bên dưới cat .git/refs/heads/master
.
Từ đó bạn rẽ nhánh ra một nhánh mới git checkout -b mybranch
, bạn sẽ tìm thấy cùng một con trỏ trong tệp cat .git/refs/heads/mybranch
.
Chi nhánh không có gì nhiều hơn "con trỏ". Điểm đánh dấu "làm việc" được gọi là a HEAD
.
Nếu bạn muốn biết bạn HEAD
đang ở đâu:
cat .git/HEAD
trong đó nói ví dụ: ref: refs/heads/mybranch
lần lượt điểm ( cat .git/refs/heads/mybranch
) đến hàm băm xác nhận78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Các cam kết thực tế được lưu trữ trong objects
thư mục (chủ đề của chính nó như thế nào).
Thư mục dự án chỉ chứa nội dung cho nhánh đó và tôi không thể thấy tất cả các nhánh như trong SVN, điều này hơi khó hiểu đối với tôi.
Đừng nhầm lẫn working directory
với "cơ sở dữ liệu git" nói chung. Như tôi đã nói ở trên, thư mục làm việc của bạn chỉ là một ảnh chụp nhanh (có thể) một tập hợp con.
Giả sử bạn có các nhánh khác nhau, thư mục làm việc của bạn chỉ dành riêng để làm việc trên nhánh đó (mặc dù bạn có thể đặt công việc từ đó ở nơi khác).
Thông thường, nếu bạn muốn xem, những nhánh nào được xác định cho dự án, bạn có khả năng
git branch
cho các chi nhánh địa phương
git branch --remote
cho các chi nhánh từ xa
git branch -a
cho cả hai
(hoặc git branch -v
)
Vì git là một hệ thống kiểm soát phiên bản phân tán, không chỉ có thể, mà còn được khuyến khích, để tạo các nhánh khác nhau cục bộ / từ xa.
Quy trình công việc điển hình của tôi là:
- rẽ nhánh một nhánh
- nhánh một nhánh WIP (đang tiến hành) từ đó
- làm việc như bạn muốn - ngay cả khi bạn cam kết sau một dòng duy nhất; nó không quan trọng
Khi tính năng hoàn tất:
- squash / làm lại
WIP
nhánh (với rebasing tương tác) = thực hiện một cam kết duy nhất từ đó
- hợp nhất
WIP
nhánh vào nhánh tính năng và cung cấp rằng (nếu bạn làm việc với github, ưu đãi đó sẽ được gọi là "yêu cầu kéo") để tích hợp vào nhánh ổn định (chính).
Ngoài ra, tôi muốn biết làm thế nào để xử lý một quá trình mà tôi cần wprl trên hai nhánh cùng một lúc trong trường hợp, ví dụ, tôi cần phải tạo một hotfix trên master nhưng cũng giữ nội dung của một nhánh khác.
Nó phụ thuộc vào cách cấu trúc dự án của bạn:
Nói rằng bạn có một chủ ổn định. Và các tính năng chỉ được phát triển từ nhánh ổn định đó - vì vậy nó thường đứng sau một nhánh tính năng. Sau đó, bạn sẽ có một cam kết cuối cùng về chủ sẽ là gốc của nhánh tính năng.
Sau đó, bạn sẽ làm cho một cam kết về chi nhánh tổng thể và có thể quyết định, cho dù để hợp nhất cả hai chi nhánh với nhau hoặc để rebase (mà là một loại hợp nhất cho người dùng có nhu cầu cao như vậy để nói).
Hoặc bạn luôn có thể thực hiện các thay đổi trên các nhánh (ví dụ master
) và chuyển chúng sang các nhánh khác.
Quy ước tên đề xuất là gì để tạo các thư mục bao gồm nhánh được sao chép từ repo trong GIT, ví dụ myproject-Branchname
Điều đó phụ thuộc vào bạn.
Thông thường, bạn kết thúc với tên kho lưu trữ.
Nhưng có những dịp, khi điều này không muốn:
ví dụ: bạn sao chép oh-my-zsh với git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Ở đây .oh-my-zsh
được đặt tên rõ ràng là mục tiêu.