Thay cho lời giới thiệu
Xin chào! Hôm nay chúng ta sẽ nói về một hệ thống kiểm soát phiên bản, cụ thể là Git.
Khái niệm cơ bản về Git
Git là một hệ thống kiểm soát phiên bản phân tán cho mã của chúng tôi. Tại sao chúng ta cần nó? Các nhóm phân tán cần một số loại hệ thống để quản lý công việc của họ. Nó là cần thiết để theo dõi những thay đổi xảy ra theo thời gian. Nghĩa là, chúng ta cần có thể xem từng bước những tệp nào đã thay đổi và thay đổi như thế nào. Điều này đặc biệt quan trọng khi bạn đang điều tra những gì đã thay đổi trong ngữ cảnh của một tác vụ đơn lẻ, giúp bạn có thể hoàn nguyên các thay đổi.Cài đặt Git
Hãy cài đặt Java trên máy tính của bạn.Cài đặt trên Windows
Như thường lệ, bạn cần tải xuống và chạy một tệp exe. Mọi thứ ở đây đều đơn giản: nhấp vào liên kết Google đầu tiên , thực hiện cài đặt, thế là xong. Để làm điều này, chúng tôi sẽ sử dụng bảng điều khiển bash do Windows cung cấp. Trên Windows, bạn cần chạy Git Bash. Đây là giao diện của nó trong Menu Bắt đầu:

Cài đặt trên Linux
Thông thường Git là một phần của các bản phân phối Linux và đã được cài đặt sẵn, vì nó là một công cụ ban đầu được viết để phát triển nhân Linux. Nhưng có những tình huống khi nó không phải là. Để kiểm tra, bạn cần mở terminal và viết: git --version. Nếu bạn nhận được câu trả lời dễ hiểu, thì không cần cài đặt gì nữa. Mở một thiết bị đầu cuối và cài đặt Git trên Ubuntu . Tôi đang làm việc trên Ubuntu, vì vậy tôi có thể cho bạn biết phải viết gì cho nó: sudo apt-get install git.Cài đặt trên macOS
Ở đây cũng vậy, trước tiên bạn cần kiểm tra xem Git đã có chưa. Nếu bạn chưa có, cách dễ nhất để có nó là tải xuống phiên bản mới nhất tại đây . Nếu Xcode được cài đặt, thì Git chắc chắn sẽ được cài đặt tự động.Cài đặt Git
Git có cài đặt người dùng cho người dùng sẽ gửi công việc. Điều này hợp lý và cần thiết, vì Git lấy thông tin này cho trường Tác giả khi một cam kết được tạo. Thiết lập tên người dùng và mật khẩu cho tất cả các dự án của bạn bằng cách chạy các lệnh sau:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Nếu bạn cần thay đổi tác giả cho một dự án cụ thể, bạn có thể xóa "--global". Điều này sẽ cung cấp cho chúng tôi những điều sau đây:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Một chút lý thuyết ...
Để đi sâu vào chủ đề này, chúng tôi xin giới thiệu với bạn một số từ và hành động mới...- kho git
- làm
- chi nhánh
- hợp nhất
- xung đột
- sự lôi kéo
- xô
- cách bỏ qua một số tệp (.gitignore)
Trạng thái trong Git
Git có một số bức tượng cần được hiểu và ghi nhớ:- không bị theo dõi
- sửa đổi
- dàn dựng
- tận tụy
Bạn nên hiểu điều này như thế nào?
Đây là những trạng thái áp dụng cho các tệp chứa mã của chúng tôi:- Một tệp được tạo nhưng chưa được thêm vào kho lưu trữ có trạng thái "không bị theo dõi".
- Khi chúng tôi thay đổi các tệp đã được thêm vào kho lưu trữ Git, thì trạng thái của chúng là "đã sửa đổi".
- Trong số các tệp mà chúng tôi đã thay đổi, chúng tôi chọn những tệp chúng tôi cần và các lớp này được thay đổi thành trạng thái "dàn dựng".
- Một cam kết được tạo từ các tệp đã chuẩn bị ở trạng thái theo giai đoạn và đi vào kho lưu trữ Git. Sau đó, không có tệp nào có trạng thái "dàn dựng". Nhưng vẫn có thể có các tệp có trạng thái "đã sửa đổi".

Cam kết là gì?
Cam kết là sự kiện chính khi nói đến kiểm soát phiên bản. Nó chứa tất cả các thay đổi được thực hiện kể từ khi bắt đầu cam kết. Các cam kết được liên kết với nhau giống như một danh sách được liên kết đơn lẻ. Cụ thể hơn: Có một cam kết đầu tiên. Khi lần xác nhận thứ hai được tạo, nó sẽ biết điều gì xảy ra sau lần xác nhận đầu tiên. Và theo cách này, thông tin có thể được theo dõi. Một cam kết cũng có thông tin riêng của nó, được gọi là siêu dữ liệu:- mã định danh duy nhất của cam kết, có thể được sử dụng để tìm thấy nó
- tên của tác giả của cam kết, người đã tạo ra nó
- ngày cam kết được tạo
- một bình luận mô tả những gì đã được thực hiện trong quá trình cam kết

Chi nhánh là gì?
Một nhánh là một con trỏ tới một số cam kết. Bởi vì một lần xác nhận biết lần xác nhận nào trước nó, khi một nhánh trỏ đến một lần xác nhận, tất cả các lần xác nhận trước đó cũng áp dụng cho nó. Theo đó, chúng tôi có thể nói rằng bạn có thể có bao nhiêu nhánh tùy ý trỏ đến cùng một cam kết. Công việc xảy ra trong các nhánh, vì vậy khi một lần xác nhận mới được tạo, nhánh sẽ di chuyển con trỏ của nó tới lần xác nhận gần đây hơn.Bắt đầu với Git
Bạn có thể làm việc với kho lưu trữ cục bộ một mình cũng như với kho lưu trữ từ xa. Để thực hành các lệnh cần thiết, bạn có thể giới hạn bản thân trong kho lưu trữ cục bộ. Nó chỉ lưu trữ cục bộ tất cả thông tin của dự án trong thư mục .git. Nếu chúng ta đang nói về kho lưu trữ từ xa, thì tất cả thông tin được lưu trữ ở đâu đó trên máy chủ từ xa: chỉ một bản sao của dự án được lưu trữ cục bộ. Những thay đổi được thực hiện đối với bản sao cục bộ của bạn có thể được đẩy (git push) vào kho lưu trữ từ xa. Trong cuộc thảo luận của chúng ta ở đây và bên dưới, chúng ta đang nói về việc làm việc với Git trong bảng điều khiển. Tất nhiên, bạn có thể sử dụng một số loại giải pháp dựa trên GUI (ví dụ: IntelliJ IDEA), nhưng trước tiên, bạn nên tìm hiểu những lệnh nào đang được thực thi và ý nghĩa của chúng.Làm việc với Git trong kho lưu trữ cục bộ
Tiếp theo, tôi khuyên bạn nên làm theo và thực hiện tất cả các bước mà tôi đã làm khi bạn đọc bài viết. Điều này sẽ cải thiện sự hiểu biết và nắm vững tài liệu của bạn. Vâng, bon ngon miệng! :) Để tạo một kho lưu trữ cục bộ, bạn cần viết:
git init

git status

- git add -A — thêm tất cả các tệp vào trạng thái "dàn dựng"
- git thêm . — thêm tất cả các tệp từ thư mục này và tất cả các thư mục con. Về cơ bản, cái này giống cái trước
- git add <tên tệp> — thêm một tệp cụ thể. Tại đây, bạn có thể sử dụng các biểu thức chính quy để thêm tệp theo một số mẫu. Ví dụ: git add *.java: Điều này có nghĩa là bạn chỉ muốn thêm các tệp có phần mở rộng java.
git add *.txt
Để kiểm tra trạng thái, chúng tôi sử dụng lệnh đã biết:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
Để xem xét tất cả các cam kết, hãy viết:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

Làm việc với .gitignore
Rõ ràng, chúng tôi chỉ muốn giữ riêng mã nguồn và không có gì khác trong kho lưu trữ. Vì vậy, những gì khác có thể có? Ở mức tối thiểu, các lớp và/hoặc tệp được biên dịch do môi trường phát triển tạo ra. Để yêu cầu Git bỏ qua chúng, chúng ta cần tạo một tệp đặc biệt. Thực hiện việc này: tạo một tệp có tên .gitignore trong thư mục gốc của dự án. Mỗi dòng trong tệp này đại diện cho một mẫu để bỏ qua. Trong ví dụ này, tệp .gitignore sẽ trông như thế này:
```
*.class
target/
*.iml
.idea/
```
Hãy cùng xem:
- Dòng đầu tiên là bỏ qua tất cả các tệp có phần mở rộng .class
- Dòng thứ hai là bỏ qua thư mục "đích" và mọi thứ chứa trong đó
- Dòng thứ ba là bỏ qua tất cả các tệp có phần mở rộng .iml
- Dòng thứ tư là bỏ qua thư mục .idea
git status


git add .gitignore
git commit -m "added .gitignore file"
Và bây giờ là thời điểm của sự thật: chúng tôi có một lớp GitTest.class đã biên dịch là "không bị theo dõi", mà chúng tôi không muốn thêm vào kho lưu trữ Git. Bây giờ chúng ta sẽ thấy tác dụng của tệp .gitignore:
git status

Làm việc với các chi nhánh và như vậy
Đương nhiên, làm việc chỉ trong một chi nhánh sẽ gây bất tiện cho các nhà phát triển đơn độc và điều đó là không thể khi có nhiều hơn một người trong nhóm. Đây là lý do tại sao chúng tôi có các chi nhánh. Như tôi đã nói trước đó, một nhánh chỉ là một con trỏ di động để xác nhận. Trong phần này, chúng ta sẽ khám phá cách làm việc trong các nhánh khác nhau: cách hợp nhất các thay đổi từ nhánh này sang nhánh khác, xung đột nào có thể phát sinh, v.v. Để xem danh sách tất cả các nhánh trong kho lưu trữ và hiểu bạn đang ở nhánh nào, bạn cần viết:
git branch -a

- tạo một nhánh mới dựa trên nhánh chúng tôi đang ở (99% trường hợp)
- tạo một nhánh dựa trên một cam kết cụ thể (1% trường hợp)
Hãy tạo một nhánh dựa trên một cam kết cụ thể
Chúng tôi sẽ dựa vào số nhận dạng duy nhất của cam kết. Để tìm thấy nó, chúng tôi viết:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Một nhánh được tạo chỉ với hai lần xác nhận đầu tiên từ nhánh chính. Để xác minh điều này, trước tiên chúng tôi đảm bảo chuyển sang một nhánh khác và xem số lần xác nhận ở đó:
git status
git log

git branch -a

Hãy tạo một nhánh dựa trên nhánh hiện tại
Cách thứ hai để tạo một nhánh là tạo nó từ một nhánh khác. Tôi muốn tạo một nhánh dựa trên nhánh chính. Đầu tiên, tôi cần chuyển sang nó, và bước tiếp theo là tạo một cái mới. Hãy cùng xem:- git checkout master — chuyển sang nhánh chính
- trạng thái git - xác minh rằng chúng tôi thực sự đang ở nhánh chính

git checkout -b feature/update-txt-files

giải quyết xung đột
Trước khi khám phá xung đột là gì, chúng ta cần nói về việc hợp nhất một nhánh với một nhánh khác. Hình này mô tả quá trình hợp nhất một nhánh với một nhánh khác:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
Mọi thứ đều rõ ràng cho đến nay, phải không? Hãy làm phức tạp tình hình: bây giờ giả sử rằng bạn cần thay đổi lại tệp txt. Nhưng bây giờ tệp này cũng sẽ được thay đổi trong nhánh chính. Nói cách khác, nó sẽ thay đổi song song. Git sẽ không thể biết phải làm gì khi chúng ta muốn hợp nhất mã mới của mình vào nhánh chính. Đi nào! Chúng tôi sẽ tạo một nhánh mới dựa trên master, thực hiện các thay đổi đối với text_resource.txt và tạo một cam kết cho công việc này:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
Và bây giờ là điểm thú vị nhất: chúng ta cần hợp nhất các thay đổi từ nhánh feature/add-header thành master. Chúng tôi đang ở trong nhánh chính, vì vậy chúng tôi chỉ cần viết:
git merge feature/add-header
Nhưng kết quả sẽ là xung đột trong tệp test_resource.txt: 

- Những thay đổi trên dòng này trong nhánh chính được tìm thấy giữa "<<<<<<< HEAD" và "=======".
- Các thay đổi trong nhánh tính năng/tiêu đề bổ sung được tìm thấy giữa "=======" và ">>>>>>> tính năng/tiêu đề bổ sung".

git status

git add *.txt

git commit

Làm việc với các kho lưu trữ từ xa
Bước cuối cùng là tìm ra thêm một số lệnh cần thiết để làm việc với kho lưu trữ từ xa. Như tôi đã nói, kho lưu trữ từ xa là một nơi mà kho lưu trữ được lưu trữ và từ đó bạn có thể sao chép nó. Có những loại kho lưu trữ từ xa nào? Ví dụ:-
GitHub là nền tảng lưu trữ lớn nhất cho các kho lưu trữ và phát triển hợp tác. Tôi đã mô tả nó trong các bài viết trước.
Theo dõi tôi trên GitHub . Tôi thường khoe công việc của mình ở đó trong những lĩnh vực mà tôi đang học để làm việc. -
GitLab là một công cụ dựa trên web dành cho vòng đời DevOps với mã nguồn mở . Nó là một hệ thống dựa trên Git để quản lý kho lưu trữ mã với wiki riêng, hệ thống theo dõi lỗi , đường dẫn CI/CD và các chức năng khác.
Sau thông tin Microsoft mua GitHub, một số nhà phát triển đã sao chép dự án của họ trong GitLab. -
BitBucket là một dịch vụ web để lưu trữ dự án và phát triển cộng tác dựa trên hệ thống kiểm soát phiên bản Mercurial và Git. Đã có lúc nó có lợi thế lớn so với GitHub ở chỗ nó cung cấp các kho lưu trữ riêng miễn phí. Năm ngoái, GitHub cũng đã giới thiệu miễn phí khả năng này cho mọi người.
-
Và như thế…
git clone https://github.com/romankh3/git-demo
Hiện tại đã có một bản sao cục bộ hoàn chỉnh của dự án. Để đảm bảo rằng bản sao cục bộ của dự án là mới nhất, bạn cần kéo dự án bằng cách viết:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
Lệnh để đẩy cái này vào kho lưu trữ từ xa là:
git push

liên kết hữu ích
- Tài liệu Git chính thức . Tôi đề nghị nó như một tài liệu tham khảo.
GO TO FULL VERSION