Git là gì? Tại sao bạn nên dùng Git? – gbaydev.com

5/5 – (6 bình chọn)

Git là gì? tại sao phải dùng Git? ở bài viết này gbaydev sẽ tóm tắt lịch sử hình thành lên Git, Version Control System (VCS) là gì, những những nhược điểm khi làm việc mà không có Git hỗ trợ và cuối cùng là những ưu điểm vượt trội khi sử dụng Git để anh em IT có cái nhìn bao quát nhất.

Lịch sử hình thành Git

Để bắt đầu thì chúng ta cần phải tìm hiểu từ Linus Torvalds cha đẻ của hệ điều hành Linux, hệ điều hành Linux là một dự án khá lớn vào thời điểm bấy giờ. Khi bắt đầu từ năm 1991 – 2002 lõi của Linux được quản lý dưới dạng các bản vá lỗi và tập tin lưu trữ, đến năm 2002 dự án Linux được quản lý bằng Distributed Version Control SystemDVCS – Hệ thống kiểm soát phiên bản phân phối/phân cấp của một công ty tên là BitKeeper.

Năm 2005 mối quan hệ giữa cộng đồng phát triển hệ điều hành Linux và công ty BitKeeper có tình trạng xấu đi, dẫn đến việc công ty BitKeeper không còn cho sử dụng cộng đồng sử dụng DVCS miễn phí để quản lý mã nguồn.

Điều này dẫn tới việc thúc đẩy cộng đồng và cha đẻ Linux (Linus Torvalds) tạo ra một công cụ hỗ trợ quản lý mã nguồn dựa vào kinh nghiệm đã làm việc với BitKeeper, với các mục tiêu quan trọng sau:

– Tốc độ nhanh.

– Thiết kế đơn giản

– Hỗ trợ mạnh mẽ cho sự phát triển phi tuyến tính (hàng nghìn nhánh song song)

– Phân phối đầy đủ

– Có thể xử lý các dự án lớn như hạt nhân Linux một cách hiệu quả (tốc độ và kích thước dữ liệu)

Kể từ khi chào đời năm 2005 Git đã phá triển và trưởng thành để dễ sử dụng nhưng vẫn giữ được những mục tiêu ban đầu. Nó nhanh, rất hiệu quả với các dự án lớn và có hệ thống phân nhánh đáng kinh ngạc để phát triển phi tuyến tính.

Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (DVCS – Distributed Version Control System), hiện nay Git là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất, nhờ có Git mà giúp cho việc quản lý source code (mã nguồn) trở nên dễ dàng, đơn giản, thuận tiện hơn rất nhiều. Theo thống kê năm 2019 Git được 74% các công ty sử dụng để quản lý cấu hình phần mềm.

VCS – Version Control System là gì?

Version Control System viết tắt là VCS là một hệt thống quản lý phiên bản, lưu trữ lại toàn bộ các thay đổi đối với tập tin (file) hoặc tập hợp các tập tin theo thời gian (mỗi sự thay đổi sẽ được lưu lại thành một version – phiên bản), nhằm giúp các lập trình viên có thể dễ dàng lấy lại phiên bản trước đó.

Đôi chút về VCS – Version Control System

Để đi sâu hơn một chút về hệ thống Version Control System, để tôi giới thiệu cho bạn VCS dưới đây.

VCS phiên bản cục bộ

VCS phiên bản cục bộ là sao chép tập tin (file) vào một thư mục khác (thư mục được đánh dấu thời gian). Phương pháp này rất phổ biến vì tính đơn giản, nhưng nó cũng rất dễ xảy ra lỗi (rất dễ quên bạn đang ở thư mục nào và bô tình ghi nhầm vào các file hoặc sao chép file mà bạn không cố ý.

Để đối phó với vấn đề ở trên, các lập trình viên VCS cục bộ có một cơ sở dữ liệu đơn giản lưu lại tất cả các thay đổi đối với tập tin.

Sơ đồ VCS phiên bản cục bộHình 1: Ảnh mô tả VCS cục bộ hoạt động

Một trong những công cụ VCS phổ biến nhất là hệ thống có tên RCS, hệ thống này vẫn còn được phân phối trên nhiều máy tính ngày nay.

RCS hoạt động bằng cách giữ lại sự thay đổi giữa các tập tin, ở một định dạng đặc biệt. Sau đó RCS sẽ khôi phục lại tập tin ở thời điểm bạn muốn.

VCS phiên bản tập trung

Vấn đề lớn tiếp theo mà mọi người gặp phải là họ cần cộng tác với các nhà phát triển trên các hệ thống khác. Để giải quyết vấn đề này, hệ thống quản lý phiên bản tập trung (CVCS) đã được phát triển. Một vài ví dụ về hệ thống này như CVS, Subversion và Perforce, các hệ thống này có một máy chủ duy nhất lưu trữ tất cả các tập tin kèm theo là version (phiên bản), trong nhiều năm đây là một hệt thống VCS tiêu chuẩn để quản lý phiên bản. 

Sơ đồ VCS phiên bản tập trungHình 2: Ảnh VCS phiên bản tập trung

Với VCS phiên bản tập trung mang lại nhiều ưu điểm, đặc biệt là so với VCS cục bộ. Ví dụ: Khi một dự án cần 2 người ở 2 nơi khác nhau làm việc, thì họ sẽ biết được người nào làm những công việc gì, việc quản lý CVCS dễ đàng hơn nhiều so với việc xử lý cơ sở dữ liệu cục bộ trên 2 máy khách.

Tuy nhiên hệ thống này cũng có một số nhược điểm nghiêm trong. Nếu máy chủ lưu trữ gặp sự cố như mất điện, mất mạng trong thời gian 1h, 1 ngày thì trong khoảng thời gian đó mọi người không thể lưu lại các thay đổi mà họ đang làm. Kinh khủng hơn nữa chẳng may hệ thống máy tính bị cháy nổ,… khiến cho ổ cứng bị hỏng sẽ dẫn tới việc dự án đang thực hiện sẽ tan tành mây khói. Với các hệ thống VCS cục bộ cũng gặp phải vấn đề tượng tự như VCS phiên bản tập trung – “Khi bạn cho toàn bộ trứng vào một giỏ, bạn có nguy cơ mất trắng“.

VCS phiên bản phân tán

Đây là lúc Hệ thống quản lý phiên bản phân tán (DVCS) nhảy vào làm việc. Trong một DVCS (chẳng hạn như Git, Mercurial, Bazaar hoặc Darcs). Bạn không chỉ xem lại ảnh chụp nhanh (snapshot) nhất của các tập tin, mà con phản ánh đầy đủ kho lưu trữ và toàn bộ lịch sử của nó. Vì vậy nếu bất kỳ máy chủ nào gặp sự cố như ở trên, thì bất kỳ kho lưu trữ của của máy tính khác cũng có thể được dùng để sao lưu, khôi phục lại máy chủ. Mỗi bản sao là đều có toàn bộ thông tin của tất cả dữ liệu

Sơ đồ VCS phiên bản phân tánHình 3. Hệ thống quản lý phiên bản phân tán (DVCS)

Hơn nữa, nhiều hệ thống này giải quyết khá tốt với việc có một số kho lưu trữ từ xa mà chúng có thể làm việc cùng, vì vậy bạn có thể cộng tác với các nhóm người khác nhau theo những cách khác nhau đồng thời trong cùng một dự án. Điều này cho phép bạn thiết lập một số loại quy trình công việc không thể thực hiện được trong các hệ thống tập trung, chẳng hạn như mô hình phân cấp.

Version Control System có tác dụng gì?

Version Control System (VCS) hệ thống giúp bạn lưu trữ được nhiều phiên bản khác nhau của một mã nguồn được nhân bản (nhân bản còn được gọi là clone) của một kho chứa mã nguồn phần mềm (repository), bất kỳ thay đổi mã nguồn nào trên máy tính của bạn (local) sẽ được commit (ủy thác) để đưa lên server, nơi mà bạn đặt mã nguồn chính.

Khi bất kỳ một máy tính nào khác nếu họ được quyền truy cập cũng có thể nhân bản (clone) lại toàn bộ mã nguồn của bạn từ kho chứ hoặc một tập hợp những thay đổi mới nhất ở máy tính của bạn.

Một coder có thể xem lại toàn bộ danh sách những sự thay đổi của tập tin (file) qua các phiên bản, bao gồm: nội dung tập tin (file) bị thay đổi, ngày giờ sửa đổi, ai là người sửa đổi, vì sao thay đổi, tên phiên bản….

Từ bên trên các bạn có thể thấy tác dụng của VCS:

1. Lưu lại toàn bộ lịch sử các phiên bản của dự án, giúp Leader có thể xem xét, khôi phục lại những sự thay đổi gây bug cho dự án và chi nhỏ task cho các thành viên khác.

2. Việc chia sẻ code trở nên cực kỳ đơn giản và dễ dàng, bạn có thể chia sẻ thành quả cho tất cả mọi người hoặc một số người nhất định, họ có thể tải source code cực kỳ dễ dàng với chỉ 1 vài dòng lệnh (À quên họ phải có mạng nha, không có mạng thì bó tay luôn).

Git cũng là một trong những VCS nên Git cũng lưu trữ lại toàn bộ những sự thay đổi của source code trong dự án, thêm xóa sửa dòng code… đều được ghi nhận và lưu lại.

Git hoạt động như thế nào?

Dưới đây là tổng quan cơ bản về cách Git hoạt động:

1. Tạo “repository (kho lưu trữ)” (dự án) bằng công cụ lưu trữ git (như Bitbucket)

2. Sao chép (hoặc Clone) kho lưu trữ vào máy cục bộ của bạn

3. Thêm tệp vào kho lưu trữ cục bộ của bạn và “commit” (lưu) các thay đổi

4. “Push (đẩy)” các thay đổi của bạn lên nhánh chính (master branch) của bạn

5. Thực hiện thay đổi đối với tệp của bạn bằng công cụ lưu trữ git và commit

6. “Pull (kéo)” các thay đổi đối với máy cục bộ của bạn

7. Tạo “branch (chi nhánh)” (phiên bản), thực hiện thay đổi, commit thay đổi

8. Mở “pull request” (đề xuất các thay đổi đối với nhánh chính)

9. “Merge (hợp nhất)” nhánh của bạn với nhánh chính

So sánh Git so với các VCS khác

Đặc điểm của Git

Ảnh chụp nhanh – Snapshot

Khi bạn làm việc trên các tập tin của dự án, với mỗi lần thay đổi Git sẽ tạo ra các phiên bản hay còn gọi là Version, từ Version 1, Version 2… tới Version N. Git sẽ lưu lại toàn bộ thông tin của những tập tin thay đổi và không thay đổi, ví dụ ở hình phía dưới Version 1 có A, B, C Version 2 có sự thay đổi A1 và C1 nhưng B không thay đổi thì Git vẫn lưu lại thông tin của A1, B, C1. Để đạt được hiệu quả cao nhất, nếu các tập tin không thay đổi, Git sẽ không lưu trữ lại tập tin mà chỉ là một liên kết đến tập tin giống hệt trước đó mà nó lưu trữ (nó giống như một ảnh chụp nhanh – snapshot).

Ảnh chụp nhanh snapshotsHình 4: Ảnh lưu trữ dữ liệu dưới dạng snapshot theo thời gian.

Đây là điểm khác biệt lớn nhát giữa Git so với các hệ thống Version Control System (VCS) khác. Nó giúp bạn xem lại hầu hết mọi khía cạnh của quản lý phiên bản mà hầu hết các hệ thống khác đã sao chép từ các Version trước đó.

Điều này làm cho Git giống như một hệ thống tập tin nhỏ với một số công cụ cực kỳ mạnh mẽ được tích hợp trên nó, thay vì đơn giản là một VCS.

Phần lớn mọi hoạt động đều là trên máy tính của bạn

Phần lớn các thao tác trong Git chỉ cần yêu cầu các tập tin hay tài nguyên cục bộ (ngay tại máy tính cá nhân). Hầu hết các hoạt động trong Git chỉ cần các tập tin và tài nguyên cục bộ để hoạt động, nhìn chung bạn Code dự án mà không cần thông tin từ một máy tính khác trong mạng của bạn. Nếu bạn đã làm việc với các CVCS khác thì mọi dòng Code, mọi câu lệnh,… của bạn đều có độ trễ liên quan tới đường truyền mạng, thậm chí là không thể làm việc khi cáp quang bất ngờ trở thành món ăn cho cá mập.

Git đã giải quyết vấn đề này bằng cách lưu trữ lại toàn bộ lịch sử của dự án ngay trên máy tính của bạn, nó làm cho bạn thấy mọi thứ gần như tức thì.

Ví dụ: Khi bạn xem lịch sử của dự án, Git không cần phải kết nối tới máy chủ để lấy lịch sử dự án về và hiển thị cho bạn, thay vào đó nó chỉ cần đọc trực tiếp từ Cơ Sở Dữ Liệu trên máy tính của bạn và hiển thị ra. Bạn có thấy nhanh không, chỉ 1 2 cái click chuột là bạn đã thấy được thông tin. Nếu bạn muốn xem những thay đổi giữa phiên bản hiện tại và phiên bản của một tháng trước, Git sẽ lập tức tra cứu tập tin của một tháng trước và thực hiện tính toán những thay đổi ngay trên máy tính của bạn thay vì phải yêu cầu một máy chủ từ xa thực hiện, hoặc kéo phiên bản của một tháng trước từ máy chủ về máy tính của bạn để tính toán.

Tính toàn vẹn của Git

Mọi thứ trong Git được tổng kiểm tra trước khi nó được lưu trữ và sau đó được tham chiếu bởi tổng kiểm tra đó. Điều này có nghĩa là bạn không thể thay đổi nội dung của bất kỳ tập tin hoặc thư mục nào mà Git không biết đến nó, chức năng này được tích hợp vào Git ở các cấp độ thấp nhất và không thể thiếu trong nguyên lý hoạt động của nó “Bạn không thể mất thông tin khi chuyển tiếp hoặc bị hỏng tập tin mà Git không thể phát hiện ra nó“.

Cơ chế mà Git sử dụng để tổng kiểm tra này được gọi là hàm băm SHA-1. Đây là một chuỗi 40 ký tự bao gồm các ký tự thập lục phân (a-z và 0-9) và được tạo ra dựa trên nội dung của tập tin hoặc thư mục trong Git, nó trông như thế này:

24b9da6552252987aa493b52f8696cd6d3b00373

Trên thực tế Git lưu trữ mọi thứ bằng những mã này mà không phải bằng tên tập tin, nên bạn sẽ thấy chúng ở khắp nơ trong Git, Git lưu trữ mọi thứ trong Cơ Sở Dữ Liệu của mình.

Đặc điểm của VCS khác

Với các VCS khác chỉ lưu lại thông tin dưới dạng danh sách của những tập tin được thay đổi chứ không lưu lại thông tin địa chỉ của những tập tin không thay đổi như Git. Các hệ thống này (CVS, Subversion, Perforce, Bazaar,…) coi thông tin mà chúng lưu trữ dưới dạng một tập hợp các tập tin và những thay đổi được thực hiện đối với từng tập tin theo thời gian (điều này thường mô tả quản lý phiên bản dựa trên delta).

Các thao tác đòi hỏi phải kết nối đến máy chủ chứa Repository (kho chứa), đồng nghĩa với việc bạn mất mạng hay tốc độ đường truyền kém sẽ dẫn tới độ trễ khi làm việc

Nguyên lý hoạt động của VCS khácHình 5. Lưu trữ dữ liệu dưới dạng các thay đổi đối với phiên bản cơ sở của mỗi tập tin

Tại sao bạn nên dùng Git?

1. Git theo dõi mọi sự thay đổi của các tập tin

Thật vậy Git là VCS – Version Control System hệ thống quản lý phiên bản, việc theo    dõi mọi sự thay đổi của các tập tin là một trong những tính năng cơ bản nhất của Git

2. Theo dõi sự thay đổi của các người dùng trên các tập tin

Khi bạn chia nhỏ một dự án thành nhiều task cho các thành viên khác nhau thực hiện, là một Leader bạn cần biết rõ ai là người Code những phần nào, sửa những phần nào… để đánh giá năng lực của từng người. Thật tuyệt vời khi Git đã xử lý toàn bộ những vấn đề ở trên phải không.

3. Phục hồi trạng thái của các tập tin vào một thời điểm nào đó

Hãy tưởng tượng bạn Code khiến dự án bị lỗi không thể hoạt động, hoặc một thành viên nào đó lỡ tay xóa một vài tập tin trong dự án, bạn yên tâm Git sẽ đưa bạn về quá khứ để khôi phục lại những tập tin đó, thật tuyệt vời phải không.

4. Hỗ trợ làm việc Offline

Đối với các VCS bạn cần phải có máy tính kết nối tới server để làm việc nhóm hoặc commit sự thay đổi của các tập tin, nhưng đối với Git bạn hoàn toàn có thể làm việc mà không có kết nối Internet, khi nào có kết nối mạng bạn chỉ cần đẩy lên server thế là xong. 

5. Hỗ trợ rất tốt trong môi trường làm việc nhóm

Còn điều gì tuyệt vời hơn khi mà bạn có thể chia nhỏ từng thành phần, từng công việc cho các thành viên trong nhóm mà không sợ bị rối hay lỗi Code.

6. Một phần trong yêu cầu tuyển dụng của các doanh nghiệp CNTT hiện nay

Chà chà nếu bạn đang xin việc trong ngành lập trình, ắt hẳn bạn sẽ thấy nhan nhản đơn tuyển dụng yêu cầu phải nắm được Git, nếu biết chút ít hoặc Pro Git bạn sẽ có lợi thế hơn hẳn so với các ứng viên khác.

7. Cộng đồng hỗ trợ và sử dụng rộng lớn

Hiện nay Git đã chiếm 74% thị phần VCS, với thị phần to lớn dẫn tới cộng đồng sử dụng Git cũng lớn theo, với việc cộng đồng hỗ trợ và sử dụng rộng lớn sẽ giúp bạn tìm kiếm được sự giúp đỡ dễ dàng hơn rất nhiều so với các VCS khác, bạn thì sao còn mình luôn lựa chọn những phần mềm hoặc hệ thống được người sử dụng để làm việc cho dễ.

19 thuật ngữ quan trọng của Git

Branch

Branch hay còn gọi là nhánh, gần như mọi VCS đều có một số hình thức phân nhanh. Phân nhánh có nghĩa là bạn tách khỏi nhánh phát triển chính và tiếp tục việc thực hiện công việc mà không làm nhánh chính bị xáo trộn hay lỗi.

Xem chi tiết: Branch Git

Commit

Ghi lại các thay đổi với Repository, một commit đại diện cho một thời điểm cụ thể trong lịch sử dự án của bạn

Checkout

Cập nhật tập tin trong cây làm việc để khớp với phiên bản trong chỉ mục hoặc cây được chỉ định. Nếu không có pathspec nào được đưa ra, git checkout cũng sẽ cập nhật HEAD để đặt nhánh được chỉ định làm nhánh hiện tại.

Fetch

Fetch (tìm nạp) các nhánh và/hoặc thẻ (gọi chung là “refs”) từ một hoặc nhiều kho lưu trữ khác, cùng với các đối tượng cần thiết để hoàn thành lịch sử của chúng. 

Fork

HEAD

Để hiểu rõ HEAD trong Git, bạn cần trả lời câu hỏi, nếu bạn chạy lệnh git branch <branch>, làm thế nào để Git biết được mã SHA-1 của lần cuối commit? Câu trả lời nằm ở tập tin HEAD.

Thông thường, tập tin HEAD là một tham chiếu tượng trưng cho nhánh bạn hiện đang truy cập. Theo tham chiếu tượng trưng, nó không giống như một tham chiếu bình thường và nó chứa một con trỏ đến một tham chiếu khác.

Tuy nhiên trong một số trường hợp hiếm hoi, tập tin HEAD có thể chứa giá trị SHA-1 của đối tượng Git, điều này xảy ra khi bạn kiểm tra thẻ, commit hoặc tạo nhánh từ xa, việc này sẽ đặt kho lưu trữ (repository) của bạn ở trạng thái “HEAD bị tách rời”.

Index

Nếu bạn thêm, xóa hoặc thay đổi một tập tin (file) nó vẫn được nằm trong chỉ mục cho đến khi bạn sẵn sàng commit những thay đổi. Nó như là khu vực tổ chức (stagging area) cho Git, sử dụng lệnh git status để xem nội dung index của bạn.

Khi những thay đổi được tô sáng bằng màu xanh lá cây nghĩa là hệ thống đã sẵn sàng để  được commit, trong khi những thay đổi màu đỏ thì chưa.

Master

Master là một nhánh, nó là nhánh chính trong kho chứa (repository) của bạn. Master chứa toàn bộ lịch sử thay đổi và commit gần đây nhất của bạn

Merge

Kết hợp các thay đổi từ các commit đã được đặt tên (kể từ thời điểm lịch của chúng tách khỏi nhánh hiện tại) vào nhánh hiện tại. Lệnh này được sử dụng bởi git pull để kết hợp các thay đổi từ kho lưu trữ khác và có thể được sử dụng bằng tay để kết hợp các thay đổi từ nhánh này sang nhánh khác.

Origin

Origin là tên của kho lưu trữ từ xa mà bạn đã nhân bản. Theo quy ước, kho lưu trữ từ xa mặc định được gọi là “origin”, bạn có thể làm việc với một số Orign với các tên khác nhau cùng một lúc.

Hãy xem .git/refs/remotes/origin/* và .git/config trong các nguồn của bạn để xem git biết về nó như thế nào.

Pull

Kết hợp các thay đổi từ kho lưu trữ (repository) ở nơi khác vào nhánh hiện tại bạn đang làm việc. Ở chế độ mặc định của nó, git pull được viết tắt git fetch theo sau là git merge FETCH_HEAD

Chính xác hơn, git pull chạy git fetch với các tham số đã cho và gọi git merge để hợp nhất các đầu nhánh và truy xuất vào nhánh hiện tại. Với –rebase, nó chạy git rebase thay vì git merge

Push

Git Push cập nhật các tham chiếu từ xa cùng với các đối tượng liên quan.

Cập nhật các tham chiếu từ xa bằng cách sử dụng các tham chiếu cục bộ, đồng thời gửi các đối tượng cần thiết để hoàn thành các tham chiếu đã cho.

Bạn có thể làm cho những điều thú vị xảy ra với một kho lưu trữ mỗi khi bạn push vào nó, bằng cách thiết lập các hook ở đó.

Rebase

Git rebase cam kết đăng ký lại trên đầu một mẹo cơ sở khác. Nếu branch (nhánh) được chỉ định, git rebase sẽ thực hiện tự động git switch <branch> trước khi làm bất kỳ điều gì khác. Nếu không, nó vẫn còn trên nhánh hiện tại.

Remote

Git remote quản lý tập hợp các kho lưu trữ được theo dõi, quản lý tập hợp các kho lưu trữ (“điều khiển từ xa”) có các nhánh mà bạn theo dõi.

Repository

Một vùng lưu trữ dữ liệu của bạn, bạn thường lưu trữ Git theo một trong hai cách:

1. Bạn có thể lấy một thư mục trên máy tính của bạn hiện chưa được quản lý bởi Git và biến nó thành một kho lưu trữ của Git.

2. Bạn có thể clone vùng lưu trữ Git hiện có từ nơi khác.

Trong cả hai trường hợp, bạn sẽ có một vùng lưu trữ Git trên máy tính của mình, sẵn sàng làm việc.

Stash

Git stash có tác dụng lưu lại những thay đổi mà bạn chưa muốn commit ngay lập tức. Sửu dụng git stash khi bạn muốn ghi lại trạng thái hiện tại của thư mục làm việc và chỉ mục, nhưng muốn quay lại thư mục làm việc. Lệnh sẽ lưu các sửa đổi cục bộ của bạn và hoàn lại thư mục làm việc để khớp với HEAD commit. 

Tags

Giống như hầu hết các VCS khác, Git có khả năng gắn thẻ các điểm lịch sử của kho lưu trữ là quan trọng. Thông thường, mọi người sử dụng chức năng này để đánh dấu điểm phát hành (v1.0, v2.0…)

Upstream

Trong Git, upstream là nơi bạn push các thay đổi của mình lên nhánh, thông thường đó sẽ là nhánh chính (master branch)

Snapshot

Snapshot còn gọi là ảnh chụp nhanh, trong Git đồng nghĩa với commit. Mỗi khi bạn commit với kho lưu trữ Git, bạn đang lưu snapshot của tất cả các tập tin trong kho lưu trữ của mình. Git không lưu tất cả các tập tin được theo dõi mỗi khi bạn commit.

14 lệnh Git cơ bản

git config

Tác dụng: để bạn set username và địa chỉ email của bạn trong main configuration file.

Cách sử dụng: 

– Kiểm tra tên: git config – global user.name

– Kiểm tra email: git config – global user.email

– Để set tên mới: git config – global user.name = “Vũ Đức Thao”

– Để set địa chỉ email mới: it config – global user.email = “[email protected]

git init

Tác dụng: Tạo một kho lưu trữ (repository) trống hoặc khởi động lại kho lưu trữ hiện có

Cách sử dụng:

git init [-q | –quiet] [–bare] [–template=<template_directory>]

  [–separate-git-dir <git dir>] [–object-format=<format>]

  [-b <branch-name> | –initial-branch=<branch-name>]

  [–shared[=<permissions>]] [directory]

git clone

Tác dụng: Copy 1 kho chứa (repository) mã nguồn từ Git về máy tính của bạn.

Cách sử dụng: git clone <:clone git url:>

git status

Tác dụng: Để kiểm tra xem trang thái của những tập tin mà bạn đã thay đổi trong thư mục làm việc.

Cách sử dụng: gõ lệnh git status 

git commit

Tác dụng: Ghi lại các thay đổi đối với kho lưu trữ

Cách sử dụng: 

git commit [-a | –interactive | –patch] [-s] [-v] [-u<mode>] [–amend]

  [–dry-run] [(-c | -C | –fixup | –squash) <commit>]

  [-F <file> | -m <msg>] [–reset-author] [–allow-empty]

  [–allow-empty-message] [–no-verify] [-e] [–author=<author>]

  [–date=<date>] [–cleanup=<mode>] [–[no-]status]

  [-i | -o] [–pathspec-from-file=<file> [–pathspec-file-nul]]

  [-S[<keyid>]] [–] [<pathspec>…​]

git push/git pull

Tác dụng: Tìm nạp và tích hợp với một kho lưu trữ hoặc một nhánh cục bộ

Cách sử dụng: git pull [<options>] [<repository> [<refspec>…]]

git branch

Tác dụng: Danh sách, tạo mới hoặc xóa nhánh.

Cách sử dụng: 

git branch [–color[=<when>] | –no-color] [–show-current]

[-v [–abbrev=<n> | –no-abbrev]]

[–column[=<options>] | –no-column] [–sort=<key>]

[–merged [<commit>]] [–no-merged [<commit>]]

[–contains [<commit>]] [–no-contains [<commit>]]

[–points-at <object>] [–format=<format>]

[(-r | –remotes) | (-a | –all)]

[–list] [<pattern>…​]

git branch [–track | –no-track] [-f] <branchname> [<start-point>]

git branch (–set-upstream-to=<upstream> | -u <upstream>) [<branchname>]

git branch –unset-upstream [<branchname>]

git branch (-m | -M) [<oldbranch>] <newbranch>

git branch (-c | -C) [<oldbranch>] <newbranch>

git branch (-d | -D) [-r] <branchname>…​

git branch –edit-description [<branchname>]

git checkout

Tác dụng: Chuyển các nhánh hoặc khôi phục các tập tin cây đang hoạt động.

Cách sử dụng:

git checkout [-q] [-f] [-m] [<branch>]

git checkout [-q] [-f] [-m] –detach [<branch>]

git checkout [-q] [-f] [-m] [–detach] <commit>

git checkout [-q] [-f] [-m] [[-b|-B|–orphan] <new_branch>] [<start_point>]

git checkout [-f|–ours|–theirs|-m|–conflict=<style>] [<tree-ish>] [–] <pathspec>…​

git checkout [-f|–ours|–theirs|-m|–conflict=<style>] [<tree-ish>] –pathspec-from-file=<file> [–pathspec-file-nul]

git checkout (-p|–patch) [<tree-ish>] [–] [<pathspec>…​]

git stash

Tác dụng: Lưu trữ các thay đổi trong một thư mục không sạch.

Cách sử dụng:

git stash list [<options>]

git stash show [<options>] [<stash>]

git stash drop [-q|–quiet] [<stash>]

git stash ( pop | apply ) [–index] [-q|–quiet] [<stash>]

git stash branch <branchname> [<stash>]

git stash [push [-p|–patch] [-k|–[no-]keep-index] [-q|–quiet]

    [-u|–include-untracked] [-a|–all] [-m|–message <message>]

     [–pathspec-from-file=<file> [–pathspec-file-nul]]

    [–] [<pathspec>…​]]

git stash clear

git stash create [<message>]

git stash store [-m|–message <message>] [-q|–quiet] <commit>

git merge

Tác dụng: Kết hợp hai hoặc nhiều phiên bản phát triển với nhau

Cách sử dụng: 

git merge [-n] [–stat] [–no-commit] [–squash] [–[no-]edit]

[–no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]

[–[no-]allow-unrelated-histories]

[–[no-]rerere-autoupdate] [-m <msg>] [-F <file>] [<commit>…​]

git merge (–continue | –abort | –quit)

git reset

Tác dụng: Đặt lại HEAD hiện tại về trạng thái được chỉ định

Cách sử dụng: 

git reset [-q] [<tree-ish>] [–] <pathspec>…​

git reset [-q] [–pathspec-from-file=<file> [–pathspec-file-nul]] [<tree-ish>]

git reset (–patch | -p) [<tree-ish>] [–] [<pathspec>…​]

git reset [–soft | –mixed [-N] | –hard | –merge | –keep] [-q] [<commit>]

git remote

Tác dụng: Quản lý tập hợp các kho được theo dõi

Cách sử dụng: 

git remote [-v | –verbose]

git remote add [-t <branch>] [-m <master>] [-f] [–[no-]tags] [–mirror=(fetch|push)] <name> <url>

git remote rename <old> <new>

git remote remove <name>

git remote set-head <name> (-a | –auto | -d | –delete | <branch>)

git remote set-branches [–add] <name> <branch>…​

git remote get-url [–push] [–all] <name>

git remote set-url [–push] <name> <newurl> [<oldurl>]

git remote set-url –add [–push] <name> <newurl>

git remote set-url –delete [–push] <name> <url>

git remote [-v | –verbose] show [-n] <name>…​

git remote prune [-n | –dry-run] <name>…​

git remote [-v | –verbose] update [-p | –prune] [(<group> | <remote>)…​]

git add

Tác dụng: Thêm tập tin nội dung vào chỉ mục.

Cách sử dụng: 

git add [–verbose | -v] [–dry-run | -n] [–force | -f] [–interactive | -i] [–patch | -p]

  [–edit | -e] [–[no-]all | –[no-]ignore-removal | [–update | -u]]

  [–intent-to-add | -N] [–refresh] [–ignore-errors] [–ignore-missing] [–renormalize]

  [–chmod=(+|-)x] [–pathspec-from-file=<file> [–pathspec-file-nul]]

  [–] [<pathspec>…​]

Tính năng hay nhất của Git nhưng lại ít được sử dụng

Tính năng hay nhất của Git nhưng lại được ít dùng/biết đến nhất của Git theo mình nghĩ đó là Git Hooks. Một vài đoạn script ở phía server hoặc client có thể được kích hoạt chạy tự động khi bạn chạy một lệnh Git.

Ví dụ: Bạn có thể cho hệ thống server chạy tự động mọi Unit tests trước khi chấp nhận merge vào nhánh master.

Những trở ngại khi dùng Git

– Trong trường hợp mất kết nối internet thường xuyên đến remote repos, thì việc bạn push code mới có thể gây phức tạp cho hai người merge code và review.

– Nhược điểm của Git là User Interface (UI), UI của Git không đủ tốt và không cung cấp đủ những tính năng nâng cao mà bạn cần.

Những sai lầm phổ biến nhất khi dùng Git

Không tìm hiểu các nguyên tắc cốt lỗi của Git

Lời khuyên: Bạn nên tìm hiểu Git là gì và giá trị của nó trước, bài này có thể khá dài nhưng nếu bạn đọc hết bài này nghĩa là bạn đã nắm được cơ bản của Git rồi. Nếu muốn tìm hiểu Git thành Pro thì hãy xem thêm các bài khác của mình ở website gbaydev.com nhé.

Dùng Git theo cách dùng các VCS trước đây.

Lời khuyên: Ví dụ với các nhánh, Git chỉ sử dụng các con trỏ đến các commit, còn với SVN thì chúng chỉ là bản sao của toàn bộ thư mục. Hãy tìm hiểu thật kĩ về Git nhé bạn.

Commit vô tội vạ.

Lời khuyên: bạn nên tìm hiểu các biện pháp dọn lại commit tree để tránh việc commit vô tội vạ sẽ làm gây rối commit log.

Làm mọi thứ trên nhánh Master

Lời khuyên: Dù có làm việc một mình bạn cũng không nên làm việc chỉ trên nhánh master, tránh hình thành thói quen xấu và tận dụng được chức năng xịn sò nhất của một VCS.

Check in những tập tin (files) không thực sự liên quan vào một VCS.

Lời khuyên: Nếu bạn code các dự án Python, khi mọi người check in các tập tin .pyc của họ. Bạn có thể thiếp lập .gitignore để lờ chúng đi và nên dùng Git Hooks để dọn dẹp chúng lúc chuyển sang nhánh khác.

Lời khuyên khi sử dụng Git trong công việc

Các nguồn tài liệu Git

Dưới đây là những website tài liệu Git bằng tiếng anh cực kỳ chất lượng cho các bạn tìm hiểu thêm về Git

https://rogerdudler.github.io/git-guide/

https://git-scm.com/docs/gittutorial

https://gitsheet.wtf/

http://ndpsoftware.com/git-cheatsheet.html

https://gitexplorer.com/

Tìm hiểu kĩ lưỡng các khái niệm, tính năng nền tảng của Git.

Nếu bạn không tìm hiểu kĩ các khái niệm, tính năng nền tảng của Git khi bạn làm việc bạn sẽ phải đoán mò, và không thể biết chắc chuyện gì sẽ xảy ra.

Phân nhánh thường xuyên

Bạn hãy chắc chắn rằng là bạn có một nhánh staging với các tính năng đã được unit test đầy đủ trước khi nhập vào nhánh master.

Commit thường xuyên

Commit thường xuyên nhưng đùng vô tội vạ bạn nhé, nếu không bạn đang lưu rất nhiều rác.

Test trước khi commit

Còn gì tệ hơn là không test kỹ xem code có hoạt động mượt mà không trước khi commit để tránh việc mọi người bị lỗi và thêm những thứ không tốt trên kho chứa của Git

Viết ghi chú khi commit

Hãy viết ghi chú khi commit để mọi người biết được bạn xử lý vấn đề gì nhé.