Commit Git: Một lớp học chính

Tác giả sysadmin, T.Hai 22, 2023, 09:32:16 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Commit Git: Một lớp học chính


Lệnh Commit Git lưu trữ các bản sao của các thay đổi từ thư mục làm việc của bạn trong kho lưu trữ Git của bạn. Nhưng nó cũng có thể được sử dụng để sửa đổi các Commit hiện có và cũng để hoàn nguyên các Commit.


Yêu cầu cơ bản của bất kỳ hệ thống kiểm soát phiên bản nào là lưu trữ các phiên bản tệp khác nhau cho bạn. Trong Git, lệnh thực hiện điều này là commit. Đây là tất cả mọi thứ bạn cần biết.

1. Commit trong Git là gì?

Các Commit là một loạt ảnh chụp nhanh được thực hiện trong suốt vòng đời của một dự án tạo nên lịch sử phát triển của nó. Các Commit là những gì cho phép chúng tôi trích xuất một phiên bản của dự án như ở các thời điểm khác nhau trong quá khứ. Tại sao điều đó lại quan trọng?

Các hệ thống kiểm soát phiên bản  (VCS) được sử dụng phổ biến nhất với mã nguồn phần mềm và các dự án phát triển. Nhưng chúng có thể được sử dụng thành công với bất kỳ tập hợp tệp văn bản nào, chẳng hạn như tệp Markdown chứa các chương của một cuốn sách.

Bạn có thể không muốn mọi tệp trong thư mục dự án của mình được xử lý bởi VCS, vì vậy bạn cần có khả năng chỉ định các tệp bạn muốn kiểm soát phiên bản. Thao tác này sẽ thêm chúng vào chế độ xem kiểm soát phiên bản của dự án. Họ sẽ được theo dõi để thay đổi.

Một cách khác để đạt được điều này là  sử dụng danh sách bỏ qua. Điều này cho Git biết những tệp, thư mục hoặc loại tệp nào mà nó luôn bỏ qua.

Theo thời gian, khi các tệp mới được thêm vào dự án, một số tệp sẽ yêu cầu được thêm vào hệ thống kiểm soát phiên bản. Trong Git, điều này được xử lý bằng addlệnh. Trên thực tế, addlệnh thực hiện dịch vụ kép, như chúng ta sẽ thấy.

Để duy trì lịch sử các thay đổi đã được thực hiện đối với dự án, bạn sẽ định kỳ yêu cầu Git lưu trữ ảnh chụp nhanh về trạng thái của dự án, sử dụng lệnh commit. Đây là nơi addlệnh xuất hiện lại trong quy trình làm việc của chúng tôi. Chúng tôi sử dụng addlệnh để báo cho Git biết  những tệp đã thay đổi  mà chúng tôi muốn đưa vào ảnh chụp nhanh. Sau đó, chúng tôi sử dụng commitđể yêu cầu Git tạo ảnh chụp nhanh.

2. Định cấu hình lệnh Commit

Thông tin về Commit được lưu trữ cùng với nó, để luôn có thể biết ai đã thực hiện Commit, khi nào và nội dung của Commit đó. Một số siêu dữ liệu này được ghi lại tại thời điểm Commit, chẳng hạn như thông báo Commit.

Siêu dữ liệu liên quan đến danh tính của các thành viên trong nhóm phát triển có thể được định cấu hình bởi mỗi người dùng để ngăn việc cung cấp nhiều lần cùng một thông tin.

Để đặt tên của bạn trên toàn cầu cho tất cả các kho lưu trữ trên máy tính của bạn, hãy sử dụng lệnh này.

Mã nguồn [Chọn]
git config --global user.name "Dave McKay"

Để xác minh tên của bạn đã được đặt, hãy sử dụng lệnh này.

Mã nguồn [Chọn]
git config --global user.name

Nếu bạn cần sử dụng một tên khác trên một kho lưu trữ cụ thể, hãy thay đổi thư mục của dự án và sử dụng cùng một lệnh mà không có tùy chọn --global.

Mã nguồn [Chọn]
git config user.name "McKay, David"
Mã nguồn [Chọn]
git config user.name

Bây giờ chúng tôi đã có một tên người dùng mặc định khác cho kho lưu trữ này và tên chung của chúng tôi vẫn được sử dụng cho các kho lưu trữ khác.

Theo cách tương tự, chúng tôi có thể đặt địa chỉ email trên toàn cầu hoặc cho một kho lưu trữ duy nhất bằng cách bao gồm hoặc bỏ qua tùy --globalchọn.

Mã nguồn [Chọn]
git config user.email "[email protected]"
Mã nguồn [Chọn]
git config --global user.email "[email protected]"
Mã nguồn [Chọn]
git config user.email
Mã nguồn [Chọn]
git config --global user.email

Các cài đặt này được giữ trong tệp cấu hình. Cài đặt Git chung được giữ trong "~/.gitconfig" và cài đặt dành riêng cho kho lưu trữ được giữ trong tệp ".git/config" của kho lưu trữ.

Lệnh commit tham chiếu và sử dụng các giá trị này khi nó hoạt động.

3. Sử dụng lệnh Commit

Cách sử dụng cơ bản của commitlệnh là lấy các tệp trong khu vực tổ chức, được gọi là chỉ mục và lưu trữ chúng dưới dạng một Commit trong nhánh hiện tại của kho lưu trữ.

3.1. Commit cơ bản

Chúng tôi có một dự án với một tệp đã thay đổi. Chúng tôi sẽ sử dụng addlệnh để tạo tệp, sau đó Commit nó. Chúng tôi đang sử dụng -mtùy chọn (thông báo Commit) để có thể cung cấp mô tả ngắn về mục đích của các thay đổi. Nếu chúng tôi không sử dụng tùy chọn này, chúng tôi sẽ được nhắc về một thông báo Commit khi Commit diễn ra. Sẽ thuận tiện hơn khi thêm một cái trên dòng lệnh.

Mã nguồn [Chọn]
git add jibber.c
Mã nguồn [Chọn]
git commit -m "Updated help text"

Nếu chúng ta sử dụng lệnh git log, chúng ta có thể xem lại chi tiết của các lần xác nhận, theo thứ tự thời gian, với lần xác nhận gần đây nhất ở đầu danh sách.

Mã nguồn [Chọn]
git log

Các Commit được hiển thị trong less.


Commit đã được gắn thẻ với tên và địa chỉ email mà chúng tôi đã cung cấp trước đó và thông báo Commit của chúng tôi cũng được ghi lại.

3.2. Tập tin dàn dựng tự động

Dàn dựng nhiều tập tin có thể mất một ít thời gian. Một cách tiếp cận khác là sử dụng -Atùy chọn (tất cả) với add.

Điều này sẽ tự động sắp xếp tất cả các tệp đã sửa đổi cùng với tất cả các tệp hiện không được theo dõi. Việc sắp xếp các tệp không bị theo dõi tôn trọng cài đặt trong tệp ".gitignore" của bạn. Git sẽ không sắp xếp các tệp mà bạn đã nói với nó rằng bạn không muốn đưa vào. Cuối cùng, các tệp trong chỉ mục không còn trong thư mục làm việc sẽ bị xóa khỏi chỉ mục.

Rõ ràng, -Atùy chọn có thể khiến nhiều thứ xảy ra cùng một lúc. Tùy chọn này --dry-runcung cấp cho bạn bản xem trước các thay đổi mà không thực sự thực hiện chúng.

Mã nguồn [Chọn]
git add -A --dry-run

Trong ví dụ của chúng tôi, nó sẽ tạo ra hai tệp hiện có đã sửa đổi và hai tệp mới. Hãy tiếp tục và sử dụng -Atùy chọn trước khi sử dụng commitlệnh.

Mã nguồn [Chọn]
git add -A
Mã nguồn [Chọn]
git commit -m "Enhanced parsing"

Chúng ta có thể thấy rằng có tất cả bốn tệp được thay đổi. Hai trong số đó là các tệp mới được tạo, được liệt kê.

3.3. Dàn dựng và Commit cùng một lúc

Lệnh commitcó -atùy chọn viết thường (tất cả). Điều này thực hiện dàn dựng và Commit các tập tin trong một bước.

Tùy commit -achọn tạo giai đoạn và Commit các tệp hiện có đã sửa đổi, đồng thời xóa tệp khỏi chỉ mục nếu chúng đã bị xóa khỏi thư mục làm việc của bạn. Nó không tự động sắp xếp các tệp không bị theo dõi.

Giống như addlệnh, lệnh Commit có một --dry-runtùy chọn cho phép bạn xem trước các hành động của nó trước khi thực hiện.

Mã nguồn [Chọn]
git commit -a --dry-run

Bây giờ hãy thực hiện lệnh.

Mã nguồn [Chọn]
git commit -a --dry-run

Các tập tin được dàn dựng và Commit cho chúng tôi.

3.4. Commit với một chi nhánh khác

Nếu bạn đã thực hiện một số thay đổi đối với các tệp trong thư mục công việc của mình, sau đó nhận ra rằng bạn đã không kiểm tra đúng nhánh, bạn cần Commit các thay đổi của mình với đúng nhánh mà không ảnh hưởng đến nhánh hiện tại.

Git không có lệnh Commit với một nhánh khác. Nhưng bạn có thể khắc phục tình trạng này với một chút khéo léo của Git.

Chúng tôi sẽ sử dụng lệnh Gitstash để tạo một bản sao của các thay đổi. Sau đó, chúng tôi sẽ kiểm tra đúng nhánh và áp dụng các thay đổi từ kho lưu trữ. Để áp dụng các thay đổi được lưu trữ, chúng tôi đang sử dụng poplệnh chứ không phải applylệnh. Lệnh popáp dụng các thay đổi và cũng loại bỏ chúng khỏi ngăn chứa.

Chúng tôi đã thực hiện một số thay đổi trong new-parsernhánh của kho lưu trữ. Họ nên đã được thực hiện trong classic-parserchi nhánh.

Mã nguồn [Chọn]
git stash
Mã nguồn [Chọn]
git checkout classic-parser
Mã nguồn [Chọn]
git stash pop

Bây giờ chúng ta có thể thực hiện commitvà cập nhật nhánh này.

Mã nguồn [Chọn]
git commit -a -m "Added pre-parser functions"

Nếu chúng tôi quay lại nhánh new-parser, chúng tôi có thể thấy rằng nó đã được cập nhật, nghĩa là các thay đổi đã bị xóa khỏi thư mục làm việc của bạn và kho lưu trữ cũng như các tệp của bạn được đồng bộ hóa.

Mã nguồn [Chọn]
git checkout new-parser
Mã nguồn [Chọn]
git status

3.5. Thay đổi Commit

Nếu bạn cần cải thiện thông báo Commit của mình—có lẽ bạn đã phát hiện ra một lỗi đánh máy trong đó—hoặc bạn quên sắp xếp một tệp lẽ ra phải được đưa vào Commit, bạn có thể sử dụng tùy chọn này để chỉnh sửa mọi thứ --amend. Thông báo trước là, điều này không nên được sử dụng trên các xác nhận đã được đẩy đến một kho lưu trữ từ xa.

Trong thông báo Commit cuối cùng của chúng tôi, "fraze" nên là "cụm từ". Nếu chúng ta sử dụng git logchúng ta có thể thấy điều này.


Để sửa lỗi này, chúng ta sẽ sử dụng tùy chọn --amend như thế này.

Mã nguồn [Chọn]
git commit --amend -m "Optimized phrase identification"

Nếu chúng ta sử dụng git log một lần nữa, chúng ta có thể thấy Commit cũ đã được thay thế bằng Commit mới với thông báo Commit đã sửa.


Nếu chúng tôi muốn thêm một tệp mà chúng tôi đã quên tạo giai đoạn, chúng tôi có thể Commit tệp đó để nó xuất hiện như một phần của lần Commit trước đó.

Chúng tôi sẽ sử dụng addđể tạo tệp, sau đó thực hiện Commit với --amendtùy chọn. Tùy chọn này --no-editcó nghĩa là chúng tôi không cần cung cấp thông báo Commit mới. Thông báo Commit trước đó được giữ lại.

Mã nguồn [Chọn]
git add jibber.c
Mã nguồn [Chọn]
git commit --amend --no-edit

3.6. Xóa các thay đổi khỏi một Commit

Nếu bạn đã vô tình dàn dựng và Commit một tệp mà bạn không có ý định, bạn có thể xóa tệp đó khỏi Commit bằng cách sử dụng lệnhreset. Chúng tôi sẽ đặt lại Commit trở lại khu vực tổ chức hoặc chỉ mục. Sau đó, chúng tôi sẽ xóa tệp và Commit lại phần còn lại của tệp.

Để đặt lại lần xác nhận cuối cùng vào khu vực tổ chức, chúng tôi sử dụng reset --softlệnh. HEAD~là cách viết tắt của "Commit phía sau HEAD của dòng thời gian Commit của dự án", hoặc trong tiếng Anh là "Commit cuối cùng".

Mã nguồn [Chọn]
git reset --soft HEAD~

Để xóa tệp không nên đưa vào, chúng tôi sử dụng lệnh reset --mixed. Điều này đặt lại những thay đổi đó trở lại thư mục làm việc, tạo lại tệp đã sửa đổi dưới dạng tệp không được Commit, chưa được phân loại.

Mã nguồn [Chọn]
git reset --mixed jibber.c

Chúng ta cần Commit các tệp khác còn lại trong chỉ mục.

Mã nguồn [Chọn]
git commit -m "Experimental tweaks"

Hai tệp khác trong Commit ban đầu được Commit lại cho chúng tôi.

3.7. Hoàn nguyên toàn bộ Commit

Đôi khi hoàn tác toàn bộ Commit là điều dễ thực hiện nhất. Nó đặt thư mục làm việc và kho lưu trữ của bạn trở lại trạng thái trước khi bạn Commit.

Chúng tôi cần sử dụng ID tham chiếu được băm của Commit. Chúng ta có thể tìm thấy điều này bằng cách sử dụng git log:


Sao chép tham chiếu đó và sử dụng nó trong revertlệnh:

Mã nguồn [Chọn]
git revert e5bd4560aef8164c6ca9d6d4620b9db7f66aecc8

Thao tác này sẽ mở trình chỉnh sửa mặc định của bạn để bạn có thể chỉnh sửa thông báo hoàn nguyên. Có một tin nhắn mặc định được nhập cho bạn. Bạn có thể sử dụng cái này hoặc chỉnh sửa nó theo ý thích của bạn.


Khi bạn hài lòng với thông báo hoàn nguyên của mình, hãy lưu tệp và thoát khỏi trình chỉnh sửa. Trong nano, bạn thực hiện việc này bằng "Ctrl+O" và "Ctrl+X."


Sử dụng git log lại một lần nữa, chúng ta có thể thấy rằng một Commit mới đã được thêm vào để hoàn tác các thay đổi của Commit được hoàn nguyên.

4. Con dao quân đội Git Thụy Sĩ

Rõ ràng, commit là một trong những lệnh Git quan trọng nhất. Nó có thể làm được rất nhiều, vì vậy có rất nhiều thứ để học. Việc nắm bắt các tính năng ít được sử dụng của nó là thời gian hợp lý. Khi bạn cần sửa lỗi — ngay bây giờ — bạn sẽ mừng vì mình đã chuẩn bị trước.