Các lệnh Git cơ bản mà tôi hay dùng

Sự quan trọng của quản lý phiên bản (Git) hiện nay trong lập trình là không thể chối cãi. Lúc mới tập tành xài Git, nó thật rối rắm và phức tạp bởi vì phải dùng đến các dòng lệnh command line.

Git cơ bản jusfunny

Sau một thời gian sử dụng, mình đã ước “Sẽ thật là hay nếu như có một danh sách các lệnh được sử dụng thường xuyên để ghi nhớ thay vì lan man phải nhớ hết tất cả các lệnh“. Mỗi khi gặp vấn đề gì đó cơ bản về github, mình thường lên stackoverflow tìm kiếm, sau đó copy paste và không cần hiểu quá sâu xa, quá rõ ràng về cơ chế hoạt động của nó. Nhưng mình nhận ra tình trạng này lâu dài chỉ làm cho kỹ năng của mình yếu dần đi.

Trong một năm đi làm, danh sách các lệnh này theo mình qua hầu như các dự án. Có thể nó không đầy đủ nhưng về cơ bản ai cũng chỉ cần có vậy, thậm chí các leader sẽ dùng nhiều rất nhiều vài lệnh mà mình sắp trình bày đây.

Lệnh cơ bản, bộ ba pháp thuật

96,69% ai sử dụng Git đều từng dùng đó là:

git add --all

git commit -m "<Message>"

git push <alias> <branch_name>

Nhưng đó là 3 lệnh quá cơ bản chỉ phù hợp khi dùng trong dự án cá nhân khi mà bạn chỉ có nhu cầu lưu trữ code. Khi làm việc với dự án cần tính ổn định và khả năng bảo trì thì bạn cần nhiều hơn thế, đặc biệt là sức mạnh phân nhánh của Git.

Ví dụ bạn có 1 folder tên xxx, trong đó có 1 file linkphim.txt. Vì bạn sợ đến một ngày đẹp trời máy bạn hư hoặc bị thằng cờ hó nào đó trộm mất thì bạn sẽ bị mất hết phim hay, diễn viên đẹp mà bạn ngày ngày cất công tìm kiếm và bổ sung vào đó. Bạn phải đẩy nó lên Github để lưu trữ lại và để làm được điều đó, bạn cần biến cái folder đó thành một kho lưu trữ local với lệnh đơn giản

git init

Nếu bạn sử dụng Github và có 1 repository ở trên đó thì nó được gọi là remote repository (kho lưu trữ từ xa, khác với kho lưu trữ local trong máy bạn). Tên alias mặc định của remote repository là origin. Còn làm sao tạo remote repository thì chỉ cần vô github.com đăng nhập và New repository thôi. Sau khi tạo xong nhớ copy cái link nó sinh ra. Chẳng hạn mình tạo repository tên tokyoangel thì nó sinh ra link này

https://github.com/viethuong/tokyoangel.git

Bây giờ có kho lưu trữ local rồi, có kho lưu trữ online rồi thì làm sao đẩy dữ liệu lên. Đơn giản, mở Git bash chạy lệnh này là được

git remote add origin https://github.com/viethuong/tokyoangel.git

Đến đây thì bạn đã map được local repository và remote repository rồi, mở Git bash và thực hiện bộ ba pháp thuật ở trên thử được chưa. Chưa được thì đi chết đi.

Chưa chết thì làm tiếp, ahihi. Bây giờ mình muốn copy cục source hay hay của thằng nào đó, cách đơn giản là dùng

git clone <link repository muốn ăn cắp>

để sao chép cục source đó về máy.

Hướng dẫn Git căn bản

Quy trình làm việc của Git

Nhưng tính chất trẻ trâu nổi dậy, bạn muốn đẩy nó lên git của bạn chứ không phải remote từ git của thằng đó, mà đúng hơn là nếu remote từ git của thằng đó thì bạn sẽ không thể push code mà bạn viết tiếp vào cục source đó được (có username, password của nó éo đâu). Vậy thì bạn cần phải đổi cái link repository của thằng đó sang link repository của bạn đúng không.

git remote set-url origin <link repository của bạn>

Đến bây giờ bạn git remote -v lại thì sẽ thấy remote link của cục source là của bạn chứ không còn là của thằng kia nữa. Giờ nó đã map với repository của bạn rồi nên cứ việc đẩy code lên git thôi.

Branch (rẽ nhánh)

Ở trên bộ ba pháp thuật, bạn thấy có khai báo <branch_name> khi push code lên đúng không. Mình sẽ không giải thích branch là gì, branch dùng làm gì vì nó đã được nói rất nhiều trên mạng rồi, hoặc bạn có thể xem tại đây để hiểu quy trình mà git làm việc. Branch mặc định của repository khi được tạo mới tên là master.

Để tạo mới 1 branch khác, mình dùng lệnh sau

git branch <tên branch>

Bạn có thể liệt kê danh sách branch hiện có bằng cách

git branch

Có nhiều branch quá, giờ muốn chuyển qua branch khác để code  mà không ảnh hưởng đến code hiện tại (trên branch master) thì làm sao đây. Chỉ cần dùng lệnh này để chuyển qua branch mới

git checkout <tên branch cần chuyển qua>

Nếu bạn chưa có branch cần chuyển, bạn cũng có thể vừa tạo vừa chuyển qua chỉ với 1 lệnh

git checkout -b <tên branch cần chuyển qua>

Ví dụ mình tạo branch mới tên là vietnam để phát triển link phim có nguồn gốc liên quan đến Việt Nam

$ git branch vietnam

$ git checkout vietnam
Switched to branch 'vietnam'

Sau một thời gian cập nhật vào file text và push lên git miệt mài trên branch mới vietnam, bây giờ mình cần ghép (merge) code lại vào cây gốc (master). Trước tiên, cần phải checkout ra khỏi branch vietnam để vào branch master, sau đó thì dùng lệnh merge để ghép branch vietnam vào master

$ git checkout master
$ git merge <tên branch cần merge vào master>

Sau khi merge xong thì đẩy lên branch master thôi, quá dễ phải không.

Merge branch trên git

Thông thường khi merge hay xảy ra vấn đề conflict (nhất là khi làm dự án nhiều người) nên mấy bạn cần để ý kỹ. Giải quyết vấn đề conflict như thế nào, vì sao bị conflict là kỹ năng bạn cần tự tìm hiểu sau khi đã dùng git một thời gian, vì vậy mình sẽ không giải thích ở đây.


Bây giờ, bạn đang có một cục source trên máy nhưng source gốc của nó đã được người khác push dữ liệu mới lên. Nếu bạn muốn update lại cục source trên máy (local) để nó giống với trên remote repository thì làm sao? Để làm được điều đó đầu tiên bạn phải chắc chắn cục source trên máy bạn chưa được chỉnh sửa gì kể từ lần cuối bạn push nó lên (vì nếu bạn sửa mà chưa push lên, bạn lại update trên remote repo xuống sẽ dễ gây conflict). Sau đó thì chỉ việc dùng lệnh

git pull origin <branch>

để kéo phần update mới về.

Nâng cao một chút

Sau một thời gian cập nhật link và commit file của bạn. Bây giờ bạn muốn xem lại lịch sử những lần commit đó thì làm sao? Lệnh git log sẽ cho bạn biết về người commit, ngày giờ, message của những lần commit đó.

git log

Ngoài ra, mỗi lần commit sẽ sinh ra một đoạn mã (hash) random ngoằn ngoèo giống như đoạn 69c7321d25334943a06796648d65c488c05c02c8. Đoạn hash này được coi như ID của lần commit đó, nó sẽ cho biết bạn thay đổi gì vào lần commit đó. Để xem được những thay đổi đó, dùng lệnh đơn giản sau

$ git show <đoạn hash>

Nếu một ngày đẹp trời bạn commit code và push lên remote repository, thật không may lần commit đó đã làm hỏng ứng dụng. Thay vì sửa lại dưới local và cứ để nguyên cái lỗi ở trên remote, sau khi sửa xong thì push cái mới lên, bạn lại muốn xóa bỏ dữ liệu của lần commit đó trên remote. Cách đơn giản nhất là bạn đưa HEAD của source về lại lần commit trước (trước commit muốn xóa), sau đó push code của lần commit trước lên, sau đó đưa HEAD quay về lại lần commit muốn xóa.

$ git reset --hard HEAD@{1}

$ git push -f origin master

$ git reset --hard HEAD@{1}

Chú ý: bạn cần phải chắc rằng không ai đang pull code lỗi của bạn hoặc đang cố gắng commit tiếp theo sau lần commit lỗi của bạn, vì bạn sẽ xóa nó. Đây là một việc làm khá nguy hiểm nên cần cân nhắc kỹ lưỡng trước khi thực hiện.

Còn nữa mà giờ mỏi tay quá, thôi lần sau viết thêm bài khác.

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s