Sử dụng Git (bash) offline và các khái niệm cơ bản

2

Trong bài học trước chúng ta đã làm quen với khái niệm Hệ thống quản lý phiên bản. Chúng ta cũng đã nhắc tới Git – hệ thống quản lý phiên bản phân tán phổ biến hàng đầu hiện nay, và học cách cài đặt Git trên các hệ điều hành.

Trong bài học này chúng ta sẽ làm quen với quy trình và kỹ thuật sử dụng Git với giao diện dòng lệnh (CLI) ở chế độ offline.

Lưu ý rằng nội dung trình bày trong bài này là quy trình và kỹ thuật cơ bản trong sử dụng Git (bash), không liên quan đến IDE nào. Cách sử dụng Git trong một số IDE phổ biến sẽ được trình bày trong một bài học riêng.

Để nắm được quy trình sử dụng Git offline, chúng ta cùng thực hiện một ví dụ.

Để đơn giản trong minh họa chúng ta sẽ làm việc với Windows. Nếu bạn sử dụng Linux hay Mac, hãy chủ động thực hiện các thao tác với file và thư mục.

Trong Windows, bạn nên sử dụng chương trình Git Bash. Đây là chương trình mô phỏng giao diện console cho windows tương tự như terminal của Linux hay Mac. Chương trình này cài đặt sẵn khi bạn cài đặt Git for Windows.

Trong Mac và Linux, bạn sử dụng terminal quen thuộc.

Tạo thư mục dự án

Nếu bạn đã có sẵn một dự án, bạn có thể sử dụng ngay thư mục đó.

Nếu dùng Windows, mở thư mục dự án, click phải chuột và chọn Git Bash here.

Nếu dùng Hệ điều hành khác, bạn chuyển thư mục dự án thành thư mục hiện hành (ví dụ, sử dụng lệnh cd – change directory).

Nếu không có sẵn dự án, chúng ta đang giả sử rằng cần quản lý phiên bản cho một dự án mới đặt trong thư mục HelloGit.

Nếu sử dụng Windows Explorer:

  1. Tạo thư mục Projects trong Documents. Thư mục này tạo ra chỉ để tiện lợi cho việc thực hiện các ví dụ.
  2. Trong thư mục Projects tạo tiếp thư mục con HelloGit. Đây sẽ là thư mục của dự án.
  3. Mở thư mục HelloGit, mở context menu và chọn Git Bash here.
Sử dụng Git bash từ windows explorer

Nếu sử dụng Git Bash bạn sử dụng các lệnh như sau:

$ cd C:/Users/<tên_user>/Documents
$ mkdir Projects
$ cd Projects
$ mkdir HelloGit
$ cd HelloGit
Sử dụng Git CLI

Trong đó, cd là lệnh chuyển thư mục hiện hành, mkdir là lệnh tạo thư mục.

Nhìn chung trên Windows, việc chuẩn bị thư mục cho dự án chỉ đơn giản là tạo thư mục => mở Git Bash và đặt thư mục của dự án làm thư mục làm việc (qua context menu hoặc qua các lệnh chuyển thư mục cd).

Với các hệ điều hành khác cũng tương tự.

Nếu bạn không quen thuộc với việc sử dụng lệnh CLI thì cũng không phải là vấn đề lớn. Để sử dụng git bạn chỉ cần biết một số lệnh cơ bản sau:

  • cd – change directory – thay đổi thư mục làm việc hiện hành.
  • ls – list – liệt kê danh sách file trong thư mục làm việc.
  • cp – copy – sao chép file
  • mv – move – di chuyển file hoặc thư mục
  • mkdir – make a directory – tạo thư mục mới.

Khởi tạo Git, repository

Dù sử dụng giao diện nào, sau bước Tạo thư mục dự án ở trên bạn cũng đều mở Git Bash với thư mục hiện hành là HelloGit.

Nhập lệnh sau:

$ git init

Lưu ý: tất cả lệnh của git bắt đầu bằng git.

Kết quả chạy lệnh git init

Sử dụng lệnh này sẽ khởi tạo Git cho thư mục hiện này và biến nó thành một repository (hay gọi tắt là repo).

Repository là một thư mục (hơi hơi) đặc biệt ở chỗ, nó chứa cơ sở dữ liệu của Git phục vụ cho việc quản lý toàn bộ file/thư mục nằm trong thư mục đó.

Sau lệnh này, trong thư mục HelloGit sẽ xuất hiện một thư mục mới .git. Đây là thư mục chứa toàn bộ cơ sở dữ liệu của Git cho repo này.

Thư mục này bình thường để ẩn. Muốn truy cập vào nó, bạn bật chế độ hiển thị file/thư mục ẩn lên.

Tên gọi .git có chút bất thường với người dùng windows với dấu chấm ở đầu. Trong Linux, tên gọi bắt đầu bằng dấu chấm sẽ khiến file/thư mục tương ứng bị ẩn đi trong các lệnh hiển thị danh sách. Windows không có quy ước này.

Đường dẫn trong Git Bash xuất hiện (master) sau tên thư mục hiện hành. (master) là tên mặc định mà Git tự động đặt cho branch đầu tiên.

Branch là một định hướng phát triển riêng biệt của một dự án. Một dự án quản lý bởi Git có thể chứa nhiều branch, nhưng tối thiểu phải có 1 branch (master). Mỗi branch được đặt tên để dễ dàng quản lý và chuyển đổi qua lại.

Điều đặc biệt của repository là bạn có thể “bê” nguyên xi thư mục này đến bất kỳ đâu. Chỉ cần mở trong Git bash hoặc trong IDE hỗ trợ Git, nó sẽ hoạt động bình thường mà không cần thêm bất kỳ thao tác cấu hình nào nữa.

Điều này dẫn đến khả năng lưu repository ở một nơi trên mạng và tải về máy cục bộ để sử dụng. Thao tác này được gọi là clone. Chúng ta sẽ học cách clone repository trong một bài khác.

Tạo các file mã nguồn, working directory

Hãy tạo file mã nguồn helloworld.py trong thư mục HelloPython và viết cho nó vài dòng code:

print("Hello world from Python")

Nếu bạn không biết lập trình Python cũng không sao. Chúng ta không thực sự làm một dự án Python ở đây mà chỉ tạo vài file code minh họa.

Bạn có thể tạo dự án bất kỳ mà mình quen thuộc, như C#, Java, Php, Kotlin. Không có gì khác biệt khi sử dụng Git với các loại dự án này.

Bạn cũng có thể copy dự án có sẵn vào thư mục này.

Git thậm chí còn hỗ trợ tải dự án từ máy khác về. Tuy nhiên đây là một chủ đề riêng trong sử dụng Git mà chúng ta sẽ xem xét trong một bài viết khác.

Toàn bộ thư mục HelloGit (nhưng không ở trong thư mục con .git) giờ trở thành working directory. Đây là nơi bạn tạo các file mã nguồn và thư mục của dự án.

Nhìn chung, Working directory là nơi chứa phiên bản mới nhất của các file và thư mục của dự án. Những gì bạn nhìn thấy trong working directory là phiên bản hiện tại của dự án.

Những phiên bản lưu trữ khác nằm trong thư mục .git. Chỉ khi bạn chuyển đổi một bản sao lưu trữ thành bản hoạt động, các file và thư mục của nó sẽ xuất hiện trong working directory.

Bạn có thể hình dung working directory + thư mục .git = repository.

Các file/thư mục của dự án có thể được tạo thủ công hoặc tạo tự động bởi IDE. Ví dụ, nếu dùng Visual Studio và C# sẽ tự động tạo cấu trúc thư mục riêng.

Git sẽ tự động phát hiện các file và thư mục tạo ra trong working directory.

Để xem thông tin chi tiết về working directory, bạn sử dụng lệnh git status:

$ git status
On branch master (Bạn đang làm việc với nhánh "master")
No commits yet (Bạn chưa thực hiện commit (tạo bản sao lưu) nào)
Untracked files: (danh sách các file chưa được theo dõi)
    (use "git add …" to include in what will be committed)
    helloworld.py
nothing added to commit but untracked files present (use "git add" to track)

Hãy để ý mục Untracked files. Đây là danh sách những file mới chưa được Git theo dõi lịch sử.

Để yêu cầu Git theo dõi lịch sử file, bạn phải sử dụng lệnh git add để đưa nó vào danh sách theo dõi (tracked files).

Đưa file vào danh sách theo dõi và lưu dự phòng, staging

Nhập lệnh: $ git add helloworld.py

Lệnh này sẽ đưa helloworld.py vào danh sách theo dõi (tracked), đồng thời đưa file vào danh sách chờ lưu dự phòng (staged). Đây là thao tác bắt buộc nếu bạn muốn đưa file helloworld.py vào danh sách lưu dự phòng của Git.

Khi bạn tạo mới một file Git sẽ không theo dõi lịch sử thay đổi của nó. Bạn gọi lệnh $ git add để yêu cầu Git bắt đầu theo dõi lịch sử thay đổi của nó. Thao tác này được gọi là staging.

Mặc dù theo dõi lịch sử thay đổi của file, Git cũng không tự động đặt file vào danh sách lưu dự phòng. Nghĩa là nếu bạn yêu cầu Git tạo bản sao dự phòng của dự án (lệnh commit – bạn sẽ học trong phần tiếp theo), Git sẽ chỉ lưu những file nào được bạn chỉ định.

Việc chỉ định file sẽ được lưu dự phòng cũng được gọi là staging.

Như vậy thao tác staging một file đem lại kết quả tùy thuộc vào trạng thái của file đó trong Git. Chúng ta sẽ nói kỹ hơn về trạng thái của file trong phần cuối của bài học này.

Dưới đây là một số lưu ý khi stage file:

  • Nếu cần stage nhiều file, bạn đặt tên file kế tiếp nhau trong lệnh git add: $ git add file1 file2 file 3
  • Nếu cần stage file trong thư mục con, bạn chỉ định tên thư mục và tên file phân tách bởi ký tự /. Ví dụ, $ git add sub_dir/file.py
  • Nếu cần stage toàn bộ file đã bị thay đổi bạn sử dụng lệnh $ git add -A
  • Nếu cần stage toàn bộ file bị sửa hoặc tạo mới, bạn có thể dùng lệnh $ git add .. Lưu ý rằng, lệnh git add . chỉ làm việc với các file mới hoặc file bị sửa đổi chứ không làm việc với các file bị xóa.
  • Nếu cần stage toàn bộ file bị chỉnh sửa hoặc bị xóa bạn có thể sử dụng lệnh $ git add -u.
  • Có thể hình dung $ git add -A tương đương với hai lệnh liên tục $ git add .$ git add -u.
  • Nếu cần stage toàn bộ file (sửa/tạo mới) trong một thư mục con: $ git add sub_dir/.

Cách làm này nhìn có vẻ thủ công một chút. Nếu bạn sử dụng một IDE hỗ trợ Git, quá trình thêm file vào danh sách staging sẽ rất đơn giản và tiện lợi. Chúng ta sẽ trình bày cách sử dụng Git trong một số IDE thông dụng trong một bài học riêng.

Sau khi stag một file, nếu bạn chạy lệnh git status bạn sẽ không thấy file đó xuất hiện trong working directory nữa. Lệnh git status chỉ theo dõi các file chưa được stag.

Tạo bản sao lưu của dự án, commit

Trong quá trình làm dự án, bạn sẽ lần lượt thêm thư mục và file code mới, đồng thời bổ sung file đó vào danh sách stage của Git.

Đến cuối ngày, bạn tạm hài lòng với kết quả công việc và muốn lưu lại tất cả những gì đã làm.

Bạn cũng có thể đứng trước yêu cầu bổ sung thêm code mà có thể làm hỏng code cũ.

Bạn dự định thực hiện những thay đổi nhỏ nhưng sợ sẽ ảnh hưởng đến nhưng gì đã làm.

Đây là lúc bạn cần tạo bản sao lưu của dự án.

Sử dụng Git cho phép bạn tạo ra các snapshot – “bản chụp” của dự án tại thời điểm hiện tại. Mỗi bản chụp này là một bản sao lưu dự phòng của dự án mà bạn có thể sử dụng lại dễ dàng.

Để tạo snapshot, bạn sử dụng lệnh git commit như sau:

$ git commit -m "initial project"

Mỗi snapshot cũng được gọi là một commit.

Trong lệnh commit ở trên, “initial project” là nội dung mô tả cho commit. Bạn có thể đặt tên tùy ý, miễn sao nó dễ hiểu khi bạn cần mở lại commit này.

Khi thực hiện commit thành công, mỗi bản snapshot sẽ có một “mã số”. Ví dụ ở trên có mã hash là 4477c6b. Mã hash này được dùng để “quay trở lại” snapshot tương ứng.

Lệnh commit sẽ tạo ra bản sao lưu dự phòng của dự án từ những file được bạn đánh dấu staging ở bước trên. Những file/thư mục nào không được đánh dấu staging (còn gọi là không nằm trong staging area) sẽ không được đưa vào bản lưu dự phòng này.

Giờ đây bạn có đã bản lưu dự phòng của project. Bạn có thể yên tâm làm việc tiếp trên project.

Git cho phép tạo ra số lượng tùy ý bản lưu dự phòng như vậy. Nhìn chung, trước bất kỳ sự thay đổi quan trọng nào bạn nên commit.

Từ giờ trở đi, bạn có thể tiếp tục thực hiện chu trình Làm việc với dự án (thêm / sửa / xóa file)=> Staging (chỉ định các file cần lưu dự phòng) => Commit (tạo bản sao dự phòng).

Trạng thái của file

Trong hai phần trên bạn có thể để ý rằng các lệnh $ git add$ git commit đều là những lệnh làm biến đổi trạng thái của các file do Git quản lý. Các thao tác cơ bản của Git đều có liên hệ với trạng thái của mỗi file.

Chúng ta sẽ trình bày kỹ hơn về trạng thái của file trong Git.

Mặc định Git không thể tự động theo dõi sự thay đổi của tất cả các file trong working directory. Những thay đổi trong working directory bao gồm thêm mới, xóa, cập nhật nội dung file. Mỗi file tạo mới trong thư mục làm việc đều không được theo dõi. Người ta nói rằng các file mới này nằm ở trạng thái untracked.

Khi dùng lệnh $ git add trên một file mới (trạng thái untracked) sẽ chuyển nó sang trạng thái tracked. Những file ở trạng thái tracked là những file được Git theo dõi lịch sử. Việc chuyển đổi untracked sang tracked chỉ thực hiện một lần (khi gọi $ git add lần đầu tiên).

Khi bạn thay đổi một file (đã được theo dõi – tracked), bạn đồng thời chuyển nó sang trạng thái modified. Đây là trạng thái mà Git biết file có thay đổi, nhưng chưa đưa nó vào danh sách lưu dự phòng.

Nếu muốn lưu dự phòng file nào bạn sẽ phải yêu cầu Git qua lệnh $ git add. Một file được chỉ định cho lưu dự phòng sẽ chuyển từ trạng thái modified / unstaged sang trạng thái staged.

Trong bài học sau bạn sẽ học cách chỉ định các file / thư mục mà Git không cần theo dõi sự thay đổi, gọi là git ignore. Những file này có một trạng thái khác: ignored.

Như vậy cần lưu ý:
(1) lệnh $ git add nếu dùng trên file untracked trước hết sẽ chuyển nó thành tracked, sau đó chuyển sang staged;
(2) một file ở trạng thái tracked và có thay đổi nội dung sẽ chuyển sang trạng thái modified.
(3) nếu dùng $ git add trên file đã ở trạng thái modified sẽ chuyển nó sang staged.
(4) việc chuyển từ untracked sang tracked chỉ cần thực hiện một lần duy nhất (sau khi tạo file).
(5) việc chuyển từ modified sang staged cần thực hiện mỗi lần cần lưu dự phòng.

Kết luận

Đến đây chúng ta tạm thời kết thúc bài hướng dẫn sử dụng Git cơ bản.

Trong quá trình sử dụng Git (ở chế độ offline) sẽ còn phát sinh nhiều vấn đề nữa cần xử lý, như mở lại một snapshot đã commit, xóa bỏ tạm thời các thay đổi (stash), v.v..

Các chủ đề này sẽ tiếp tục được trình bày trong bài học tiếp theo.

+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
Cảm ơn bạn!

Theo dõi
Thông báo của
guest

2 Thảo luận
Cũ nhất
Mới nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Cuong

Thích các bài viết của bạn. Nhiều kiến thức bổ ích.