Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 81 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
81
Dung lượng
594,34 KB
Nội dung
Contents 1.3 Bắt Đầu - Cơ Bản Git Cơ Bản Git Tóm lại thì, Git gì? Đây phần quan trọng để tiếp thu, bạn hiểu Git nguyên tắc việc Git hoạt động nào, sử dụng Git cách hiệu trở nên dễ dàng cho bạn nhiều Khi học Git, cố gắng gạt bỏ kiến thức mà bạn biết VCS khác, ví dụ Subversion Perforce; việc giúp bạn tránh hỗn độn, bối rối sử dụng Git "nghĩ" thơng tin lưu trữ khác biệt so với hệ thống khác, giao diện người dùng tương đối giống nhau; hiểu khác biệt giúp bạn tránh nhiều bối rối Ảnh Chụp, Không Phải Sự Khác Biệt Sự khác Git với VCS khác (bao gồm Subversion tương tự cách Git "nghĩ" liệu Về mặt lý thuyết mà nói, phần lớn hệ thống khác lưu trữ thông tin dạng danh sách tập tin thay đổi Các hệ thống (CVS, Subversion, Perforce, Bazaar, ) coi thông tin lưu trữ tập hợp tập tin thay đổi thực tập tin theo thời gian, minh hoạ hình 1-4 Hình 1-4 Các hệ thống khác hướng tới lưu trữ tập tin dạng thay đổi so với sở tập tin Git không nghĩ xử lý liệu theo cách Mà thay vào Git coi liệu giống tập hợp "ảnh" (snapshot) hệ thống tập tin nhỏ Mỗi lần bạn "commit", lưu lại trạng thái dự án Git, Git "chụp ảnh" ghi lại nội dung tất tập tin thời điểm tạo tham chiếu tới "ảnh" Để hiệu hơn, tập tin khơng có thay đổi nào, Git khơng lưu trữ tập tin lại lần mà tạo liên kết tới tập tin gốc tồn trước Git thao tác với liệu giống Hình 1-5 Hình 1-5 Git lưu trữ liệu dạng ảnh chụp dự án theo thời gian Đây khác biệt lớn Git hầu hết VCS khác Nó khiến Git cân nhắc lại hầu hết khía cạnh quản lý phiên mà phần lớn hệ thống khác áp dụng lại từ hệ trước Chính lý làm cho Git giống hệ thống quản lý tập tin thu nhỏ với tính năng, cơng cụ vơ mạnh mẽ xây dựng dựa nó, khơng hệ thống quản lý phiên đơn giản Chúng ta khám phá số lợi ích đạt từ việc quản lý liệu theo cách bàn luận Phân nhánh Git Chương Phần Lớn Thao Tác Diễn Ra Cục Bộ Phần lớn thao tác/hoạt động Git cần yêu cầu tập tin hay tài ngun cục thơng thường khơng cần thơng tin từ máy tính khác mạng lưới bạn Nếu bạn quen với việc sử dụng hệ thống quản lý phiên tập trung nơi mà đa số hoạt động chịu ảnh hưởng độ trễ mạng, với Git lại mạnh Bởi tồn dự án hoàn toàn nằm ổ cứng bạn, thao tác thực gần Ví dụ, bạn muốn xem lịch sử dự án, Git không cần phải lấy thông tin từ máy chủ khác để hiển thị, mà đơn giản đọc trực tiếp từ sở liệu cục bạn Điều có nghĩa bạn xem lịch sử thay đổi dự án gần Nếu bạn muốn so sánh thay đổi phiên tập tin với phiên tháng trước, Git tìm kiếm tập tin cũ máy cục sau so sánh khác biệt cho bạn Thay việc phải truy vấn từ xa "kéo về" (pull) phiên cũ tập tin từ máy chủ trung tâm thực so sánh cục Điều cịn đồng nghĩa với có việc mà bạn khơng thể làm khơng có kết nối Internet VPN bị ngắt Nếu bạn muốn làm việc máy bay tầu, bạn commit bình thường có kết nối Internet để đồng hố Nếu bạn nhà mà VPN lại kết nối được, bạn làm việc bình thường Trong nhiều hệ thống khác, việc gần khơng thể khó khăn Ví dụ Perforce, bạn gần khơng thể làm không kết nối tới máy chủ; Subversion CVS, bạn sửa tập tin bạn khơng thể commit thay đổi vào sở liệu (vì sở liệu bạn khơng kết nối) Đây khơng phải điều lớn lao, bạn ngạc nhiên thay đổi lớn mà làm Git Mang Tính Tồn Vẹn Mọi thứ Git "băm" (checksum or hash) trước lưu trữ tham chiếu tới mã băm Có nghĩa việc thay đổi nội dung tập tin hay thư mục mà Git tới điều Chức xây dựng Git tầng thấp mặt triết học coi tồn vẹn Bạn khơng thể thơng tin/dữ liệu truyền tải nhận tập tin bị hỏng mà Git không phát Cơ chế mà Git sử dụng cho việc băm gọi mã băm SHA-1 Đây chuỗi tạo thành 40 ký tự hệ số 16 (0-9 a-f) tính tốn dựa nội dung tập tin cấu trúc thư mục Git Một mã băm SHA-1 có định dạng sau: 24b9da6552252987aa493b52f8696cd6d3b00373 Bạn thấy mã băm sử dụng nơi Git Thực tế, Git không sử dụng tên tập để lưu trữ mà mã băm từ nội dung tập tin vào sở liệu truy vấn Git Chỉ Thêm Mới Dữ Liệu Khi bạn thực hành động Git, phần lớn tất hành động thêm vào sở liệu Git Rất khó để yêu cầu hệ thống thực hành động mà khơng thể khơi phục lại xố liệu hình thức Giống VCS khác, bạn làm rối tung liệu mà bạn chưa commit; bạn commit khó để liệu đó, đặc biệt bạn thường xuyên đẩy (push) sở liệu sang kho chứa khác Điều khiến việc sử dụng Git trở nên thích thú biết thử nghiệm mà khơng lo sợ phá hỏng thứ Để hiểu sâu việc Git lưu trữ liệu hay để khôi phục lại liệu mất, xem Chương Ba Trạng Thái Bây giờ, ý Đây điều quan trọng cần ghi nhớ Git bạn muốn hiểu phần cách trôi chảy Mỗi tập tin Git quản lý dựa ba trạng thái: committed, modified, staged Committed có nghĩa liệu lưu trữ cách an tồn sở liệu Modified có nghĩa bạn thay đổi tập tin chưa commit vào sở liệu Và staged bạn đánh dấu commit phiên tập tin chỉnh sửa lần commit tới Điều tạo ba phần riêng biệt dự án sử dụng Git: thư mục Git, thư mục làm việc, khu vực tổ chức (staging area) Hình 1-6 Thư mục làm việc, khu vực khán đài, thư mục Git Thư mục Git nơi Git lưu trữ "siêu kiện" (metadata) sở liệu cho dự án bạn Đây phần quan trọng Git, phần lưu bạn tạo (clone) kho chứa từ máy tính khác Thư mục làm việc phiên dự án Những tập tin kéo (pulled) từ sở liệu nén lại thư mục Git lưu ổ cứng cho bạn sử dụng chỉnh sửa Khu vực khán đài tập tin đơn giản chứa thư mục Git, chứa thơng tin commit lần commit tới Nó cịn biết đến với tên "chỉ mục" (index), khu vực tổ chức (staging area) dần coi tên tiêu chuẩn Tiến trình cơng việc (workflow) Git: Bạn thay đổi tập tin thư mục làm việc Bạn tổ chức tập tin, tạo ảnh tập tin vào khu vực tổ chức Bạn commit, ảnh tập tin khu vực tổ chức lưu trữ vĩnh viễn vào thư mục Git Nếu phiên tập tin thư mục Git, coi commit Nếu sửa thêm vào khu vực tổ chức, nghĩa staged Và thay đổi từ checkout chưa staged, coi thay đổi Trong Chương 2, bạn tìm hiểu kỹ trạng thái làm để tận dụng lợi chúng bỏ qua hoàn toàn giai đoạn tổ chức (staged) 1.4 Bắt Đầu - Cài Đặt Git Cài Đặt Git Hãy bắt đầu chút vào việc sử dụng Git Việc bạn cần phải làm cài đặt Có nhiều cách để thực hiện; hai cách cài đặt từ mã nguồn cài đặt từ gói có sẵn dựa hệ điều hành bạn Cài Đặt Từ Mã Nguồn Sẽ hữu ích bạn cài đặt Git từ mã nguồn, bạn có phiên Mỗi phiên Git thường bao gồm nhiều cải tiến hữu ích giao diện người dùng, cài đặt phiên ln cách tốt bạn quen thuộc với việc biên dịch phần mềm từ mã nguồn Đôi nhiều phiên Linux sử dụng gói (package) cũ; trừ bạn sử dụng phiên Linux thường xuyên cập nhật, cài đặt từ mã nguồn nói lựa chọn tốt Để cài đặt Git, bạn cần có thư viện mà Git sử dụng sau: curl, zlib, openssl, expat, libiconv Ví dụ bạn sử dụng hệ điều hành có sử dụng yum (như Fedora) apt-get (như hệ điều hành xây dựng Debian), bạn sử dụng lệnh sau để cài đặt tất thư viện cần thiết: $ yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ libz-dev libssl-dev Khi cài đặt xong tất thư viện cần thiết, bước tải phiên Git từ website nó: http://git-scm.com/download Sau đó, dịch cài đặt: $ $ $ $ tar -zxf git-1.7.2.2.tar.gz cd git-1.7.2.2 make prefix=/usr/local all sudo make prefix=/usr/local install Sau thực xong bước trên, bạn tải cập nhật Git dùng sau: $ git clone git://git.kernel.org/pub/scm/git/git.git Cài Đặt Trên Linux Nếu bạn muốn cài đặt Git Linux thông qua chương trình cài đặt, bạn làm việc thơng qua phần mềm quản lý gói kèm với hệ điều hành bạn Nếu bạn sử dụng Fedora, bạn dùng yum: $ yum install git-core Còn bạn sử dụng hệ điều hành dựa nhân Debian Ubuntu, dùng aptget: $ apt-get install git Cài Đặt Trên Mac Có hai cách đơn giản để cài đặt Git Mac Cách đơn giản sử dụng chương trình cài đặt có hỗ trợ giao diện, bạn tải từ trang web SourceForge (xem Hình 1-7): http://sourceforge.net/projects/git-osx-installer/ Hình 1-7 Chương trình cài đặt Git cho Mac OS X Cách khác để cài đặt Git thông qua MacPorts (http://www.macports.org) Nếu bạn cài đặt MacPorts, Git cài đặt sử dụng lệnh sau: $ sudo port install git-core +svn +doc +bash_completion +gitweb Bạn cài đặt thư viện kèm, có lẽ bạn muốn cài đặt thêm +svn trường hợp sử dụng chung Git với Subversion (xem Chương 8) Cài Đặt Trên Windows Cài đặt Git Windows đơn giản Dự án msysGit cung cấp cách cài đặt Git dễ dàng Đơn giản tải tập tin cài đặt định dạng exe từ Github, chạy: http://msysgit.github.com/ Sau cài đặt, bạn có hai phiên bản: command-line (bao gồm SSH) giao diện chuẩn Chú ý sử dụng Windows: bạn nên dùng Git công cụ có sẵn: msysGit shell (kiểu Unix), cho phép bạn sử dụng lệnh phức tạp sách Vì lý đó, bạn muốn sử dụng cửa sổ dòng lệnh chuẩn Windows: Windows shell, bạn sử dụng nháy kép thay nháy đơn (cho tham số đầu vào có bao gồm dấu cách) bạn phải dùng dấu mũ (^) cho tham số chúng kéo dài đến cuối dịng, ký tự tiếp diễn Windows 1.5 Bắt Đầu - Cấu Hình Git Lần Đầu Cấu Hình Git Lần Đầu Bây Git có hệ thống, bạn muốn tuỳ biến số lựa chọn cho môi trường Git bạn Bạn phải thực bước lần nhất; chúng ghi nhớ qua lần cập nhật Bạn thay đổi chúng lúc cách chạy lại lệnh Git cung cấp sẵn git config cho phép bạn xem chỉnh sửa biến cấu hình để quản lý tồn khía cạnh Git giao diện hay hoạt động Các biến lưu ba vị trí khác nhau: • /etc/gitconfig : Chứa giá trị cho tất người dùng kho chứa hệ thống Nếu bạn sử dụng system chạy git config, thao tác đọc ghi thực tập tin • ~/.gitconfig : Riêng biệt cho tài khoản bạn Bạn định Git đọc ghi tập tin cách sử dụng global • tập tin config thư mục git (.git/config) kho chứa mà bạn sử dụng: Chỉ áp dụng riêng cho kho chứa Mỗi cấp ghi đè giá trị cấp trước nó, giá trị git/config "chiến thắng" giá trị /etc/gitconfig Trên Windows, Git sử dụng tập tin gitconfig thư mục $HOME (%USERPROFILE% mơi trường Windows), cụ thể C:\Documents and Settings\$USER C:\Users\ $USER, tuỳ thuộc vào phiên Windows sử dụng ($USER %USERNAME% mơi trường Windows) Nó tìm kiếm tập tin /etc/gitconfig, cấu hình sẵn đến thư mục gốc MSys, thư mục bất kỳ, nơi bạn chọn cài đặt Danh Tính Của Bạn Việc bạn nên làm cấu hình Git định tên tài khoản địa e-mail Điều quan trọng Git sử dụng chúng cho lần commit, thông tin gắn bất di bất dịch vào commit: $ git config global user.name "John Doe" $ git config global user.email johndoe@example.com Tôi xin nhắc lại bạn phải làm việc lần sử dụng global, Git sử dụng thơng tin cho tất bạn làm hệ thống Nếu bạn muốn sử dụng tên địa e-mail khác cho dự án riêng biệt đó, bạn chạy lại lệnh không sử dụng global dự án Trình Soạn Thảo Bây danh tính bạn cấu hình xong, bạn lựa chọn trình soạn thảo mặc định sử dụng để soạn thảo dòng lệnh Mặc định, Git sử dụng trình soạn thảo mặc địch hệ điều hành, thường Vi Vim Nếu bạn muốn sử dụng trình soạn thảo khác, Emacs, bạn sửa sau: $ git config global core.editor emacs Công Cụ So Sánh Thay Đổi Một lựa chọn hữu ích khác mà bạn muốn thay đổi chương trình so sánh thay đổi để giải trường hợp xung đột nội dung Ví dụ bạn muốn sử dụng vimdiff: $ git config global merge.tool vimdiff Git chấp nhận kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, opendiff công cụ trộn/sát nhập (merge) hợp lệ Bạn sử dụng cơng cụ u thích khác; xem hướng dẫn Chương Kiểm Tra Cấu Hình Nếu bạn muốn kiểm tra cấu hình cài đặt, bạn sử dụng lệnh git config list để liệt kê tất cài đặt Git: $ git config list user.name=Scott Chacon user.email=schacon@gmail.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto Bạn thấy từ khố xuất nhiều lần, Git đọc chúng từ tập tin khác (ví dụ, /etc/gitconfig ~/.gitconfig) Trong trường hợp Git sử dụng giá trị xuất cuối cho từ khoá Bạn kiểm tra giá trị từ khố riêng biệt cách sử dụng git config {key}: $ git config user.name Scott Chacon 1.6 Bắt Đầu - Trợ Giúp Trợ Giúp Nếu bạn cần giúp đỡ sử dụng Git, có ba cách để hiển thị tài liệu hướng dẫn (manpage) cho câu lệnh Git nào: $ git help $ git help $ man git- Ví dụ, bạn hiển thị hướng dẫn cho câu lệnh config cách chạy: $ git help config Những lệnh thuận tiện hữu ích bạn sử dụng chúng nơi, khơng có kết nối Internet Nếu tài liệu hướng dẫn sách chưa đủ, bạn cần thêm người trợ giúp, thử sử dụng kênh #git #github Freenode IRC server (irc.freenode.net) Những kênh thường xuyên thu hút hàng trăm người có kiến thức tốt Git họ ln sẵn lịng giúp đỡ 1.7 Bắt Đầu - Tóm Tắt Tóm Tắt Bạn có kiến thức bạn Git chúng khác CVCS (hệ thống quản lý phiên bản/mã nguồn tập trung) mà bạn đã, sử dụng Bạn có phiên hoạt động tốt Git cấu hình với danh tính cá nhân máy tính bạn Và đến lúc để học số kiến thức Git Chapter Cơ Bản Về Git Đây chương bạn cần đọc để bắt đầu sử dụng Git Chương bao hàm câu lệnh bạn cần để thực phần lớn việc mà bạn làm với Git Kết thúc chương này, bạn cấu hình khởi động kho chứa, bắt đầu hay dừng theo dõi tập tin, tổ chức/sắp xếp (stage) commit thay đổi Chúng hướng dẫn bạn để bỏ qua (ignore) số tập tin kiểu tập tin đó, để khơi phục lỗi cách nhanh chóng dễ dàng, để duyệt qua lịch sử dự án hay xem thay đổi lần commit, để đẩy lên (push) hay kéo (pull) từ kho chứa từ xa 2.1 Cơ Bản Về Git - Tạo Một Kho Chứa Git Tạo Một Kho Chứa Git Bạn tạo dự án có sử dụng Git dựa theo hai phương pháp Thứ dùng dự án hay thư mục có sẵn để nhập (import) vào Git Thứ hai tạo kho chứa Git hoạt động máy chủ khác Khởi Tạo Một Kho Chứa Từ Thư Mục Cũ Nếu bạn muốn theo dõi dự án cũ Git, bạn cần thư mục dự án gõ lệnh sau: $ git init Lệnh tạo thư mục có tên git, thư mục chứa tất tập tin cần thiết cho kho chứa - khung/xương kho chứa Git Cho tới thời điểm tại, chưa có dự án bạn theo dõi (track) hết (Xem Chương để biết xác tập tin có thư mục git bạn vừa tạo.) Nếu bạn muốn kiếm soát phiên cho tập tin có sẵn (đối lập với thư mục trống), chắn bạn nên bắt đầu theo dõi tập tin thực commit đầu tiên/khởi tạo (initial commit) Bạn hồn thành việc cách định tập tin bạn muốn theo dõi lần commit sử dụng câu lệnh git add: $ git add *.c $ git add README $ git commit -m 'phiên đầu tiên/khởi tạo dự án' Chúng ta xem lệnh thực chốc lát Bâu bạn có kho Git với tập tin theo dõi lần commit 10 Hình 3-25 Thêm máy chủ từ xa khác Bây bạn chạy lệnh git fetch teamone để truy xất toàn nội dung mà bạn chưa có từ máy chủ teamone Bởi máy chủ có chứa tập liệu từ máy chủ origin có, Git không truy xuất liệu mà thiết lập nhánh từ xa teamone/master để trỏ tới commit mà teamone có nhánh master (xem Hình 3-26) 67 Hình 3-26 Bạn có tham chiếu tới vị trí nội nhánh master teamone Đẩy Lên Khi bạn muốn chia sẻ nhánh với người, bạn cẩn phải đẩy lên máy chủ mà bạn có quyền ghi Nhánh nội bạn không tự động thực q trình đồng hóa - mà bạn phải tự đẩy lên cách nhánh mà bạn muốn chia sẻ Theo cách này, bạn có nhánh riêng tư cho công việc mà bạn không muốn chia sẻ, đẩy lên nhánh chủ đề mà bạn muốn người tham gia đóng góp Nếu bạn có nhánh serverfix mà bạn muốn người cộng tác, bạn đẩy lên theo cách mà làm nhánh Chạy git push (remote) (branch): $ git push origin serverfix Counting objects: 20, done Compressing objects: 100% (14/14), done Writing objects: 100% (15/15), 1.74 KiB, done Total 15 (delta 5), reused (delta 0) To git@github.com:schacon/simplegit.git * [new branch] serverfix -> serverfix Đây cách làm tắt Git tự động mở rộng nhánh serverfix thành refs/heads/serverfix:refs/heads/serverfix, có nghĩa là, "Hãy sử dụng nhánh nội 68 serverfix tơi đẩy lên để cập nhật nhánh serverfix máy chủ từ xa." Chúng ta sâu vào phần refs/heads/ Chương 9, bạn thường bỏ qua Bạn chạy lệnh sau git push origin serverfix:serverfix, cách cho kết tương tự có nghĩa "Hãy sử dụng serverfix để tạo serverfix máy chủ" Bạn sử dụng định dạng để đẩy nhánh nội lên nhánh từ xa với tên khác Nếu bạn khơng muốn gọi serverfix máy chủ, bạn chạy lệnh sau git push origin serverfix:awesomebranch để đẩy nhánh nội serverfix vào nhánh awesomebranch máy chủ trung tâm Lần tới đồng nghiệp bạn truy xuất từ máy chủ, họ có tham chiếu tới phiên máy chủ serverfix tên origin/serverfix: $ git fetch origin remote: Counting objects: 20, done remote: Compressing objects: 100% (14/14), done remote: Total 15 (delta 5), reused (delta 0) Unpacking objects: 100% (15/15), done From git@github.com:schacon/simplegit * [new branch] serverfix -> origin/serverfix Điều quan trọng cần ý bạn truy xuất liệu từ máy chủ mà có kèm theo nhánh mới, Git không tự động tạo phiên nội nhánh Nói cách khác, trường hợp này, bạn khơng có nhánh serverfix - bạn có trỏ tới origin/serverfix mà bạn khơng thể chỉnh sửa Để tích hợp cơng việc vào nhánh bạn làm việc, bạn chạy git merge origin/serverfix Nếu bạn muốn nhánh serverfix riêng để làm việc đó, bạn tách khỏi nhánh trung tâm cách: $ git checkout -b serverfix origin/serverfix Branch serverfix set up to track remote branch refs/remotes/origin/serverfix Switched to a new branch "serverfix" Cách tạo cho bạn nhánh nội mà bạn làm việc, bắt đầu vị trí với origin/serverfix Theo Dõi Các Nhánh Check out nhánh nội từ nhánh trung tâm tự động tạo tracking branch Tracking branches nhánh nội có liên quan trực tiếp với nhánh trung tâm Nếu bạn tracking branch chạy git push, Git tự động biết phải đẩy lên nhánh nào, máy chủ Ngoài ra, chạy git pull nhánh truy xuất toàn tham chiếu từ xa sau tự động tích hợp chúng với nhánh từ xa tương ứng Khi bạn tạo kho chứa, thông thường Git tự động tạp nhánh master để theo dõi origin/master Đó lý git push git pull chạy tốt mà khơng cần tham số Tuy nhiên, bạn cài đặt tracking branch khác muốn - nhánh 69 không theo dõi nhánh origin master Một ví dụ đơn giản giống bạn vừa thấy: git checkout -b [branch] [remotename]/[branch] Nếu bạn sử dụng Git phiên 1.6.2 trở lên, bạn sử dụng track: $ git checkout track origin/serverfix Branch serverfix set up to track remote branch refs/remotes/origin/serverfix Switched to a new branch "serverfix" Để cài đặt nhánh nội sử dụng tên khác với tên mặc định nhánh trung tâm, bạn dễ dàng sử dụng phiên với tên nội khác: $ git checkout -b sf origin/serverfix Branch sf set up to track remote branch refs/remotes/origin/serverfix Switched to a new branch "sf" Bây giờ, nhánh nội sf tự động "kéo đẩy" từ origin/serverfix Xóa Nhánh Trung Tâm Giả sử bạn đồng nghiệp hoàn thành chức tích hợp vào nhánh master trung tâm (hoặc nhánh khác sử dụng cho việc lưu trữ phiên ổn định) Bạn xóa nhánh trung tâm sử dụng cú pháp sau git push [remotename] : [branch] Nếu bạn muốn xóa nhánh serverfix máy chủ, bạn chạy lệnh sau: $ git push origin :serverfix To git@github.com:schacon/simplegit.git - [deleted] serverfix Vậy xong, nhánh bị xóa khỏi máy chủ Có thể bạn muốn đánh dấu trang lại, bạn cần đến câu lệnh bạn quên cú pháp Một cách để nhớ lệnh xem lại cú pháp nhắc tới trước git push [remotename] [localbranch]: [remotebranch] Nếu bạn bỏ qua phần [localbranch], bạn thực "Khơng sử dụng từ phía nội để tạo nhánh [remotebranch]." 3.6 Phân Nhánh Trong Git - Rebasing Rebasing Trong Git, có hai cách để tích hợp thay đổi từ nhánh vào nhánh khác: merge rebase Trong phần bạn tìm hiểu rebase gì, sử dụng nào, coi cơng cụ tuyệt vời, trường hợp khơng nên sử dụng Cơ Bản Rebase Nếu bạn xem lại ví dụ trước phần Tích Hợp (xem Hình 3-27), bạn thấy bạn phân nhánh cơng việc bạn thực commit hai nhánh khác 70 Hình 3-17 Lần phân nhánh Cách đơn giản để tích hợp nhánh, đề cập từ trước, lệnh merge Nó thực tích hợp 3-chiều hai snapshot hai nhánh (C3 C4) cha chung gần hai (C2), tạo snapshot khác (và commit), Hình 3-28 Hình 3-28 Gộp nhánh lại để hợp công việc bị tách trước Tuy nhiên, cịn có cách khác: bạn sử dụng vá thay đổi đưa C3 áp dụng lên C4 Trong Git, gọi rebasing Bằng cách sử dụng lệnh rebase, bạn sử dụng tất thay đổi commit nhánh "chạy lại" (replay) chúng nhánh khác Trong ví dụ này, bạn thực sau: $ git checkout experiment $ git rebase master 71 First, rewinding head to replay your work on top of it Applying: added staged command Nó thực cách tới commit cha chung hai nhánh (nhánh bạn làm việc nhánh bạn muốn rebase), tìm khác biệt commit nhánh mà bạn làm việc, lưu lại thay đổi vào tập tin tạm thời, khôi phục lại nhánh commit với nhánh bạn rebase, cuối áp dụng thay đổi Hình 3-29 minh họa tồn q trình Hình 3-29 Q trình rebase thay đổi C3 vào C4 Đến lúc này, bạn quay lại nhánh master thực fast-forward merge (xem Hình 330) Hình 3-30 Di chuyển nhánh master lên phía trước Bây snapshot mà C3' trỏ tới giống snapshot trở tới C5 ví dụ sử dụng merge Khơng có khác biệt so sánh kết hai phương pháp này, sử dụng rebase cho lịch sử rõ ràng Nếu bạn xem xét lịch sử nhánh mà rebase vào, giống đường thẳng: thứ dường xảy theo trình tự, chí ban đầu diễn song song 72 Bình thường, bạn sử dụng cách để đảm bảo commit áp dụng cách rõ ràng, rành mạch nhánh remote - có lẽ dự án mà bạn đóng góp khơng phải trì Trong trường hợp này, bạn thực công việc nhánh sau rebase trở lại nhánh origin/master sẵn sàng Theo cách người trì dự án khơng phải thực việc tích hợp - mà chi chuyển tiến lên phía trước (fast-forwar) đơn giản áp dụng chúng vào Lưu ý snapshot trỏ tới commit cuối cùng, cho dù kết việc rebase hay merge, giống - khác bước thực mà thơi Q trình rebase thực cách thực lại thay đổi từ nhánh qua nhánh khác theo thứ tự chúng thực hiện, merge lại lấy hai điểm kết thúc gộp chúng lại với Rebase Nâng Cao Bạn thực rebase đối tượng khác mà nhánh rebase Xem ví dụ Hình 3-31 Bạn tạo nhánh chủ để (server) để thêm số tính server-side vào dự án, thực số commit Sau bạn tạo nhánh khác để thực số thay đổi cho phía client (client) commit vài lần Cuối cùng, bạn quay trở lại nhánh server thực thêm số commit 73 Hình 3-31 Nhánh chủ đề tạo từ nhánh chủ đề khác Giả sử bạn định tích hợp thay đổi phía client vào nhánh cho phát hành tới, bạn muốn giữ thay đổi server-side kiểm tra kỹ lưỡng Bạn lấy thay đổi client mà khơng có mặt server (C8 C9) sau chạy lại (replay) chúng nhánh master cách sử dụng lựa chọn onto cho lệnh git rebase: $ git rebase onto master server client Lệnh nói rằng, "Hãy check out nhánh client, tìm vá từ commit chung nhánh client server, sau thực thi lại vào nhánh master." Nó phức tạp chút kết Hình 3-32 lại tuyệt Hình 3-32 Quá trình rebase nhánh chủ đề khỏi nhánh chủ đề khác Bây bạn di chuyển trỏ nhánh master tiến lên phía trước (xem Hình 3-33): $ git checkout master $ git merge client 74 Hình 3-33 Di chuyển nhánh master lên phía trước để bao gồm thay đổi nhánh client Giả sử bạn định kéo nhánh máy chủ Bạn rebase nhánh máy chủ vào nhánh master mà checkout trước lệnh git rebase [basebranch] [topicbranch] - lệnh checkout nhánh chủ để (trong trường hợp server) cho bạn áp dụng lại thay đổi vào nhánh sở (base) master: $ git rebase master server Lệnh thực lại thay đổi nhánh server chèn vào nhánh master Hình 3-34 Hình 3-34 Rebase nhánh server chèn lên nhánh master Sau bạn di chuyển trỏ nhánh base (master): $ git checkout master $ git merge server Bạn xóa nhánh client server tất cơng việc tích hợp vào master bạn không cần đến chúng nữa, lịch sử tồn q trình vừa giống Hình 3-35: $ git branch -d client 75 $ git branch -d server Hình 3-35 Lịch sử commit cuối Rủi Ro Rebase Mặc dù rebase hữu ích có khơng mặt hạn chế, điều tổng kết câu sau đây: Không rebase commit mà bạn đẩy lên kho chứa công khai Miễn bạn làm theo hướng dẫn này, khơng có chuyện xảy Nếu không, người ghét bạn, bạn bị bạn bè gia đình coi thường Khi bạn thực rebase, bạn bỏ commit tồn tái tạo lại commit tương tự thực khác biệt Nếu bạn đẩy commit nơi người kéo xuống máy họ, sau bạn sửa lại commit lệnh git rebase đẩy lên lần nữa, đồng nghiệp bạn phải tích hợp lại công việc họ thứ rối tung lên bạn cố gắng kéo thay đổi họ ngược lại máy bạn Hãy xem ví dụ việc rebase cơng khai gây cố Giả sử bạn tạo từ máy chủ trung tâm thực số thay đổi từ Lịch sử commit bạn giống Hình 3-36 76 Hình 3-36 Tạo kho chứa, base số thay đổi vào Bây giờ, người khác thực số thay đổi khác có kèm theo lần tích hợp (merge), đẩy lên máy chủ trung tâm Bạn truy xuất chúng tích hợp nhánh trung tâm vào bạn, lúc lịch sử bạn giống Hình 3-37 77 Hình 3-37 Truy xuất thêm commit tích hợp lại Tiếp theo, người đẩy tích hợp định lại rebase lại thay đổi họ; họ thực git push force để ghi đè lịch sử máy chủ Sau bạn truy xuất lại liệu từ máy chủ, đưa commit 78 Hình 3-38 Một người đẩy lên commit rebase, bỏ commit có chứa thay đổi bạn Lúc này, bạn phải tích hợp lại lần thay đổi này, trước bạn làm Quá trình rebase thay đổi mã băm SHA-1 commit Git chúng giống commit mới, mà thực tế bạn có C4 lịch sử bạn (xem Hình 3-39) 79 Hình 3-39 Bạn tích hợp thay đổi tương tự lại lần vào commit tích hợp Bạn phải tích hợp thay đổi để theo kịp với lập trình viên khác sau Sau thực việc này, lịch sử commit bạn bao gồm hai commit C4 C4' có mã SHA-1 khác lại có chung nội dung thay đổi thông điệp commit Nếu bạn chạy lệnh git log trường hợp bạn thấy hai commit chung ngày commit thông điệp, điều gây khó hiểu cho bạn Hơn nữa, bạn đẩy chúng ngược lên máy chủ, bạn đưa vào lần tất commit rebase gây khó hiểu cho nhiều người khác Nếu bạn sử dụng rebase cách để dọn dẹp commit trước đẩy chúng lên, bạn rebase commit chưa cơng khai, khơng có chuyện xảy Nếu bạn rebase commit công khai người tích hợp (base) vào cơng việc họ bạn gặp phải vấn đề thực khó chịu 3.7 Phân Nhánh Trong Git - Tổng Kết Tổng Kết Chúng ta đề cập tới khái niệm phân nhánh tích hợp Git Bạn nên nắm vững việc tạo mới, di chuyển nhánh tích hợp nhánh nội lại với Bạn nên có khả chia nhánh cách đẩy chúng lên máy chủ trung tâm, cộng tác với thành viên khác nhánh dùng chung rebase chúng trước chia sẻ 80 81 ... simplegit thường sử dụng làm ví dụ minh hoạ Để tải dự án này, bạn chạy lệnh: git clone git: //github.com/schacon/simplegit-progit .git Khi bạn chạy git log dự án này, bạn thấy tương tự sau: $ git. .. done $ cd ticgit $ git remote origin Bạn sử dụng tham số -v để hiển thị địa mà Git lưu tên rút gọn đó: $ git remote -v origin git: //github.com/schacon/ticgit .git (fetch) origin git: //github.com/schacon/ticgit .git. .. git: //github.com/bakkdoor/grit .git cho45 git: //github.com/cho45/grit .git defunkt git: //github.com/defunkt/grit .git koke git: //github.com/koke/grit .git origin git@ github.com:mojombo/grit .git 32 Điều có nghĩa bạn "kéo" đóng góp