hướng dẫn sử dụng git

Hướng dẫn sử dụng Git – Các lệnh Git cơ bản cho dev mới

Học Git có dễ như Github không? Aptech chắc chắn là có vì với bài viết hướng dẫn sử dụng Git này, bạn sẽ được học các khái niệm và thuật ngữ cơ bản của Git. Kết thúc bài này chắc chắn bạn sẽ tự quản lý được phiên bản code của mình ở local bằng giao diện dòng lệnh rất chuyên nghiệp.

Git là gì? Sử dụng cho mục đích gì?

Git ghi lại trạng thái hiện tại của dự án bằng cách tạo một biểu đồ cây từ chỉ mục. Nó thường ở dạng Đồ thị chu kỳ có hướng (Directed Acyclic Graph – DAG). Mục tiêu chính của Git là quản lý một dự án hoặc một tập hợp các tệp khi chúng được người dùng thay đổi theo thời gian. Git lưu trữ thông tin này trong cấu trúc dữ liệu gọi là kho Git. Kho lưu trữ là cốt lõi của Git. Bạn có thể hiểu rằng kho lưu trữ Git là thư mục chứa tất cả các file dự án của bạn và các kiểu dữ liệu khác liên quan.

Git ghi nhận tất cả các thay đổi của dự án (các hành động thêm, xóa, sửa), mỗi khi có bất kỳ sự thay đổi nào Git sẽ tự động ghi vào kho lưu trữ của mình dưới dạng các thông tin theo cây thời gian thời gian đối với mỗi file và đánh dấu cho mỗi thay đổi là một phiên bản. Từ đó bạn có thể quản lý các phiên bản code của mình, có thể chuyển đổi giữa các phiên bản theo nhu cầu.

Bây giờ bạn đã hiểu sử dụng Git nhằm mục đích gì, chúng ta hãy tiếp tục với thao tác làm việc với Git bằng các lệnh phổ biến

Mục tiêu chính của Git

Các thao tác trong Git

Một số thao tác cơ bản trong Git là:

  • Init
  • Add
  • Commit
  • Pull
  • Push

Một số hành động nâng cao trong Git là:

  • Branch
  • Merge
  • Rebase

Trước tiên khi đi vào từng nội dung, chúng ta hãy tìm hiểu về kiến trúc và cách thức hoạt động của kho Git. Hãy xem sơ đồ của Git dưới đây:

Các thao tác trong Git

Sơ đồ Git

Dựa vào các hướng dẫn dưới đây khi sử dụng từng dòng lệnh cơ bản của git và sơ đồ trên tôi sẽ giải thích để bạn có thể nắm được nguyên lý hoạt động cơ bản của Git. Nhưng trước hết, bạn cần cài đặt Git trên hệ thống của mình trước. Nếu bạn cần hướng dẫn với việc cài đặt, để xem lại kiến thức bài trước nha.

Trong hướng dẫn sử dụng Git này, để làm quen với các dòng lệnh tôi sẽ chỉ cho bạn làm việc với Git Bash. Git Bash là giao diện dòng lệnh (CLI) chỉ có văn bản để sử dụng Git trên Windows, cung cấp các tính năng để chạy các tập lệnh tự động. Sau khi cài đặt Git trong hệ thống Windows của bạn, chỉ cần mở thư mục của bạn nơi mà bạn muốn lưu trữ tất cả các tệp dự án của mình; nhấp chuột phải và chọn ‘Git Bash here ‘.

Điều này sẽ mở ra một cửa sổ dòng lệnh Git Bash nơi bạn có thể nhập các lệnh bắt đầu từ dấu $ để thực hiện các hoạt động Git khác nhau.

Bây giờ, nhiệm vụ tiếp theo là khởi tạo kho lưu trữ của bạn.

Sơ đồ Git

Các lệnh trong Git

Lệnh Git Init

Git init tạo một kho Git trống hoặc khởi tạo lại một kho hiện có. Về cơ bản, nó tạo ra một thư mục .git với các thư mục con và các tệp mẫu. Chạy lệnh git init trong kho lưu trữ hiện tại sẽ không ghi đè lên những thứ đã có. Bây giờ để khởi tạo kho lưu trữ, bạn hãy gõ dòng lệnh tại cửa sổ Git bash vừa được mở ở trên: git init

Khi kết thúc dòng lệnh kho lưu trữ của bạn đã được khởi tạo, việc tiếp theo chúng ta hãy tạo một số tệp trong thư mục / kho lưu trữ. Ví dụ: tôi đã tạo hai tệp văn bản là aptechbmt-1.txt và aptechbmt-2.txt bằng cách sử dụng lệnh touch sau đó liệt kê danh sách các tệp trong thư mục hiện hành bằng lệnh dir

Bây giờ hãy xem liệu các tệp này đã có trong chỉ mục của tôi hay không bằng cách sử dụng lệnh git status . Chỉ mục ở đây là gì? Chỉ mục giữ một ảnh chụp nhanh “snapshot” nội dung của cây / thư mục làm việc và ảnh chụp nhanh này được lấy làm nội dung cho phiên bản tiếp theo được thực hiện trong kho lưu trữ cục bộ. Để dễ hình dung, sau khi khởi tạo kho lưu trữ git, phiên bản đầu tiên của chúng ta chưa có gì đúng không? Khi chúng ta thêm 2 tập tin mới như trên, nghĩa là kho lưu trữ của chúng ta đã có sự thay đổi. Do đó phiên bản thứ 2 sẽ chứa ảnh chụp nội dung thay đổi (thêm 2 file mới) đó. ^^

Lệnh Git Status

Lệnh git status liệt kê tất cả các tệp đã bị sửa đổi, sẵn sàng để thêm vào kho lưu trữ cục bộ. Bạn hãy thử gõ: git status

Kết quả cho thấy kho lưu trữ của tôi hiện có hai tệp chưa được thêm vào để lập chỉ mục nội dung. Điều này có nghĩa là tôi không thể cam kết “commit” các thay đổi với các tệp này.

Lệnh Git Add

Lệnh này giúp chúng ta cập nhật chỉ mục nội dung bằng cách sử dụng nội dung hiện tại được tìm thấy trong thư mục làm việc hiện hành “working directory” để lập chỉ mục nội dung mới, và sau đó sẵn sàng chuyển chỉ mục nội dung được lập này sang một khu vực khác được tổ chức cho lần cam kết “commit” tiếp theo gọi là “staging area”.

Quay trở lại sơ đồ mô tả quy trình làm việc của Git, rõ ràng là trước khi chúng ta thực hiện commit, thì nội dung chỉ mục của sự thay đổi trong kho được lưu trữ và luân chuyển từ khu vực working directory sang khu vực stagging area.

Như vậy, sau khi bạn thực hiện thay đổi bất kỳ đối với thư mục làm việc working directory và trước khi chạy lệnh cam kết “commit”, bạn phải sử dụng lệnh add nhằm thêm file và lập chỉ mục nội dung thay đổi cho nó để tiếp tục chuyển sang lưu trữ tại stagging area chuẩn bị sẵn sàng cho commit. Để thực hiện hãy sử dụng các lệnh dưới đây:

git add <đường dẫn thư mục> hoặc là git add <đường dẫn file>

Hãy để tôi chứng minh lệnh git add cho bạn để bạn có thể hiểu nó tốt hơn. Tôi sẽ lập chỉ mục nội dung thay đổi của kho cho các tập tin bằng lệnh git add -A . Lệnh này sẽ thêm tất cả các tệp vào chỉ mục trong thư mục nhưng chưa được cập nhật trong chỉ mục.

Bây giờ các tệp mới được thêm vào và lập chỉ mục nội dung, bạn đã sẵn sàng để commit chúng.

Lệnh Git Commit

Lệnh này được hiểu như là việc ghi lại các ảnh chụp nhanh “snapshot” của kho lưu trữ tại một thời điểm nhất định. Ảnh chụp nhanh đã được commit sẽ không bao giờ thay đổi trừ khi chúng ta có sự thay đổi trong kho lưu trữ một cách rõ ràng.

Ở đây, C1 là commit ban đầu, tức là ảnh chụp nhanh của thay đổi đầu tiên mà từ đó một ảnh chụp nhanh khác được tạo với các thay đổi có tên là C2. Lưu ý rằng bản gốc master (Head) sẽ trỏ đến commit mới nhất.

Bây giờ, khi tôi cam kết một lần nữa, một ảnh chụp nhanh C3 khác được tạo và bây giờ, bản gốc trỏ đến C3 thay vì C2.

Git nhằm mục đích giữ cho cam kết càng nhẹ càng tốt. Vì vậy, nó không sao chép một cách mù quáng toàn bộ thư mục mỗi khi bạn commit; nó lưu trữ bao gồm các commit như một tập hợp các thay đổi hoặc nó chuyển phiên bản của kho lưu trữ từ phiên bản này sang phiên bản khác mới hơn. Nói một cách dễ hiểu, nó chỉ sao chép những thay đổi được thực hiện trong kho lưu trữ. Bạn có thể commit bằng cách sử dụng lệnh dưới đây:

git commit

Hoặc bạn có thể sử dụng:

git commit -m <nội dung thông điệp cần lưu trữ>

Thử xem sao nhé

Như bạn có thể thấy ở trên, lệnh git commit đã cam kết các thay đổi trong hai tệp trong kho lưu trữ cục bộ.

Bây giờ, nếu bạn muốn thực hiện một commit ảnh chụp nhanh tất cả các thay đổi trong thư mục làm việc cùng một lúc, bạn có thể sử dụng lệnh dưới đây:

git commit -a

Bây giờ tôi sẽ tạo thêm hai tệp văn bản trong thư mục làm việc của tôi là aptechbmt-3.txt và aptechbmt-4.txt và chỉnh sửa một chút đối với file aptechbmt-1.txt bằng cách thêm nội dung cho nó.

Lưu ý: tất cả các file này đều chưa được thêm vào để lập chỉ mục nội dung.

Tôi sẽ thêm file aptechbmt-3.txt bằng lệnh:

git add aptechbmt-3.txt

Lúc này tôi chỉ thêm aptechbmt-3.txt vào chỉ mục còn aptechbmt-4.txt thì không. Bây giờ, tôi muốn commit tất cả các thay đổi trong thư mục cùng một lúc.

Lệnh này sẽ commit một ảnh chụp nhanh về tất cả các thay đổi trong thư mục làm việc nhưng chỉ bao gồm các sửa đổi đối với các tệp được theo dõi, tức là các tệp đã được thêm bằng git add tại một số điểm trong lịch sử của chúng. Do đó, aptechbmt-4.txt không được commit vì nó chưa được thêm vào chỉ mục. Nhưng những thay đổi trong tất cả các tệp trước đó trong kho lưu trữ đã được cam kết. Ví dụ: aptechbmt-1.txt, aptechbmt-2txt, aptechbmt-3.txt. Bây giờ tôi đã thực hiện các commit mong muốn của mình trong kho lưu trữ cục bộ của tôi.

Lưu ý rằng trước khi bạn tác động đối với kho lưu trữ trung tâm bằng cách thực hiện các thay đổi trong kho lưu trữ, bạn phải luôn luôn nhớ rằng nên thay đổi từ kho lưu trữ trung tâm sang kho lưu trữ cục bộ của mình trước, để kho lưu trữ cục bộ của mình được cập nhật mới nhất với kho lưu trữ cộng tác viên khác đã đóng góp trong kho lưu trữ trung tâm. Để luôn cập nhật kho lưu trữ cục bộ của mình từ kho lưu trữ trung tâm (ở đây là kho lưu trữ Git Hub) tôi sẽ sử dụng lệnh pull .

Các lệnh trong Git

Lệnh Pull

Lệnh git pull tìm nạp các thay đổi từ kho lưu trữ từ xa sang kho lưu trữ cục bộ. Nó hợp nhất các thay đổi ở nguồn trong kho lưu trữ cục bộ của bạn, đây là một nhiệm vụ phổ biến trong việc cộng tác dựa trên Git.

Để làm được điều này, trước tiên bạn cần đặt kho lưu trữ trung tâm của mình làm gốc “origin” hay có thể hiểu là thiết lập kết nối giữa kho lưu trữ từ xa và kho lưu trữ cục bộ bằng lệnh:

git remote add origin <đường dẫn liên kết đến kho lưu trữ trung tâm của bạn>

Trong đó để có đường dẫn liên kết đến kho lưu trữ trung tâm thì trên GitHub bạn phải tạo cho mình một kho lưu trữ (Cách tạo xem lại bài này nhé).

Đầu tiên tôi sử dụng lệnh git remote -v để kiểm tra xem mình đã cấu hình tới các máy chủ từ xa nào, nó sẽ liệt kê tên của mỗi máy chủ từ xa kèm theo đường dẫn. Nếu bạn đã thực hiện sao chép từ một kho chứa có sẵn về kho lưu trữ cục bộ của mình, thì ít nhất bạn sẽ thấy bản gốc (origin) – đây là tên gọi mặc định mà Git đặt cho phiên bản trên máy chủ mà bạn đã sao chép từ đó bạn có thể đặt tên khác cho nó để dễ nhớ hơn.

Ở ví dụ này, trước đây tôi chưa từng thực hiện việc kết nối tới một kho lưu trữ từ xa nào, nên để thực hiện thì việc đầu tiên tôi phải thiết lập kết nối với kho lưu trữ từ xa bằng lệnh git remote add

Sau khi đã làm xong các bước chuẩn bị, bây giờ chỉ việc sử dụng dòng lệnh sau:

git pull origin master

Lệnh này sẽ sao chép tất cả các tệp từ nhánh chính master của kho lưu trữ từ xa vào kho lưu trữ cục bộ của bạn.

Việc này sẽ hoàn toàn diễn ra suôn sẻ nếu kho lưu trữ cục bộ của bạn và kho lưu trữ từ xa có lịch sử cam kết khớp nhau. Còn trong trường hợp này Git báo lỗi “fatal: refusing to merge unrelated histories” . Để tôi giải thích lỗi này cho bạn hiểu: Lỗi này thường xảy ra do 2 nguyên nhân:

  • Một là, bạn đã sao chép một dự án và bằng cách nào đó, thư mục .git đã bị xóa hoặc bị hỏng. Điều này dẫn đến việc Git không biết về lịch sử commit tại kho cục bộ của bạn và do đó sẽ khiến gây ra lỗi này khi bạn cố gắng đẩy hoặc kéo từ kho lưu trữ từ xa.
  • Hai là, bạn đã tạo một kho lưu trữ mới và đã thêm một vài commit (từ đầu bài đến giờ ^^ mình thêm khá khá rồi nhỉ) và bây giờ bạn đang cố gắng lấy từ một kho lưu trữ từ xa đã có một số commit của riêng nó. Git cũng sẽ đưa ra lỗi trong trường hợp này, vì nó không biết hai dự án có liên quan như thế nào. Đây là trường hợp trong ví dụ này. Để khắc phục, rất đơn giản, bạn chỉ cần gõ lại lệnh sau:

git pull origin master –allow-unrellated-histories

Lệnh này được hiểu như chúng ta sẽ hợp nhất tất cả các commit trên kho lưu trữ từ xa về kho lưu trữ cục bộ một cách bắt buộc (Nhiều khi ép mới chịu làm ^^) và mặc định Git sẽ tạo ra một commit thông báo về việc hợp nhất này, nên sau khi bạn kết thúc dòng lệnh trên Git sẽ hiển thị cửa sổ cho phép chúng ta chỉnh sửa nội dung commit.

Sử dụng lệnh git log –oneline để xem nhanh lịch sử commit trên máy tính cục bộ đã thay đổi thế nào

Như bạn thấy, các commit của kho lưu trữ từ xa đều được ghép vào kho lưu trữ cục bộ của mình. Trong đó, có 1 commit trên cùng “Merge branch ‘master’ … ” được tạo thêm. Ngoài ra, bạn có thể kiểm tra lại ngoài Windows Explorer để thấy các file trên kho lưu trữ từ xa cũng sẽ được tải về lưu trữ tại máy tính nhé.

Lưu ý: Bạn chỉ thực hiện điều này, khi thực sự hiểu rõ về lịch sử commit của 2 kho lưu trữ nhé. Ngoài ra, chúng ta cũng có thể thử kéo các tệp từ một nhánh khác bằng lệnh sau:

git pull origin <tên nhánh cần pull>

Như vậy, chúng ta vừa lấy các nội dung từ kho lưu trữ từ xa về thành công. Vậy làm cách nào để đẩy ngược lại dự án của mình ở cục bộ lên kho lưu trữ từ xa? Hãy tiếp tục bằng cách sử dụng lệnh Push dưới đây.

Lệnh push

Lệnh này chuyển commit từ kho lưu trữ cục bộ của bạn sang kho lưu trữ từ xa. Nó là đối nghịch của lệnh pull.

Pull là để kéo các cam kết vào kho lưu trữ cục bộ trong khi Push là đẩy các cam kết vào kho lưu trữ từ xa.

Việc sử dụng git push là để xuất bản các thay đổi cục bộ của bạn lên một kho lưu trữ từ xa. Sau khi bạn tích lũy được một số cam kết cục bộ và sẵn sàng chia sẻ chúng với các thành viên còn lại trong nhóm, bạn có thể đẩy chúng vào kho lưu trữ từ xa bằng cách sử dụng lệnh sau:

git push <tên remote>

Lưu ý : Điều khiển từ xa này đề cập đến kho lưu trữ từ xa đã được cấu hình ở trên trước khi sử dụng lệnh pull.

Tôi sẽ sử dụng lệnh git push origin master để đẩy kho lưu trữ cục bộ này lên nhánh master của kho lưu trữ từ xa của tôi. Khi kết thúc dòng lệnh trên, Git sẽ xuất hiện cửa sổ thông báo bạn phải đăng nhập vào tài khoản Git Hub nếu như bạn chưa từng đăng nhập trước đây. Tài khoản này phải là chủ sở hữu kho lưu trữ từ xa hoặc phải được cấp quyền truy cập kho lưu trữ.

Lỗi này xảy ra khi quyền truy cập kho lưu trữ từ xa của bạn chưa được cấp do tài khoản đang sử dụng không được truy cập vào kho lưu trữ này. Để khắc phục bạn nên đăng nhập lại bằng cách, truy cập vào Control PanelAll Control Panel ItemsCredential Manager tại tab Windows Credential tìm tài khoản GitHub đã được lưu trước đây và xóa nó đi. Sau đó chạy lại lệnh git push,tiến hành làm theo hướng dẫn sử dụng Git bên trên là được.

Sau khi thực hiện lệnh git push thì các thay đổi từ kho lưu trữ cục bộ sang kho lưu trữ từ xa cùng với tất cả các commit cần thiết và các đối tượng bên trong. Điều này tạo ra một nhánh cục bộ trong kho đích. Bây giờ hãy kiểm tra trên kho lưu trữ từ có gì nhé!

Như vậy, file aptechbmt-4.txt ở dưới kho lưu trữ cục bộ sẽ không được đẩy lên kho lưu trữ từ xa vì nó chưa được thêm vào để lập chỉ mục nội dung bằng git add. Các file và lịch sử commit đều đã được đẩy lên thành công.

Để ngăn việc ghi đè, Git không cho phép push khi kết quả là hợp nhất chuyển tiếp không nhanh trong kho đích.

Lưu ý : Hợp nhất chuyển tiếp không nhanh có nghĩa là hợp nhất ngược dòng tức là hợp nhất với các nhánh tổ tiên hoặc các nhánh cha từ một nhánh con.

Để kích hoạt hợp nhất như vậy, sử dụng lệnh dưới đây:

git push <tên remote> -force

Lệnh trên buộc phải push ngay cả khi nó dẫn đến kết hợp chuyển tiếp không nhanh.

Đến đây, với các lệnh cơ bản của Git chắc các bạn cũng đã hình dung được quy trình làm việc của git và github theo sơ đồ ở đầu bài này. Bây giờ, chúng ta hãy tiếp tục thực hiện các hành động nâng cao hơn.

Các lệnh nâng cao trong Git

Git branch

Các nhánh trong Git không có gì ngoài con trỏ đến một cam kết cụ thể. Git thường thích giữ các nhánh của nó càng nhẹ càng tốt. Về cơ bản có hai loại là local branches và remote tracking branches.

Local branch (nhánh cục bộ) chỉ là một nhánh rẽ khác trên cây làm việc của bạn. Mặt khác, các remote tracking branches (nhánh theo dõi từ xa) có các mục đích đặc biệt. Một số trong số chúng là:

  • Chúng liên kết công việc của bạn từ kho lưu trữ cục bộ với công việc trên kho lưu trữ từ xa.
  • Chúng tự động phát hiện các nhánh từ xa để nhận thay đổi, khi bạn sử dụng git pull .

Bạn có thể kiểm tra nhánh hiện tại của bạn bằng cách sử dụng lệnh:

git branch

Một câu thần chú mà bạn nên luôn luôn tụng trong khi phân nhánh ^^

Để tạo một nhánh mới, tôi sử dụng lệnh sau:

git branch <tên chi nhánh>

Sơ đồ dưới đây cho thấy quy trình làm việc khi một nhánh mới được tạo. Khi chúng ta tạo một nhánh mới, nó sẽ bắt nguồn từ nhánh chính. Ghi chú: dấu * để chỉ Head đang trỏ tới commit tương ứng của nhánh đó, trên sơ đồ Head của nhánh master đang trở tới commit C2, khi tạo nhánh newBranch thì Head của 2 nhánh master và newBranch đều trỏ đến commit C3

Việc tạo nhánh sẽ giúp bạn phân chia và quản lý công việc được dễ dàng hơn. Thay vì, phải tạo một kho lưu trữ mới để phát triển một tính năng mới cho dự án đã có thì bạn có thể phân nhánh ngay trong kho lưu trữ dự án để thực hiện công việc này mà không ảnh hưởng gì tới nhánh chính master.

Bây giờ, chúng ta hãy xem làm thế nào để commit khi sử dụng các nhánh.

Sự phân nhánh bao gồm một cam kết cụ thể cùng với tất cả các cam kết cha. Như bạn có thể thấy trong sơ đồ trên, newBranch đã tách ra khỏi bản gốc và do đó sẽ tạo ra một đường dẫn khác.

git checkout <tên nhánh>
Lệnh này giúp chuyển đổi sang một nhánh khác, mặc định chúng ta đang ở master. Ở đây, tôi đã tạo ra một chi nhánh mới có tên là aptechbmtdev, và chuyển sang nhánh mới bằng cách sử dụng lệnh git checkout.

Một phím tắt cho các lệnh trên là:

git checkout -b <tên nhánh>

Lệnh này sẽ tạo ra một nhánh mới và chuyển sang nhánh đó cùng một lúc. Tuy nhiên tại phiên bản tôi đang sử dụng là git version 2.24.0.windows.2 thì lệnh này không hoạt động nhé T T. Hình ảnh dưới đây mô tả quá trình tạo branch và checkout branch, hãy để ý các ô màu đỏ và trắng để nhận ra sự khác biệt nhé.

Bây giờ trong khi chúng ta đang ở trong nhánh aptechbmtdev, hãy commit tệp văn bản aptechbmt-4.txt bằng các lệnh sau:

git add aptechbmt-4.txtgit commit -m “Thêm aptechbmt-4.txt”

Kiểm tra lịch sử commit bằng lệnh dưới để xem kết quả:

git log –all –oneline

Nhìn ảnh trên, bạn sẽ thấy mình đang ở branch aptechbmtdev để kiểm tra lịch sử commit, con trỏ Head (hiểu nôm na là ngọn ^^) của nhánh này đang trỏ tới commit cuối cùng của nhánh.

Hình ảnh trên mô tả quá trình checkout qua lại giữa các branch, tương ứng phần hiển thị bên tay trái là thư mục làm việc cũng có sự thay đổi về số lượng file.

Công việc tiếp theo của chúng ta là Push thay đổi vừa rồi lên kho lưu trữ từ xa. Đơn giản bằng cách thực hiện lệnh

git push origin aptechbmtdev

Lệnh này sẽ đẩy toàn bộ nhánh aptechbmtdev (bao gồm các file và commit của nhánh) lên kho lưu trữ từ xa mà chúng ta đã thực hiện bên trên.

Bạn hãy kiểm tra lại trên kho lưu trữ của mình đã có thêm file aptechbmt-4.txt và commit của nó không nhé!

Hướng dẫn các hoạt động nâng cao với Git

Git merge

Hợp nhất “Merge” là cách kết hợp công việc của các nhánh khác nhau lại với nhau. Điều này sẽ cho phép chúng ta phân nhánh, phát triển một tính năng mới và sau đó kết hợp lại với nhánh gốc.

Biểu đồ trên cho chúng ta thấy hai nhánh khác nhau giữa newBranch và master. Bây giờ, khi chúng ta hợp nhất công việc của nhánh newBranch (C3) sang nhánh master (C1,C2,C4) nó sao chép tất cả công việc (commit) của newBranch vào master (C1,C2,C3,C4) và tạo ra một commit mới (C5) trên cùng cây. Lúc này, con trỏ Head Master sẽ trỏ đến C5. Câu lệnh hợp nhất 2 nhánh như sau:

git merge <tên nhánh cần hợp nhất vào>

Lưu ý: Bạn phải checkout nhánh đích (là nhánh mà bạn muốn hợp nhất vào) như sơ đồ trên khi hợp nhất newBranch vào master bạn phải checkout master.

Bây giờ, chúng ta hãy hợp nhất tất cả các công việc của nhánh aptechbmtdev vào nhánh master. Vì vậy, trước tiên tôi sẽ kiểm tra nhánh master bằng lệnh git checkout master và hợp nhất với aptechbmtdev với lệnh git merge aptechbmtdev

git checkout mastergit merge aptechbmtdev

Sử dụng lệnh git log –oneline –all để kiểm tra lịch sử commit

Như bạn có thể thấy ở trên, tất cả dữ liệu từ nhánh aptechbmtdev được hợp nhất với nhánh master. Bây giờ, tệp văn bản aptechbmt-4.txt đã được thêm vào nhánh master.

Lệnh Rebase

Đây cũng là một cách kết hợp công việc giữa các nhánh khác nhau. Rebasing tạo một tập hợp các cam kết, sao chép chúng và lưu trữ chúng vào phía sau commit mới nhất trên nhánh đích như biểu đồ bên dưới. Ưu điểm của rebasing là nó có thể được sử dụng để tạo các chuỗi commit có trình tự.

Bây giờ, các commit từ newBranch được đặt ngay sau nhánh chính và chúng ta có một chuỗi các cam kết tuyến tính nhìn đẹp hơn ^^ là merge.

Bây giờ, để rebase master, hãy gõ lệnh bên dưới trong Git Bash của bạn:

git rebase master

Lệnh này sẽ chuyển tất cả commit từ nhánh hiện tại sang nhánh master. Chúng trông như thể được phát triển một cách tuần tự, nhưng thực tế chúng lại được phát triển song song.

Ví dụ: Trên dự án sẵn có của chúng ta, tôi tạo thêm một nhánh aptechbmthotfix và thực hiện một vài commit cho nó.

git branch aptechbmthotfixgit checkout aptechbmthotfixtouch aptechbmt-5.txtgit add aptechbmt-5.txtgit commit -m “Thêm file aptechbmt-5.txt”

Tiếp tục tôi lại checkout master và tạo mới 1 commit cho master. Mục đích là để trên nhánh master này có một commit mới hơn trên nhánh aptechbmthotfix

git checkout mastertouch aptechbmt-6.txtgit add aptechbmt-6.txtgit commit -m “Thêm file aptechbmt-6.txt”

Sau khi thực hiện các lệnh trên tôi sử dụng lệnh git log để kiểm tra lịch sử commit (dạng cây) bao gồm tất cả các branch từ đầu đến giờ. Lưu ý: Head sẽ trỏ đến commit mới nhất của nhánh hiện tại bạn đang checkout.

git log –oneline –graph –color –decorate –all

Bạn để ý hiện tại commit của nhánh master có số hiệu d739a1c đang đúng trên cùng và commit của nhánh aptechbmthotfix có số hiệu 4e5b0a0 đang ở ngay bên dưới. Bây giờ, tôi sẽ checkout aptechbmthotfix và thực hiện rebase master bằng lệnh:

git rebase master

Kết quả sau khi rebase

Bạn sẽ thấy rằng sau khi rebase commit của nhánh aptechbmthotfix có số hiệu 4e5b0a0 lúc đầu đã được git đổi sang số hiệu khác là e5dec9e và đặt nó ngay trên commit của nhánh master có số hiệu d739a1c.

Tổng kết lại

Để hợp nhất các nhánh chúng ta có thể sử dụng Rebase và Merge đều được. Điểm khác nhau dễ thấy nhất của Rebase và Merge là trình tự sắp xếp các commit vào nhánh đích. Đối với Rebase nó sẽ tạo ra phiên bản commit mới (được sao chép từ commit của nhánh nguồn) và hợp nhất vào sau commit cuối cùng của nhánh đích. Còn đối với Merge thì nó sẽ giữ nguyên các commit của nguồn và hợp nhất vào nhánh đích theo trình tự thời gian commit chung của kho.

Hướng dẫn Git – Mẹo và thủ thuật

Bây giờ bạn đã trải qua tất cả các hoạt động trong bài viết Hướng dẫn sử dụng Git này, đây là một số mẹo và thủ thuật bạn nên biết.

Lưu trữ kho lưu trữ của bạn

git archive master | gzip > <tên file>.tgz

Nó lưu trữ tất cả các file và dữ liệu trong một file gzip chứ không phải là thư mục .git .

Lưu ý: điều này đơn giản chỉ tạo ra một phiên bản sao lưu của kho lưu trữ và nó hoàn toàn bỏ qua việc kểm soát phiên bản. Bạn làm điều này khi bạn muốn gửi các file cho khách hàng không cài đặt Git trong máy tính của họ để xem xét.

Hướng dẫn Git - Mẹo và thủ thuật

Gói kho của bạn

Nó sẽ biến một kho lưu trữ thành một tập tin duy nhất.

Sử dụng lệnh sau:

git bundle create <tên file>.bundle master

Điều này đẩy nhánh master đến một nhánh từ xa, chỉ được chứa trong một tệp thay vì một kho lưu trữ.

Một cách khác để làm điều đó là:

cd <đường dẫn>git clone repo.bundle repo-copy -b mastercd repo-copygit logcd.. /my-git-repo

Git stash – không thực hiện commit ngay

Khi chúng ta muốn hoàn tác tạm thời việc thêm một tính năng hoặc bất kỳ loại dữ liệu được thêm nào, chúng ta có thể tạm thời bỏ qua chúng.

Sử dụng lệnh dưới đây:

git statusgit stashgit status

Và khi bạn muốn áp dụng lại các thay đổi mà bạn sử dụng, hãy sử dụng lệnh bên dưới:

git stash apply

Bài viết khá dài và tôi hy vọng bạn đã thích bài viết hướng dẫn sử dụng Git này và học các lệnh và thao tác trong Git. Hãy cho tôi biết nếu bạn muốn biết thêm về Git trong phần bình luận bên dưới.

Arguments Java

Tìm hiểu cách sử dụng đối số của Java bằng các ví dụ cụ thể

Ngôn ngữ lập trình Java rất linh hoạt ở mọi khía cạnh, độc lập với nền tảng, nó làm cho Java trở thành “kẻ chiến thắng” với bất kỳ ngôn ngữ đối thủ nào. Tìm hiểu xem cách truyền các đối số trong chương trình java bằng cách sử dụng các đối số dòng lệnh như thế nào. Tiếp tục với series hướng dẫn học Java của Aptech, trong bài viết này, bạn sẽ tìm hiểu cách bạn có thể sử dụng các đối số dòng lệnh Arguments Java.

Đối số ‘Arguments’ dòng lệnh Java là gì?

Các đối số dòng lệnh được truyền cho chương trình vào thời gian chạy. Truyền các đối số dòng lệnh trong một chương trình Java khá dễ dàng. Chúng được lưu trữ dưới dạng các chuỗi trong mảng String được truyền cho tham số args của phương thức main () trong Java. Ta có ví dụ sau:

public class Example0 { public static void main(String[] args) { System.out.println(“Khoa hoc ” + args[0] + ” tai Aptech Buon Ma Thuot”); System.exit(0); }}

Để biên dịch và chạy chương trình java trong dấu nhắc lệnh, hãy làm theo các bước được viết dưới đây.

  • Lưu chương trình của bạn trong một tệp có phần mở rộng .java
  • Mở dấu nhắc lệnh và đi đến thư mục lưu tập tin của bạn.
  • Chạy lệnh: javac filename.java
  • Sau khi biên dịch chạy lệnh: java filename
  • Hãy chắc chắn rằng đường dẫn Java được đặt chính xác.

Đối số 'Arguments' dòng lệnh Java là gì?

Các ví dụ khi sử dụng đối số arguments Java

Dưới đây là một vài ví dụ để cho thấy cách chúng ta có thể sử dụng các đối số dòng lệnh trong một chương trình Java.

Mỗi lớp Number như Integer, Float, Double, v.v đều có các phương thức parse’XXX’ chuyển đổi kiểu chuỗi String thành đối tượng tương ứng của loại của chúng. Ví dụ như: trong lớp interger có phương thức parseInt

Như chúng ta đều biết rằng mảng ‘array’ bắt đầu chỉ mục của nó bằng không. Do đó, args [0] là chỉ mục đầu tiên trong mảng String [] được lấy từ bàn điều khiển. Tương tự, args [1] là thứ hai, args [2] là phần tử thứ ba,…args[n] là phần thứ thứ n.

Khi một ứng dụng được khởi chạy, hệ thống sẽ thực thi lệnh ‘run-time’ chuyển các đối số dòng lệnh đến phương thức main() của ứng dụng thông qua một mảng chuỗi String.

Tính giai thừa của một số sử dụng đối số dòng lệnh trong java

public class Example1 { public static void main(String[] args) { int a, b = 1; //Chuyển đổi đối số đầu vào kiểu chuỗi sang một giá trị kiểu số int n = Integer.parseInt(args[0]); for (a = 1; a <= n; a++) { b = b * a; } System.out.println(“Giai thua cua ” + n + ” la:” + b); System.exit(0); }}

Công thức tính giai thừa của 5 là 1 * 2 * 3 * 4 * 5 = 120. Kết quả: 5! = 120.

Tính tổng hai số bằng cách sử dụng đối số dòng lệnh trong Java

public class Example2 { public static void main(String[] args) { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int sum = a + b; System.out.println(“Tong cua ” + a + ” va ” + b + ” la: ” + sum); System.exit(0); }}

Các ví dụ khi sử dụng đối số arguments Java

Chương trình xuất dãy số Fibonacci sử dụng đối số dòng lệnh

Dãy Fibonacci được biết đến là dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1 hoặc 1 và 1, sau đó  các phần tử này được thiết lập theo quy tắc giá trị của nó bằng tổng giá trị của hai phần tử trước nó. Ví dụ:

|0 |1 |1=1+0 |2 =1+1 |3=2+1=> 0 1 1 2 3 5 8 13 21 34

Chương trình tham khảo:

public class Example3 { public static void main(String[] args) { int n = Integer.parseInt(args[0]); int t1 = 0; int t2 = 1; for (int i = 1; i <= n; i++) { System.out.print(t1 + ” “); int sum = t1 + t2; t1 = t2; t2 = sum; } }}

Những điểm quan trọng cần nhớ

  • Trong khi khởi chạy ứng dụng của bạn, bạn có thể sử dụng các đối số dòng lệnh để chỉ định thông tin cấu hình.
  • Khi bạn đang sử dụng đối số dòng lệnh, không có giới hạn về số lượng đối số. Bạn có thể sử dụng nhiều như yêu cầu của bạn.
  • Thông tin trong các đối số dòng lệnh được truyền dưới dạng Chuỗi .
  • Các đối số dòng lệnh được lưu trữ trong các đối số String của phương thức main() của chương trình.

Những điểm quan trọng cần nhớ

Như vậy chúng ta đã tìm hiểu về các đối số dòng lệnh Arguments Java với các ví dụ. Tôi hy vọng bạn đã hiểu tất cả những gì đã được chia sẻ với bạn trong bài này. Hẹn gặp lại các bạn trong phần hướng dẫn học Java tiếp theo!

Modifiers trong Java

Modifiers trong Java là gì Cách thức truy cập Access Modifiers

“Modifier” là một từ hoặc cụm từ hoặc mệnh đề mô tả, thay đổi hoặc sửa đổi nghĩa của một từ hoặc cụm từ khác theo một cách nào đó. Trong Java, modifier được hiểu là một công cụ sửa đổi truy cập ‘Access modifierS’, có nghĩa là nó được sử dụng để đặt mức truy cập cho các lớp, thuộc tính, phương thức và hàm tạo. Trong bài này, Aptech Vietnam sẽ giúp bạn hiểu tầm quan trọng của Access Modifiers trong Java chi tiết nhất.

Công cụ sửa đổi truy cập Access Modifiers trong Java là gì?

Bạn có thể bắt gặp các từ khóa công khai Public , riêng tư Private và được bảo vệ trong khi thực hành bất kỳ chương trình Java nào, chúng được gọi là Công cụ sửa đổi truy cập. Như tên cho thấy, Bộ sửa đổi truy cập trong Java giúp hạn chế phạm vi của một lớp, hàm tạo, biến, phương thức hoặc thành viên dữ liệu.

Bộ sửa đổi truy cập có thể được chỉ định riêng cho một lớp, trường, phương thức và hàm tạo. Chúng cũng được gọi là các bộ xác định truy cập trong Java , nhưng tên chính xác là các bộ sửa đổi truy cập Java .

Vì vậy, chúng ta hãy đi sâu vào các loại Công cụ sửa đổi truy cập khác nhau trong Java.

Công cụ sửa đổi truy cập Access Modifiers trong Java là gì?

Các loại sửa đổi truy cập Access Modifiers trong Java

Bạn hãy nhớ 4 kiểu sửa đổi truy cập trong Java sau đây:

  • Default Access Modifier – Công cụ sửa đổi truy cập mặc định
  • Private Access Modifier – Công cụ sửa đổi truy cập riêng tư
  • Public Access Modifier – Công cụ sửa đổi truy cập công cộng
  • Protected Access Modifier – Bảo vệ truy cập sửa đổi

Công cụ sửa đổi truy cập mặc định Default Access Modifier

Khi không có công cụ sửa đổi truy cập nào được chỉ định cho một lớp, phương thức hoặc thành viên dữ liệu cụ thể, nó được cho là có công cụ sửa đổi truy cập mặc định .

Các thành viên, lớp hoặc phương thức không được khai báo sử dụng bất kỳ công cụ sửa đổi nào, sẽ có công cụ sửa đổi mặc định chỉ có thể truy cập được trong một gói package tương tự. Điều đó có nghĩa là bạn không khai báo rõ ràng một công cụ sửa đổi truy cập cho một lớp, trường, phương thức, v.v.

package p1;//Class Course có Default access modifier class Course{ void display() { System.out.println(“Hello World!”); }}

Tiếp theo, chúng ta hãy chuyển sang loại tiếp theo, sửa đổi truy cập riêng tư.

Công cụ sửa đổi truy cập mặc định Default Access Modifier

Công cụ sửa đổi truy cập riêng tư Private Access Modifier

Các phương thức hoặc thành viên dữ liệu được khai báo là riêng tư chỉ có thể truy cập được trong lớp mà chúng được khai báo.

Các lớp hoặc giao diện cấp cao nhất không thể được khai báo là riêng tư vì thực tế là:

  • Dấu hiệu riêng tư “chỉ nhìn thấy được ở bên trong lớp kèm theo”
  • Dấu hiệu bảo vệ “chỉ thấy rõ ràng ở bên trong lớp kèm theo và bất kỳ lớp con nào”

Nếu một lớp có được xây dựng riêng tư (nghĩa là thiết lập Private Access Modifier cho class đó) thì bạn không thể tạo đối tượng của lớp đó từ bên ngoài lớp.

Các lớp không thể được đánh dấu bằng công cụ sửa đổi truy cập riêng tư.

Việc biểu thị một lớp với công cụ sửa đổi truy cập riêng tư sẽ ngụ ý rằng không có lớp nào khác có thể nhận được nó. Điều này thường ngụ ý rằng bạn không thể sử dụng lớp bằng bất kỳ sự tưởng tượng nào. Theo cách này, công cụ sửa đổi truy cập riêng không đưa vào các lớp tài khoản.

Lưu ý : Lớp hoặc Giao diện không thể được khai báo là riêng tư.

Cú pháp:

public class Clock { private long time = 0;}

Hãy xem một ví dụ để có ý tưởng rõ ràng về công cụ sửa đổi truy cập riêng tư này.

package p; class A { private void display(){ System.out.println(“Aptech Buôn Ma ThuộtThuột”); } } class B { public static void main(String args[]){ A obj = new A(); //Thử truy cập một lớp được thiết lập Private Access Modifier từ một lớp khác obj.display(); }}

Đầu ra của chương trình này là:

error: display() has private access in Aobj.display();

Hy vọng các bạn rõ ràng với sửa đổi truy cập riêng tư. Tiếp theo, hãy chuyển sang loại tiếp theo, công cụ sửa đổi truy cập công cộng Public Access Modifier.

Công cụ sửa đổi truy cập công cộng Public Access Modifier

  • Công cụ sửa đổi truy cập công cộng được chỉ định bằng cách sử dụng từ khóa công khai “public”.
  • Công cụ sửa đổi truy cập công cộng có phạm vi rộng nhất trong số tất cả các công cụ sửa đổi truy cập khác.
  • Các lớp , phương thức hoặc thành viên dữ liệu được khai báo là công khai có thể truy cập ở mọi nơi trong chương trình, không có giới hạn về phạm vi của các thành viên dữ liệu công cộng.

Cú pháp:

package aptechbmt.co;public class PublicClassDemo {// Ở đây tôi không đề cập đến bất kỳ công cụ sửa đổi nào để nó hoạt động như một công cụ sửa đổi mặc định public int myMethod(int x){ return x; }}

Bây giờ, hãy xem một ví dụ để có ý tưởng rõ ràng về công cụ sửa đổi truy cập công cộng này.

Thí dụ: Tôi có 2 file .java với 2 nội dung bên dưới, sau khi javac tôi chạy file có nội dung thứ 2

package p1;public class A{ public void display() { System.out.println(“Học lập trình tại Aptech Buôn Ma Thuột!”); }}

package p2;import p1.*;class B{ public static void main(String args[]) { A obj = new A; obj.display(); }}

Đầu ra: Học lập trình tại Aptech Buôn Ma Thuột!

Công cụ sửa đổi truy cập công cộng Public Access Modifier

Bảo vệ truy cập sửa đổi Protected Access Modifier

  • Công cụ sửa đổi truy cập được bảo vệ được chỉ định bằng cách sử dụng từ khóa được bảo vệ “Protected”.
  • Các phương thức hoặc thành viên dữ liệu được khai báo là ‘được bảo vệ’ có thể truy cập được trong cùng một gói hoặc các lớp con trong một gói khác nhau.
  • Các thành viên được bảo vệ chỉ có thể được truy cập ở lớp con hoặc các lớp dẫn xuất.

Cú pháp:

package packageFourProtected; public class ProtectedClassFour { protected int myMethod(int a){ return a; }}

Chúng ta hãy xem một ví dụ.

spackage p1;//Class Apublic class A{ protected void display() { System.out.println(“Học lập trình Java tại Aptech Buôn Ma Thuột”); }}

File 2:

package p2;import p1.*; //import tất cả class trong package p1//Class B là subclass củacủa Aclass B extends A |{ public static void main(String args[]) { B obj = new B(); obj.display(); }}

Kết quả: Học lập trình Java tại Aptech Buôn Ma Thuột

Đây là mọi thứ bạn cần biết về các phương thức khác nhau của các công cụ sửa đổi truy cập trong Java.

Sửa đổi truy cập với phương thức ghi đè

Nếu trong trường hợp, bạn đang ghi đè bất kỳ phương thức nào, thì phương thức được ghi đè được khai báo trong lớp con không được hạn chế.

Hãy xem ví dụ dưới đây.

class A{ protected void msg() { System.out.println(“Hello java”); }}public class Simple extends A { void msg() { System.out.println(“Hello java”); } //C.T.Error public static void main(String args[]) { Simple obj=new Simple(); obj.msg(); }}

Công cụ sửa đổi mặc định hạn chế hơn bảo vệ. Đây là lý do tại sao có một lỗi thời gian biên dịch.

Kiểm soát truy cập và kế thừa

  • Nếu trong trường hợp, bạn tạo một lớp con của một số lớp, thì các phương thức trong lớp con đó có thể có các bộ sửa đổi truy cập ít truy cập được gán cho chúng hơn lớp supperclass.
  • Chẳng hạn, nếu một phương thức trong lớp cha là công khai thì nó cũng phải được công khai trong lớp con. Nếu một phương thức trong siêu lớp được bảo vệ, thì nó phải được bảo vệ hoặc công khai trong lớp con được chỉ định.
  • Các phương thức được khai báo là riêng tư không được kế thừa.

Tổng kết

Trên đây là toàn bộ thông tin về Modifiers trong Java mà Aptech Buôn Ma Thuộc đã chia sẻ đến cho bạn. Mong rằng với những thông tin trên bạn đã có thể hiểu rõ về công cụ này và ứng dụng được trong các dự án của mình.

Vim là gì

Vim là gì? Các lệnh thường hay sử dụng nhất trong Vim Editor.

Vim là gì? VIM là viết tắt của VI Improved là trình soạn thảo văn bản dòng lệnh được sử dụng để tạo và xem các tệp văn bản. Trong bài này, bạn sẽ tìm hiểu các mẹo hữu ích trong việc sử dụng trình soạn thảo văn bản vim editor. Một khi bạn thành thạo nó, bạn có thể giải quyết nhiều tác vụ liên quan đến văn bản phức tạp.

Các chế độ của Vim

VIM có hai chế độ: chế độ Insert và chế độ Normal.

  • Chế độ Insert cho phép bạn nhập văn bản vào tệp tương tự như khi sử dụng một trình soạn thảo văn bản thông thường.
  • Chế độ Normal cung cấp khả năng điều hướng và thực hiện các thay đổi văn bản.

Để điều hướng giữa 2 chế độ, sử dụng ký tự ESC hoặc i .

Khi bạn mở một tệp văn bản, bạn sẽ vào chế độ bình thường. Để thay đổi chế độ chèn và bắt đầu nhập hoặc chèn văn bản, hãy nhấn chữ i trên bàn phím của bạn. Để quay lại chế độ chỉ huy, nhấn phím Esc.

Các chế độ của Vim

Chế độ chèn ‘Insert” trong Vim

Chế độ chèn cho phép bạn tương tác với văn bản. Ví dụ: bạn có thể nhập văn bản, xóa văn bản và điều hướng lên xuống, sang trái hoặc phải. Khi bạn đã mở tệp văn bản bằng trình chỉnh sửa vim, bạn đang ở chế độ Command.

Để vào chế độ Insert và bắt đầu chèn văn bản, hãy làm theo lệnh bên dưới.

  • Chèn ‘Insert’ văn bản
  • Nhấn phím i để chèn văn bản tại vị trí con trỏ hiện tại.
  • Nhấn phím a để chèn văn bản một ký tự sau vị trí hiện tại của con trỏ.
  • Nhấn phím A để chèn văn bản ở cuối dòng hiện tại.
  • Nhấn phím o để chèn văn bản trên một dòng mới bên dưới dòng hiện tại.
  • Nhấn phím O để chèn văn bản trên một dòng mới phía trên dòng hiện tại.
  • Xóa ‘Delete’ văn bản
  • Nhấn phím s để xóa chữ hiện tại trên con trỏ và chèn văn bản.
  • Nhấn phím S để xóa dòng hiện tại và chèn văn bản.

Chế độ chèn 'Insert'' trong Vim

Các lệnh trong chế độ Command của VIM

Bây giờ chúng ta hãy nhìn vào chế độ lệnh. Có thể cho rằng, đây là chế độ mà bạn có thể thực hiện hầu hết các thao tác.

Điều hướng (lên / xuống, trái / phải) trong chế độ Command của vim

Để điều hướng lên / xuống, trái / phải sử dụng các phím h , j , k và l .

  • Phím k – Di chuyển con trỏ lên trên một dòng.
  • Phím j – Di chuyển con trỏ xuống một dòng.
  • Phím l – Di chuyển con trỏ sang phải theo một ký tự
  • Phím h – Di chuyển con trỏ sang trái bởi một ký tự

Trong chế độ Command, bạn cũng có thể điều hướng đến đầu và cuối của một dòng / tệp. Hãy đi sâu vào các lệnh để đạt được điều này.

Điều hướng đến đầu và cuối của một dòng / tệp trong chế độ Command của vim

  • Phím ^ – Di chuyển con trỏ đến đầu dòng
  • Phím $ – Di chuyển con trỏ đến cuối dòng
  • Phím 1G – Di chuyển con trỏ đến đầu tập tin.
  • Phím G – Di chuyển con trỏ đến cuối tập tin
  • Phím nG – Di chuyển con trỏ đến đầu số dòng n n n trong tập tin

Cách tìm kiếm và thay thế văn bản trong Vim

Chế độ lệnh cũng cung cấp cho người dùng khả năng tìm kiếm và thay thế văn bản trong một tệp. Để tìm kiếm văn bản trong một tệp, nhấn phím ESC để trở ra chế độ Command và sử dụng lệnh sau:

:/<từ khóa cần tìm>

Ví dụ: :/Linux

Để tìm kiếm ngược trong tệp văn bản, nhấn lại phím ESC và sử dụng ? theo sau bởi cụm từ tìm kiếm, vd

:?<từ khóa cần tìm>

Ví du: :?Linux

Nếu bạn muốn tìm kiếm một chuỗi và thay thế nó bằng một chuỗi khác trong tệp, hãy sử dụng cú pháp

:[range]s/search/replace/

Ví dụ: nếu chúng ta muốn tìm kiếm chuỗi Linuxvà thay thế nó bằng Unix từ Dòng 1 đến Dòng 3 trong mã tệp index.html, lệnh sẽ là:

:1,3 s/Linux/Unix/g

/g đảm bảo tất cả các trường hợp của các chuỗi tìm kiếm được thay thế trong phạm vi chỉ định. Nếu bạn bỏ qua tùy chọn /g, chỉ có phiên bản đầu tiên trong mỗi dòng sẽ được thay thế.

Các lệnh trong chế độ Command của VIM

Cách sao chép và dán văn bản trong Vim

Vim cũng cung cấp cho bạn khả năng sao chép và dán văn bản trong tệp.

Sao chép văn bản

Để sao chép một chuỗi và dán nó vào một vị trí khác trong một tệp theo các bước dưới đây

  • Di chuyển con trỏ đến đầu chuỗi hoặc văn bản
  • Nhập v trên bàn phím của bạn và nhấn con trỏ về phía trước để tô sáng văn bản
  • Khi bạn đã đến cuối văn bản, hãy bấm y viết tắt là yank, để sao chép văn bản
  • Di chuyển con trỏ đến vị trí bạn muốn dán văn bản đã sao chép
  • Nhấn p để dán nội dung được sao chép

Ngoài ra, bạn có thể sử dụng các lệnh bên dưới để sao chép các dòng.

  • y$ – Sao chép văn bản từ vị trí hiện tại đến cuối dòng
  • yy – Sao chép toàn bộ dòng
  • 4yy – Sao chép 4 dòng dưới đây
  • Cắt / xóa văn bản trong Vim
  • Nếu bạn muốn xóa một ký tự trong chế độ lệnh, hãy nhấn phím x
  • Để xóa một từ, đặt con trỏ ở phía trước từ đó và nhấn dw
  • Để xóa văn bản từ từ hiện tại đến cuối dòng nhấn d$
  • Để xóa hoặc cắt toàn bộ dòng nhấn dd

LƯU Ý:

Bạn có thể xóa một số dòng bằng cách đặt trước lệnh dd với một số tự nhiên. Ví dụ: để xóa 3 dòng bao gồm dòng hiện tại, hãy chạy 3dd

Lưu và thoát vim Editor

Dưới đây là những cách khác nhau mà bạn có thể sử dụng để thoát khỏi trình soạn thảo vim.

  • :wq – Để lưu các thay đổi và thoát khỏi trình soạn thảo của vim
  • :q! – Để thoát khỏi trình soạn thảo của vim mà không lưu thay đổi
  • 😡 hoặc :exit hoặc :e – Để lưu và thoát khỏi nơi có thay đổi

Lưu và thoát

Tổng kết

Trên đây là một số hướng dẫn cơ bản để sử dụng Vim. Qua bài đọc bạn cũng đã nắm rõ khái niệm Vim là gì?. Hy vọng rằng bạn hiểu và thực hành các hướng dẫn trên một cách dễ dàng nhất ^^. Vui lòng chạy thử trên Vim Editor của bạn và để lại phản hồi cho Aptech Buôn Ma Thuột bên dưới đây.

Git conflicts

Git conflicts? Cách xử lý conflict trong khi merge.

Git là công cụ làm việc nhóm hiệu quả, giúp kiểm soát và quản lý các đóng góp cho dự án giữa nhiều tác giả, thường là nhà phát triển. Khi nhiều nhà phát triển chỉnh sửa cùng một nội dung, có thể xảy ra xung đột. Nếu nhà phát triển A chỉnh sửa mã mà nhà phát triển B cũng đang chỉnh sửa, sẽ có xung đột (conflict). Trong bài này, hãy cùng Aptech tìm hiểu khái niệm Git conflicts và cách giải quyết xung đột khi thực hiện hợp nhất (merge) một cách đơn giản nhất.

Conflict trong Git là gì?

Như đã đề cập, Git conflicts nghĩa là xung đột trong Git. Trong hệ thống kiểm soát nguồn như Git, xung đột xảy ra khi hai hoặc nhiều người thay đổi cùng một tệp. Xung đột có thể xuất hiện tại kho lưu trữ cục bộ của thành viên hoặc kho lưu trữ từ xa trên GitHub.

Ví dụ sau minh họa xung đột khi hai nhánh dev_a và dev_b cùng làm việc trong một dự án. Xung đột xảy ra khi dev_a và dev_b cố gắng hợp nhất mã mới vào master mà không cập nhật các thay đổi từ nhau.

Trong biểu đồ trên, hai nhánh dev_a và dev_b cùng chỉnh sửa tệp person.java.

Đầu tiên, dev_b thay đổi nội dung tại dòng 1 và 2 của tệp person.java và thực hiện commit C2 để ghi lại các thay đổi đó. Sau đó, dev_b hợp nhất các thay đổi này vào nhánh master ở commit C3.

Song song đó, dev_a thay đổi nội dung tại dòng 1, 2, 3 và 4 của tệp person.java và thực hiện hai commit là C4 và C5 để ghi lại các thay đổi của mình. Sau đó, dev_a cũng thực hiện lệnh hợp nhất để cập nhật các commit C4 và C5 vào nhánh master như commit C6.

Lúc này, xung đột xảy ra. Git nhận thấy nội dung trên mỗi dòng của tệp person.java không giống nhau ở hai phiên bản chuẩn bị hợp nhất. Tại thời điểm merge branch dev_a vào master, nội dung của tệp person.java trên dev_a không đồng nhất với nội dung trên tệp person.java của nhánh master. Cụ thể, xung đột bắt đầu từ dòng số 2.

Lưu ý: Xung đột chỉ ảnh hưởng đến nhà phát triển trong quá trình hợp nhất. Phần còn lại của nhóm, những người không tham gia vào quá trình thay đổi tệp này, sẽ không biết về xung đột. Nguyên tắc là ai gây ra xung đột người đó sẽ chủ động giải quyết.

Conflict trong Git là gì?

Giải quyết xung đột conflict trong Git khi thực hiện hợp nhất merge như thế nào?

Quay lại ví dụ trên, Git không thể tự động xác định điều gì là đúng vì nó không biết nội dung nào là mong muốn của người viết. Git sẽ đánh dấu tệp bị Git conflicts và tạm dừng quá trình hợp nhất. Sau đó, các nhà phát triển phải giải quyết xung đột dựa trên những gì Git đã đánh dấu.

Git sẽ thêm một số từ khóa vào tệp person.java để nhà phát triển xem xét và quyết định thay đổi của mình.

Ví dụ:
1……<<<<<<< HEAD=======2……3……>>>>>>> dev_a4……

Các dòng mới trong tệp person.java là “Conflict dividers” (bộ chia xung đột). Trong đó:

  • Dòng `<<<<<<< HEAD` là nội dung hiện có trong nhánh master mà HEAD đang trỏ tới.
  • Phần sau dòng `=======` là “trung tâm” của xung đột, thể hiện nội dung xung đột.
  • Phần sau dòng `>>>>>>> dev_a` là nội dung trong nhánh dev_a chuẩn bị hợp nhất vào master.

Sau khi xác định nội dung xung đột, cách giải quyết xung đột hợp nhất là chỉnh sửa tệp bị xung đột. Mở tệp person.java trong trình soạn thảo yêu thích và loại bỏ các bộ chia xung đột. Nội dung tệp person.java sau khi sửa đổi sẽ trông như sau:
1……2……3……4……

Bước tiếp theo là thực hiện `git add` để tạo nội dung hợp nhất mới và sử dụng `git commit` để tạo một cam kết mới cho kho lưu trữ, hoàn tất việc hợp nhất.

Giải quyết xung đột conflict trong Git khi thực hiện hợp nhất merge như thế nào?

Tổng kết

Để giải quyết Git conflicts, bạn chỉ cần chỉnh sửa nội dung trong tệp gây xung đột và sau đó thực hiện `add` và `commit` cho tệp đó.

Để giảm thiểu xung đột trong một nhóm có nhiều thành viên, nên thiết lập một quy trình từ đầu để tất cả các thành viên trong nhóm biết khi làm việc với Git trên cùng một dự án. Dưới đây là một số gợi ý để làm việc hiệu quả hơn:

  • Thực hiện commit thường xuyên: không chờ đợi cho đến khi có quá nhiều thay đổi để commit và push vào kho lưu trữ từ xa Git. Việc commit thường xuyên giúp dễ dàng hơn trong việc giải quyết xung đột.
  • Trước khi làm việc trên các thay đổi mới và commit, nên pull các thay đổi từ kho lưu trữ từ xa Git.
  • Mỗi thành viên nên làm việc trên từng tính năng trong các nhánh riêng biệt vào một thời điểm.

giải quyết Git conflicts

Trên đây là toàn bộ thông tin về Git conflicts cũng như cách giải quyết xung đột conflict trong Git khi thực hiện hợp nhất merge mà Aptech đã chia sẻ đến cho bạn. Mong rằng với những thông tin ở trên đã có thể dễ dàng áp dụng hơn trong các dự án của mình.

lợi ích của công nghệ thông tin

Những lợi ích của công nghệ thông tin mà có thể bạn chưa biết

Công nghệ thông tin mang đến nhiều lợi ích thiết thực, bên cạnh mức thu nhập cao, công nghệ thông tin còn mang lại nhiều lợi ích khác. Bạn có biết những lợi ích của công nghệ thông tin là gì không? Nếu chưa, hãy để Aptech bật mí cho bạn trong bài viết dưới đây.

Lợi ích khi học công nghệ thông tin

Mở ra nhiều cơ hội học tập

Không ai có thể phủ nhận những lợi ích của công nghệ thông tin hiện nay. Internet như một thư viện khổng lồ, cung cấp vô vàn kiến thức. Truy cập internet giúp tăng tỷ lệ tốt nghiệp đại học, ngoài ra học sinh còn có thể học trực tuyến, linh hoạt về thời gian và có nhiều lựa chọn hơn.

Mở ra nhiều cơ hội học tập

Cơ hội có thu nhập cao

Không chỉ học hỏi kiến thức và kỹ năng, công nghệ thông tin còn mở ra nhiều cơ hội việc làm hấp dẫn. Hiện nay, các công ty tuyển dụng đều đăng thông tin qua internet, giúp việc tìm kiếm việc làm trở nên dễ dàng hơn. Nhiều bạn trẻ trong ngành công nghệ thông tin có thu nhập cao, cải thiện đời sống hiệu quả.

Để đạt mức lương cao và công việc ổn định, mỗi sinh viên công nghệ thông tin cần nỗ lực học tập không ngừng. Điều này sẽ đảm bảo cho tương lai và mang lại mức lương như mong đợi.

Gảm trầm cảm và tăng nhận thức

Theo khảo sát của Pew Research Center, cứ 6 người tuổi teen thì có 1 người dùng internet để tìm hiểu và giãi bày những vấn đề họ không thể chia sẻ với ai. Đối với người già, việc sử dụng internet giảm nguy cơ trầm cảm và tăng cường nhận thức, trí tuệ minh mẫn hơn. Đây là một trong những lợi ích của công nghệ thông tin thiết thực nhất mang lại cho người dùng.

Gọi vốn trên internet dễ dàng

Trước đây, các dự án khởi nghiệp phải gặp gỡ từng nhà đầu tư để kêu gọi vốn. Tuy nhiên, hiện nay nhờ công nghệ thông tin, việc này có thể thực hiện trực tuyến. Nhiều công ty khởi nghiệp đã đạt được thành công lớn ngay từ đầu nhờ tận dụng lợi thế này.

Gọi vốn trên internet dễ dàng

Mang đến thêm nhiều loại hình dịch vụ mới

Công nghệ thông tin mang đến nhiều loại hình dịch vụ mới. Việc xem nội dung số qua internet trở nên phổ biến nhờ tính tiện lợi và đa dạng. Thay vì đến cửa hàng, bạn chỉ cần ngồi tại nhà và nhấp chuột để mua sắm. Hơn nữa, công nghệ thông tin hỗ trợ thanh toán trực tuyến dễ dàng và nhanh chóng, tiết kiệm tối đa thời gian cho người dùng.

Rút ngắn khoảng cách giao tiếp

Sự ra đời của các mạng xã hội như Facebook, Zalo, Twitter đã giúp khoảng cách giữa mọi người trên thế giới ngắn lại. Bạn có thể chat, gọi video, gửi ảnh qua các mạng này, đáp ứng nhu cầu giao tiếp không khoảng cách của con người.

Theo nghiên cứu đăng trên tạp chí khoa học PNAS, internet còn là nơi lý tưởng để tìm thấy nửa kia của mình. Nhờ những lợi ích của công nghệ thông tin này, ngày nay nhiều người trẻ chọn học ngành này. Đây là cơ hội tốt, đặc biệt trong thời đại công nghệ phát triển mạnh mẽ như hiện nay.

Rút ngắn khoảng cách giao tiếp

Học công nghệ thông tin ở đâu chất lượng nhất?

Với việc sử dụng công nghệ thông tin ngày càng nhiều như hiện nay thì việc theo học công nghệ thông tin là một trong những sự lựa chọn sáng suốt và thông minh nhất đối với bạn. Tuy nhiên, để chắc chắn sự lựa chọn của bạn là đúng thì việc cần thiết nhất cho lúc bấy giờ chính là lựa chọn đơn vị đào tạo uy tín, chất lượng cho mình.

Nếu bạn ở Kon Tum, Gia Lai, Đắk Lắk, Đắk Nông thì một trong những địa chỉ mà uy tín mà bạn nên chọn chính là Aptech Buôn Ma Thuột. Với chương trình đào tạo chất lượng đi kèm với mức học phí phải chăng. Chắc chắn đây sẽ là sự lựa chọn lý tưởng dành cho những ai muốn trở thành IT chuyên nghiệp trong tương lai. Hiện tại, Aptech có 2 khóa học, bao gồm: khóa học lập trình viên quốc tế và khóa học lập trình viên ngắn hạn.

Khóa học lập trình ngắn hạn có 3 ngôn ngữ lập trình chủ đạo được Aptech đưa vào đào tạo bao gồm: ngôn ngữ lập trình C#, PHP và Java. Khóa học Lập trình. Để biết thêm thông tin về chi tiết về các khóa đào của Aptech Buôn Ma Thuột. Bạn có thể liên hệ qua hotline hoặc nhắn tin trực tiếp với Aptech Buôn Ma Thuột để được tư vấn tận tình.

Học công nghệ thông tin ở đâu chất lượng nhất?

Bài viết trên của Aptech chia sẻ đến bạn những lợi ích của công nghệ thông tin. Mong rằng những gì mà Aptech Buôn Ma Thuột chia sẻ ở trên chính là câu trả lời cho những thắc mắc của bạn đối với ngành nghề này.

gitgnore là gì

Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất?

Git là một công cụ tuyệt vời để theo dõi tất cả các tệp trong một dự án. Cho dù bạn chỉ có một vài file hay vài ngàn file dự án để theo dõi nhưng có một số file không nhất thiết bạn phải theo dõi nó trong suốt vòng đời của dự án. Hãy xem Gitignore là gì và Gitignore giúp gì cho bạn trong trường hợp này nhé! Trong bài viết này, hãy cùng Aptech sẽ tìm hiểu nguyên nhân tại sao chúng ta nên “nói” với Git bỏ qua một số file nhất định. Cách làm điều đó như thế nào và một số ví dụ thực tiễn tốt nhất cho bạn.

Tại sao nên sử dụng .gitignore?

Bỏ qua thủ công các file mà bạn không muốn theo dõi có thể quản lý được trong một dự án quy mô nhỏ, nhưng ngay khi dự án của bạn bắt đầu phát triển và nó có đến hàng chục hoặc hàng trăm file không được kiểm soát phiên bản, thì chắc chắn đó một vấn đề lớn sẽ khiến bạn đau đầu. Các file này sẽ bắt đầu làm lộn xộn danh sách “Các file không bị theo dõi” trong đầu bạn, điều này có thể khiến bạn bỏ qua các file hợp pháp cần có trong repository.

Để giải quyết vấn đề này, Git có một cơ chế “bỏ qua” dưới dạng một file được gọi .gitignore. Với file này và cách khai báo mẫu rất đơn giản, bạn có thể cho Git biết loại file nào bạn muốn nó bỏ qua và không theo dõi trong repo của bạn. Nếu tên file trong dự án của bạn khớp với một trong các mẫu có trong .gitignorefile thì Git sẽ không cố theo dõi file và nó sẽ không hiển thị trong danh sách “File không bị theo dõi” Untracked files

Tại sao nên sử dụng .gitignore?

Vậy phải bỏ qua “ignore” những tập tin nào?

Điều này tùy thuộc vào sở thích cá nhân, nhưng nói chung chúng ta nên có xu hướng tuân theo các quy tắc chung này về các file không theo dõi như sau:

  • Các file hệ thống (Ví dụ: Trong MacOS: .DS_Store hoặc Thumb.db)
  • File cấu hình ứng dụng (Ví dụ: app.config, .envvv)
  • File được build ra trong quá trình biên dịch (Ví dụ: Python *.pyc hoặc các file *.tmp, *.lock)
  • Thư mục lưu trữ và tìm kiếm các modules (Ví dụ: Trong Node.js có node_modules)
  • Các file văn bản và file thông tin cá nhân (Ví dụ: todo.txt)
  • Cơ sở dữ liệu và các file lưu log (Ví dụ: *.log, *.sqlite, …)

Có khá nhiều loại file khác thường bị bỏ qua, nhưng rất nhiều trong số này thuộc về sở thích cá nhân, như sau:

  • Tập tin cấu hình dev (Ví dụ: .jshintrc)
  • Các mã nguồn được tạo hoặc rút gọn (Ví dụ: *.min.js)
  • .gitignore

Vâng, thậm chí ngay cả việc có nên theo dõi file .gitignore trong chính nó cung đang gây tranh luận.

Lời khuyên đưa ra ở đây là bạn có thể thay đổi tùy thuộc vào người đang làm việc cùng dự án với bạn, vì bạn có thể muốn thực hiện điều này với một số ít người nhưng với những người khác thì file .gitignore phải khác chẳng hạn. Mọi người đều có ý kiến về những gì nên hoặc không nên theo dõi, vì vậy lựa chọn tốt nhất của bạn là xem xét cả hai mặt của cuộc tranh luận và sau đó tự đưa ra quyết định dựa trên những gì tốt nhất cho dự án của bạn.

Vậy phải bỏ qua "ignore" những tập tin nào?

Sử dụng .gitignore sao cho hiệu quả nhất

Việc sử dụng tính năng bỏ qua này của Git khá đơn giản, đó là những gì chúng ta sẽ tìm hiểu trong phần này. Gả sử tôi có một dự án nodejs mới với các file chưa được theo dõi sau:

Việc theo dõi các file .DS_Store và node_modules/file trong repo của chúng ta là hơi thừa , vì vậy tôi sẽ bỏ qua những thứ này. Để làm như vậy, trước tiên chúng ta sẽ tạo một file trong thư mục gốc của dự án có tên .gitignore:

touch .gitignore

Cách đơn giản nhất để bỏ qua một file và phổ biến nhất là chỉ cần thêm tên file đầy đủ vào file bỏ qua. Vì vậy, để bỏ qua các file trên, ví dụ, chúng tôi sẽ muốn thêm các file sau:

.DS_Storenode_modules

Sau khi lưu, Git sẽ hiển thị cho chúng tôi các file chưa được theo dõi sau đây:

Cả hai .DS_Store và node_modules hiện đã đi khỏi danh sách “Untracked files”, nhưng tôi vẫn còn một vài thứ muốn loại bỏ, .env-dev và .env-prod. Để tránh phải thêm từng .gitignorefile một cách rõ ràng (đặc biệt nếu tôi phải thêm nhiều file này cho môi trường thử nghiệm và dàn dựng), tôi sẽ sử dụng ký tự đại diện trong .gitignore như sau:

.DS_Storenode_modules.env-*

Sử dụng .gitignore sao cho hiệu quả nhất

Và bây giờ danh sách “Untracked files” của chúng ta đã bị giảm hơn nữa. Ký tự đại diện ( * ) sẽ khớp với bất cứ ký tự gì kể từ nó trở đi ngoại trừ dấu gạch chéo ( / ).

Sử dụng hai ký tự đại diện trong một hàng ( ** ) theo sau là dấu gạch chéo sẽ khớp với mẫu của bạn trong tất cả các thư mục.

Ví dụ: public/**/*.min.js sẽ bỏ qua tất cả các file JavaScript được rút gọn trong thư mục public, bất kể chúng có nằm trong thư mục con nào của thư mục public.

Cơ chế bỏ qua Git cũng hỗ trợ một số cú pháp giống như biểu thức chính quy đơn giản, với một số cú pháp bổ sung của chính nó:

  • [0-9a-zA-Z]: Khớp với một loạt các ký tự theo mẫu định sẵn
  • ?: Tối đa 1 ký tự xuất hiện cùng với mẫu
  • !: Phủ định kết quả khớp hoặc ký tự trước

Ví dụ:

Mẫu Không theo dõi Theo dõi Giải thích
*.log
!important.log
debug.log
trace.log
important.log
logs/important.log
Dấu chấm than ( ! ) sẽ cho một mẫu phủ nhận. Nếu một file phù hợp với một mẫu, nhưng cũng phù hợp với một mẫu phủ định được xác định sau trong tệp, nó vẫn sẽ bị theo dõi.
debug?.log
debug??.log
debug0.log
debug20.log
debug20.log
debug0.log
Mỗi dấu hỏi ( ? ) khớp chính xác với mỗi ký tự bất kỳ.
debug[0-9].log  debug0.log
debug1.log
debug10.log Dấu ngoặc vuông [ ] được sử dụng để khớp với một ký tự từ một phạm vi được chỉ định.
debug[a-z].log debuga.log
debugz.log
debug1.log
debug[A-Z].log debugA.log
debugZ.log
debuga.log

Hệ thống cấp bậc các file .gitignore

Git thực sự kiểm tra nhiều hơn chỉ một file .gitignore được lưu trữ cục bộ mà từ đó nó biết được các tập tin nào nên bỏ qua. Như chúng ta đã thấy cho đến nay, vị trí phổ biến nhất là đặt một file .gitignore trong thư mục gốc của dự án của bạn. Một tùy chọn khác là có thêm một file .gitignorefile khác được đặt trong một thư mục con trong dự án của bạn. Mặc dù ít phổ biến hơn trong thực tế, nhưng điều này có thể hữu ích cho việc áp dụng luật lệ chung với toàn bộ file trong dự án nhưng có thể sử dụng luật lệ riêng trên thư mục con mà nó chứa đựng quy tắc riêng.

Một tính năng hữu ích khác là tạo ra một tập tin ignore toàn cục. Đây thường là một tập tin.gitignore được đặt trong thư mục home directory của Git

$ touch ~/.gitignore

Nếu cần, bạn có thể thay đổi vị trí của file toàn cục này bằng lệnh sau:

$ git config –global core.excludesFile ~/.gitignore

Nghĩa là bất kỳ mẫu nào được đặt trong file .gitignore toàn cục này phải dành cho loại file mà bạn chắc chắn mình sẽ không bao giờ muốn theo dõi nó, chẳng hạn như .DS_Store hoặc Thumbs.db do OS tự sinh ra. Điều này, giúp bạn dễ dàng hơn trong việc phải thiết lập file .gitignore cho dự án, bạn chỉ cần kiểm tra các file đặc biệt không cần theo dõi trong dự án của mình là đủ vì các file hay gặp đã được chỉ định sẵn trong .gitignore toàn cục.

Hệ thống cấp bậc các file .gitignore

Commit một file .gitignore

Giả sử bạn có một ngoại lệ đó là bạn muốn tạo ra một file và file nằm trong mẫu bị bỏ qua trong file .gitignore, nhưng vì lý do gì dự án này đặc biệt cần nó và phải commit cho nó. Trong trường hợp như thế này, bạn có một vài lựa chọn:

  • Yêu cầu Git không bỏ qua file này bằng cách thêm một tiền tố ( ! ) trong .gitignore, ví dụ: !.env. Điều này sẽ ghi đè bất kỳ file .gitignore toàn cục hoặc bỏ qua các file trong thư mục cha.
  • Sử dụng –force tùy chọn (hoặc -f ) khi thêm các file của bạn vào stagging area, nghĩa là git add .env –force

Làm sao để git cũng không theo dõi luôn file .gitignore nếu bạn muốn. Đơn giản, chỉ cần đặt nó vào chính nó. Nghĩa là thêm “.gitignore” vào trong nội dung file .gitignore

Tổng kết

Trong bài viết này, bạn đã thấy cách Git cung cấp một cơ chế để bạn có thể nói với nó những tập tin nào không nên theo dõi trong repo của mình, giúp bạn khỏi phải theo dõi các tập tin theo cách thủ công. Đây là một tính năng mạnh mẽ cung cấp một cú pháp phong phú, cũng như hệ thống phân cấp để kiểm soát tốt hơn các file nào bị bỏ qua và file nào không.

Bytecode trong Java

Bytecode trong Java là gì? Bytecode hoạt động như thế nào?

Có rất nhiều quy trình diễn ra trong khi một chương trình trong Java được thực thi. Một trong những khái niệm này là Bytecode trong Java. Bài viết này của Aptech sẽ giúp bạn trong việc tìm hiểu cách Java bytecode làm việc và lợi thế của nó như thế nào.

Bytecode trong Java là gì?

Bytecode là lý do khiến java là nền tảng độc lập, ngay sau khi một chương trình Java được biên soạn bytecode được tạo ra. Nói chính xác hơn, Bytecode Java là mã máy ở dạng tệp. Class. Bytecode là tập lệnh cho Máy ảo Java (JVM) và hoạt động tương tự như trình biên dịch.

Bytecode trong Java là gì?

Bytecode trong Java hoạt động như thế nào

Khi một chương trình Java được thực thi, các trình biên dịch biên dịch đoạn mã và một Bytecode được tạo ra cho mỗi phương thức trong chương trình đó dưới dạng một file .class.

Chúng ta cũng có thể chạy bytecode này trên bất kỳ nền tảng nào khác. Nhưng bytecode là một mã không thể tự chạy được, nó yêu cầu và dựa vào trình thông dịch . Đây là nơi JVM đóng một phần quan trọng.

Bytecode được tạo sau khi quá trình biên dịch được chạy bởi máy ảo Java . Các tài nguyên cần thiết cho việc thực thi được cung cấp bởi máy ảo Java để thực thi trơn tru, gọi bộ xử lý để phân bổ tài nguyên.

Bytecode trong Java và mã máy khác nhau như thế nào?

Sự khác biệt chính giữa mã máy và bytecode là mã máy là một tập hợp các hướng dẫn bằng ngôn ngữ máy hoặc kiểu nhị phân có thể được CPU thực thi trực tiếp. Trong khi bytecode là mã không thể chạy và được tạo bằng cách biên dịch mã nguồn dựa vào trình thông dịch để được thực thi.

Bytecode trong Java và mã máy khác nhau như thế nào?

Ưu điểm của Bytecode trong Java

Sau đây là một vài lợi thế của Bytecode:

  • Nó giúp đạt được sự độc lập nền tảng, đó là một trong những lý do khiến James Gosling bắt đầu hình thành Java.
  • Bộ hướng dẫn cho một JVM có thể khác nhau từ hệ thống này sang hệ thống khác nhưng tất cả đều có thể thông dịch được Bytecode.
  • Bytecode là các mã không thể chạy được mà phải dựa trên tính khả dụng của trình thông dịch, đây là lúc JVM phát huy tác dụng.
  • Nó là một mã ngôn ngữ cấp máy chạy trên JVM.
  • Nó bổ sung tính di động cho Java, “write once, read anywhere”.

Trên đây là giải đáp chi tiết khái niệm Bytecode trong Java là gì và cách hoạt động của Bytecode mà Aptech đã chia sẻ đến bạn.

CSS framework

Top 10 CSS framework bạn nên cân nhắc sử dụng trong dự án của mình

Khi xây dựng một trang web, việc lựa chọn và sử dụng một CSS framework sẽ giúp các lập trình viên tiết kiệm kha khá thời gian vì chúng cung cấp các công cụ mà mọi nhà thiết kế web và nhà phát triển front-end cần khi tạo một trang web. Trong bài viết dưới đây, hãy cùng Aptech tìm hiểu về TOP 10+ CSS framework tốt nhất hiện nay, giúp bạn hoàn thành dự án hiệu quả.

CSS Framework là gì?

CSS Framework là một phần mềm được tạo ra để hỗ trợ các nhà thiết kế web theo tiêu chuẩn một cách dễ dàng hơn khi sử dụng HTML / CSS. Nhiều CSS Framework phổ biến được định hướng thiết kế và chứa các thành phần có thể được tái sử dụng lại trong quá trình tạo bất kỳ trang web hoặc ứng dụng nào, cũng như hệ thống lưới được thiết kế để cung cấp bố cục CSS Responsive cho các trang web.

Tất cả các CSS Framework được liệt kê trong bài viết này đều là mã nguồn mở và miễn phí.

CSS Framework là gì?

Top 10 CSS Framework tốt nhất mà bạn nên sử dụng hiện nay

Bootstrap

Không còn nghi ngờ gì nữa, Bootstrap là CSS Framework nguồn mở và miễn phí được sử dụng rộng rãi nhất. Được tạo ra vào năm 2011 bởi nhà phát triển Mark Otto và Jacob Thornton, Bootstrap hiện được hàng triệu trang web sử dụng.

Đặc trưng Bootstrap có các biến Sass và mixins, một hệ thống lưới responsive, các thành phần dựng sẵn mở rộng để xây dựng bố cục và các plugin mạnh mẽ được xây dựng trên jQuery.

Bootstrap là một trong những công cụ được tôi lựa chọn khi xây dựng các trang web đáp ứng hoặc chủ đề WordPress. Nó rất dễ học và tài liệu rất đầy đủ. Nếu bạn muốn trở thành một nhà phát triển web, học Bootstrap là điều bắt buộc.

Bootstrap

Pure CSS

Chỉ có 3,8KB được rút gọn và nén, nhưng chứa rất nhiều tính năng cho nhu cầu thiết kế web của bạn. Được tạo bởi Yahoo vào năm 2014, Pure chuyên cung cấp một bộ bố cục và các thành phần CSS đáp ứng rất nhẹ để hoạt động như một nền tảng để tạo ra một thiết kế đáp ứng.

Pure CSS

Bulma

Với 21kB được rút gọn và nén, Bulma không phải là trọng lượng nhẹ nhất trong danh sách này, nhưng CSS Framework nguồn mở này rất thú vị đến nỗi nó hoàn toàn xứng đáng được đề cập. Bulma được xây dựng với cách tiếp cận đầu tiên trên thiết bị di động, giúp mọi yếu tố được tối ưu hóa cho việc đọc dọc và hệ thống lưới của nó được xây dựng hoàn chỉnh với Flexbox.

Đạt được bố cục linh hoạt với các cột có cùng kích thước cũng đơn giản như việc thêm một class .column vào bất kỳ thành phần HTML nào của bạn. Bulma cũng được xây dựng với Sass, cho phép bạn chỉ sử dụng các tính năng bạn thực sự cần trong các nhiệm vụ phát triển web của mình.

Bulma

Tailwind

Tailwind là một CSS framework tương đối mới, được thiết kế để khác biệt với các đối thủ cạnh tranh. Thay vì các thành phần được thiết kế trước, Tailwind cung cấp các lớp tiện ích cấp thấp cho phép bạn xây dựng các thiết kế của riêng mình.

Hãy để có một cái nhìn nhanh về một số HTML được sử dụng với Tailwind:

<button class = “bg-blue hover:bg-blue-dark text-white font-bold py-2 px-4 rounded”>
Button Example
</button >

Như bạn có thể thấy, ví dụ này đang sử dụng nhiều lớp tiện ích trên một phần tử button. Các lớp đó cho phép bạn tạo kiểu tinh tế cho bất kỳ phần tử nào: Chúng ta có thể dễ dàng phát hiện ra các lớp có tên là text-white, font-bold và rounded, xác định khía cạnh trực quan của nút.

Tailwind

Materialize

Materialize là ngôn ngữ thiết kế được tạo ra vào năm 2014 bởi Google. Nó sử dụng nhiều bố cục dựa trên lưới hơn, hình ảnh động và chuyển tiếp linh hoạt, phần đệm và hiệu ứng chiều sâu như ánh sáng và bóng.

Kể từ năm 2019, Materialize đã được triển khai trên hầu hết các sản phẩm của Google như YouTube, Gmail, Google Drive và Google Docs.

Materialize là một framework responsive hiện đại dựa trên thiết kế Materialize. Dễ sử dụng, nó cung cấp các thành phần, cũng như các mẫu khởi động cho phép bạn bắt đầu thiết kế trang web của mình với thời gian thiết lập tối thiểu.

Materialize

Mini.css

Mini, đúng như tên gọi, một framework nhẹ (7kb được nén) để tạo các trang web nhanh và responsive dễ dàng. Đứng giữa các framework có đầy đủ tính năng như Bootstrap và các framework rất nhỏ như Pure.CSS, Mini chứa nhiều tính năng (Lưới responsive, các thành phần,…) trong một gói nhỏ.

Framework này chỉ dựa vào CSS hiện đại, do đó bạn không phải lo lắng về xung đột JavaScript và bạn có thể tự do quyết định thư viện JavaScript nào bạn sẽ sử dụng trong dự án của mình.

Mini.css

UIkit

UIkit là một CSS framework nhẹ và responsive để phát triển các giao diện web nhanh và mạnh. Bao gồm CSS và JavaScript được biên dịch, UIKit rất dễ sử dụng và cung cấp tất cả các công cụ cần thiết cho thiết kế web hiện đại: Lưới, biểu tượng tùy chỉnh, thành phần, hình động, và nhiều hơn nữa. UIKit tương thích với Less và Sass.

UIkit

Skeleton

Chỉ với 400 dòng mã, Skeleton nhẹ như một chiếc lông vũ. Tuy nhiên, nó có một hệ thống lưới CSS responsive, kiểu chữ, biểu mẫu, truy vấn phương tiện, tất cả những gì bạn cần để xây dựng một trang web chất lượng nhanh chóng.

Được thiết kế như một điểm khởi đầu cho các dự án của bạn, Skeleton chỉ bao gồm các kiểu phần tử HTML và cung cấp một hệ thống lưới đơn giản nhưng hiệu quả. Vì không cần biên dịch hoặc cài đặt, nên framework này giúp bạn dễ dàng tạo bất kỳ loại thiết kế đáp ứng nào.

Skeleton

Base

Base là một framework responsive rất đơn giản nhưng mạnh mẽ. Được xây dựng với mã nhẹ và tối thiểu, Base được thiết kế để cung cấp cho các nhà phát triển và nhà thiết kế một cách dễ dàng để xây dựng các trình duyệt chéo, các trang web trên thiết bị di động và các ứng dụng web. Framework rất tiện dụng này sẽ cung cấp một nền tảng vững chắc để tạo ra các thiết kế đáp ứng chất lượng nhanh chóng.

Skeleton

Spectre

Điểm khởi đầu nhẹ (~ 10KB được nén) cho các dự án của bạn, Spectre cung cấp các thành phần được thiết kế trang nhã, cũng như bố cục dựa trên flexbox, đáp ứng và thân thiện với thiết bị di động.

Kích thước và tính năng nhỏ hơn nhiều so với các framework tính năng đầy đủ như Bootstrap, Spectre là một lựa chọn tuyệt vời cho các trang web dạng landing-page, single-page và các ứng dụng web nhỏ.

Spectre

Milligram

Milligram cung cấp một thiết lập tối thiểu về kiểu dáng cho điểm khởi đầu nhanh và sạch. Chỉ với 2kb được nén, framework nhỏ nhưng mạnh mẽ này nằm trong top ba của framework nhẹ có sẵn. Mặc dù có kích thước rất nhỏ, Milligram cung cấp một bộ công cụ phát triển web hoàn chỉnh và khai thác triệt để các khả năng do CSS3 cung cấp.

Milligram

Dead Simple Grid

Dead Simple Grid không thực sự là một framework. Như tên cho thấy, công cụ này chỉ bao gồm một bố cục lưới đơn giản có thể được sử dụng trong mọi dự án. Chỉ với 250 byte mã CSS, Dead Simple Grid sẽ hữu ích cho các nhà phát triển web cần một hệ thống lưới, không có các thành phần thường được cung cấp bởi một framework hoàn chỉnh hơn.

Dead Simple Grid

Picnic CSS

Với kích thước dưới 10kb khi được nén, Picnic chắc chắn rất nhẹ, nhưng cũng có mọi thứ bạn cần để tạo một trang web chức năng, đẹp mắt. Sử dụng Picnic cực dễ, vì bạn có thể chỉ cần nhúng biểu định kiểu bằng cách thêm dòng sau vào phần <head> trên trang của bạn:

<link rel=”stylesheet” href=”https://cdn.jsdelivr.net/npm/picnic”>

Nhỏ gọn nhưng rất đầy đủ, framework có tất cả các thành phần cần thiết để tạo các trang web hiện đại: Lưới, biểu mẫu, tab, chú giải công cụ, cảnh báo. Picnic được viết bằng Sass / SCSS với nhiều biến và lớp để dễ dàng mở rộng.

Picnic CSS

Trên đây là tổng hợp các CSS framework tốt nhất hiện nay mà bạn nên sử dụng trong dự án của mình. Mong rằng những chia sẻ trên của Aptech sẽ giúp bạn lựa chọn được CSS framework phù hợp nhất với bản thân và đạt được kết quả tốt đẹp khi thực hiện dự án.