git kinh-nghiem-lap-trinh - It costs 10 mins to read

Git

Trong bài viết Tôi đã học Ruby như thế nào, mình có nhắc đến git – Hệ thống version control do chính cha đẻ của hệ điều hành Linux - Linus Tovard phát triển. Khi git xuất hiện, đã làm thay đổi hoàn toàn cuộc chơi của version control systemGit ngày càng được giới lập trình viên - đặc biệt là trong cộng đồng OSS ưa chuộng vì những đặc tính nổi trội của nó. - Contributing to Open Source Software with git

Git là gì? Để nắm được thì mình cần nắm được khái niệm Version Control là gì trước đã.

Bài viết này được đúc kết dựa trên những gì mình đã tìm hiểu về Git, có lẽ nó chỉ dừng lại ở mức độ căn bản nhất, chỉ đáp ứng cho nhu cầu công việc thường nhật của một lập trình viên.

Bài viết là nền tảng để bạn tìm hiểu sâu hơn về Git thông qua các liên kết tham khảo khác có nhắc đến trong bài.

Version Control là gì?

Bạn có thể coi Version Control System (VCS) như là một dạng “database” đặc biệt, lưu lại hình ảnh (snapshot) của dự án bạn đang làm tại bất kì thời điểm nào bạn muốn. Và khi cần, VCS sẽ cho bạn biết chính xác giữa 2 thời điểm, dự án của bạn đã thay đổi và khác nhau ở những điểm nào.

Why use a version control system?

Tại sao chúng ta lại cần sử dụng VCS, bởi một VCS tốt, sẽ cho bạn những đặc tính ưu việt sau:

Git là một Version Control System mà theo tôi là tốt nhất và phổ biến nhất.

Vậy Git có ưu điểm nào? Why git?


Basic Workflow of Version Control

Phần này trình bày một Git WorkFlow căn bản nhất. Có nhiều Git workflow khác, quy định cụ thể hơn về việc chức năng mới thì được phát triển trên nhánh nào, đặt tên nhánh ra sao, code review và merge vào nhánh nào, deploy staging bằng nhánh nào, deploy production bằng nhánh nào v.v… Workflow sẽ khác nhau tùy theo team, công ty…

Repository được hiểu nôm na là một dạng Database nơi Git lưu mọi version và metadata trong dự án của bạn. Trong Git, Repository chỉ là một thư mục ẩn có tên là “.git”, bạn chỉ cần biết vậy là đủ, không cần (và không nên) can thiệp gì vào thư mục huyền bí này.

(1) git init (Khai báo sử dụng git cho dự án của bạn) hoặc git clone (trong trường hợp bạn muốn tiếp tục một dự án khác đã có sẵn git)

(2) Chỉnh sửa, di chuyển, sắp xếp lại code của bạn cho đến khi bạn cảm thấy hài lòng và code của bạn đang ở trạng thái xứng đáng để commit lên Git. Ở thời điểm này, Git vẫn chưa hoạt động và theo dõi những thay đổi của bạn.

Tìm hiểu thêm về Commit

A commit is a wrapper for a specific set of changes. The author of a commit has to comment what he did in a short “commit message”. This helps other people (and himself) to understand later what his intention was when making these changes.

Every set of changes implicitly creates a new, different version of your project. Therefore, every commit also marks a specific version. It’s a snapshot of your complete project at that certain point in time (but saved in a much more efficient way than simply duplicating the whole project…). The commit knows exactly how all of your files and directories looked and can therefore be used, e.g., to restore the project to that certain state.

(3) Trước khi commit, hãy xem trạng thái hiện tại bằng lệnh git status – Lệnh này sẽ list ra tất cả những thay đổi mà bạn đã thực hiện so với lần commit trước.

(4) Bạn có thể chỉ ra những Thay đổi cần được commit bằng cách thêm chúng vào Staging Area

(5) Lúc này, bạn có thể commit lên Git và đi kèm với thông điệp ngắn gọn mô tả những gì bạn đã thay đổi. Điều này tốt cho những người làm việc cùng dự án với bạn và cho chính bạn sau này.

(6) git log liệt kê toàn bộ Commit của bạn.

(7) Nếu bạn đang cộng tác với nhiều người, một Remote Repositories sẽ đóng vai trò là nơi tiếp nhận mọi sự thay đổi của bạn và mọi người.

Local & Remote Repositories

There are two kinds of repositories:

A “local” repository resides on your local computer, as a “.git” folder inside your project’s root folder. You are the only person that can work with this repository, by committing changes to it.

A “remote” repository, in contrast, is typically located on a remote server on the internet or in your local network. No actual working files are associated with a remote repository: it has no working directory but it exclusively consists of the “.git” repository folder. Teams are using remote repositories to share & exchange data: they serve as a common base where everybody can publish their own changes and receive changes from their teammates.


What Makes a Good Commit?

The better and more carefully you craft your commits, the more useful will version control be for you. Here are some guidelines about what makes a good commit:

Related Changes

As stated before, a commit should only contain changes from a single topic. Don’t mix up contents from different topics in the same commit. This will make it harder to understand what happened.

Completed Work

Never commit something that is half-done. If you need to save your current work temporarily in something like a clipboard, you can use Git’s “Stash” feature (which will be discussed later in the book). But don’t eternalize it in a commit.

Tested Work Related to the point above, you shouldn’t commit code that you think is working. Test it well – and before you commit it to the repository.

Short & Descriptive Messages A good commit also needs a good message. See the paragraph above on how to “Write Good Commit Messages” for more about this.

Finally, you should make it a habit to commit often. This will automatically help you to keep your commits small and only include related changes.


Saving Changes Temporarily – Git Stash

THE GOLDEN RULES OF VERSION CONTROL

Never Commit Half-Done Work

You should only commit code when it’s completed. This doesn’t mean you have to complete a whole, large feature before committing. Quite the contrary: split the feature’s implementation into logical chunks and remember to commit early and often. But don’t commit just to get half-done work out of your way when you need a “clean working copy”. For these cases, consider using Git’s “Stash” feature instead.

Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory. The command saves your local modifications away and reverts the working directory to match the HEAD commit.

Think of the Stash as a clipboard on steroids: it takes all the changes in your working copy and saves them for you on a new clipboard. You’re left with a clean working copy, i.e. you have no more local changes.

Later, at any time, you can restore the changes from that clipboard in your working copy – and continue working where you left off.

You can create as many Stashes as you want – you’re not limited to storing only one set of changes. Also, a Stash is not bound to the branch where you created it: when you restore it, the changes will be applied to your current HEAD branch, whichever this may be.

git stash Để tạo stash mới. Lúc này, stash sẽ lưu lại trạng thái hiện tại của bạn, sau đó nó sẽ đưa bạn trở về lần commit mới nhất.

git stash list để xem danh sách các stash

Khi cần restore một stash, bạn cần đến các lệnh dưới đây

git stash pop  Khôi phục lại trang thái ở stash mới nhất, và xóa stash đó ra khỏi danh sách.

git stash apply <stashname> – Khôi phục lại trạng thái ở , tuy nhiên stash đó chưa được xóa khỏi stash list, bạn cần remove nó bằng lệnh git stash drop <stashname>

Tham khảo thêm Document của Git Stash

Tình huống cần dùng stash

A commit wraps up changes and saves them permanently in the repository. However, in your day-to-day work, there are a lot of situations where you only want to save your local changes temporarily. For example, imagine you’re in the middle of some changes for feature X when an important bug report comes in. Your local changes don’t belong to the bugfix you’re going to make. You have to get rid of them (temporarily, without losing them!) and continue working on them later.

Situations like this one happen all the time: you have some local changes in your working copy that you can’t commit right now – and you want or need to start working on something else. To get these changes out of your way and have a “clean” working copy, Git’s “Stash” feature comes in handy.

Các tình huống khác

When to Stash

Stashing helps you get a clean working copy. While this can be helpful in many situations, it’s strongly recommended…


Works with Branches — Git Branch

Branch là gì, Tại sao Branch là một tính năng vô cùng quan trọng trong Git – Hãy xem thêm bài viết – Branching can change Your life

Tham khảo thêm các lệnh liên quan đến Branching tại Git Tower.

Works with Remote Repository

Tham khảo thêm:

GUI Tools for Git

Git có rất nhiều lệnh mà đôi khi bạn sẽ không nắm hết tất cả được, nhưng để phục vụ cho công việc hàng ngày thì chỉ cần nhớ một số lệnh git sử dụng thường xuyên là đủ.

Để biết tất tần tật về Git – Tham khảo Git Document.


Bài được viết dựa trên tutorial của Git Tower.