Git - Hướng dẫn nhanh

Hệ thống kiểm soát phiên bản

Version Control System (VCS) là một phần mềm giúp các nhà phát triển phần mềm làm việc cùng nhau và duy trì một lịch sử hoàn chỉnh về công việc của họ.

Dưới đây là các chức năng của VCS -

  • Cho phép các nhà phát triển làm việc đồng thời.
  • Không cho phép ghi đè các thay đổi của nhau.
  • Duy trì lịch sử của mọi phiên bản.

Sau đây là các loại VCS -

  • Hệ thống kiểm soát phiên bản tập trung (CVCS).
  • Hệ thống kiểm soát phiên bản phân tán / phi tập trung (DVCS).

Trong chương này, chúng tôi sẽ chỉ tập trung vào hệ thống điều khiển phiên bản phân tán và đặc biệt là trên Git. Git thuộc hệ thống kiểm soát phiên bản phân tán.

Hệ thống kiểm soát phiên bản phân tán

Hệ thống kiểm soát phiên bản tập trung (CVCS) sử dụng máy chủ trung tâm để lưu trữ tất cả các tệp và cho phép cộng tác nhóm. Nhưng nhược điểm lớn nhất của CVCS là điểm lỗi duy nhất của nó, tức là lỗi máy chủ trung tâm. Thật không may, nếu máy chủ trung tâm ngừng hoạt động trong một giờ, thì trong giờ đó, không ai có thể cộng tác cả. Và ngay cả trong trường hợp xấu nhất, nếu đĩa của máy chủ trung tâm bị hỏng và không có bản sao lưu thích hợp, thì bạn sẽ mất toàn bộ lịch sử của dự án. Ở đây, hệ thống kiểm soát phiên bản phân tán (DVCS) đã đi vào hình ảnh.

Máy khách DVCS không chỉ kiểm tra ảnh chụp nhanh mới nhất của thư mục mà họ còn phản chiếu đầy đủ kho lưu trữ. Nếu máy chủ gặp sự cố, thì kho lưu trữ từ bất kỳ máy khách nào cũng có thể được sao chép trở lại máy chủ để khôi phục nó. Mỗi lần kiểm tra là một bản sao lưu đầy đủ của kho lưu trữ. Git không dựa vào máy chủ trung tâm và đó là lý do tại sao bạn có thể thực hiện nhiều thao tác khi ngoại tuyến. Bạn có thể xác nhận các thay đổi, tạo nhánh, xem nhật ký và thực hiện các thao tác khác khi bạn ngoại tuyến. Bạn chỉ yêu cầu kết nối mạng để xuất bản các thay đổi của mình và thực hiện các thay đổi mới nhất.

Ưu điểm của Git

Nguồn mở và miễn phí

Git được phát hành theo giấy phép nguồn mở của GPL. Nó có sẵn miễn phí trên internet. Bạn có thể sử dụng Git để quản lý các dự án bất động sản mà không phải trả một xu nào. Vì nó là một mã nguồn mở, bạn có thể tải xuống mã nguồn của nó và cũng có thể thực hiện các thay đổi theo yêu cầu của bạn.

Nhanh và nhỏ

Vì hầu hết các hoạt động được thực hiện cục bộ, nó mang lại lợi ích to lớn về tốc độ. Git không dựa vào máy chủ trung tâm; đó là lý do tại sao, không cần phải tương tác với máy chủ từ xa cho mọi hoạt động. Phần cốt lõi của Git được viết bằng C, giúp tránh chi phí thời gian chạy liên quan đến các ngôn ngữ cấp cao khác. Mặc dù Git phản chiếu toàn bộ kho lưu trữ, nhưng kích thước của dữ liệu ở phía máy khách là nhỏ. Điều này minh họa hiệu quả của Git trong việc nén và lưu trữ dữ liệu ở phía máy khách.

Sao lưu ngầm

Cơ hội mất dữ liệu là rất hiếm khi có nhiều bản sao của nó. Dữ liệu hiện có trên bất kỳ phía máy khách nào phản ánh kho lưu trữ, do đó nó có thể được sử dụng trong trường hợp có sự cố hoặc hỏng đĩa.

Bảo vệ

Git sử dụng một hàm băm mật mã phổ biến được gọi là hàm băm an toàn (SHA1), để đặt tên và xác định các đối tượng trong cơ sở dữ liệu của nó. Mọi tệp và cam kết đều được tổng kiểm tra và truy xuất bằng tổng kiểm tra của nó tại thời điểm thanh toán. Nó ngụ ý rằng, không thể thay đổi tệp, ngày tháng và thông báo cam kết và bất kỳ dữ liệu nào khác từ cơ sở dữ liệu Git mà không biết Git.

Không cần phần cứng mạnh mẽ

Trong trường hợp CVCS, máy chủ trung tâm cần đủ mạnh để phục vụ các yêu cầu của toàn đội. Đối với các nhóm nhỏ hơn, đó không phải là một vấn đề, nhưng khi quy mô nhóm tăng lên, các giới hạn phần cứng của máy chủ có thể là một nút cổ chai về hiệu suất. Trong trường hợp DVCS, các nhà phát triển không tương tác với máy chủ trừ khi họ cần đẩy hoặc kéo các thay đổi. Tất cả các công việc nặng nhọc xảy ra ở phía máy khách, vì vậy phần cứng máy chủ có thể rất đơn giản.

Phân nhánh dễ dàng hơn

CVCS sử dụng cơ chế sao chép giá rẻ, Nếu chúng ta tạo một chi nhánh mới, nó sẽ sao chép tất cả các mã sang chi nhánh mới, vì vậy rất mất thời gian và không hiệu quả. Ngoài ra, việc xóa và sáp nhập các chi nhánh trong CVCS cũng phức tạp và mất nhiều thời gian. Nhưng quản lý chi nhánh với Git rất đơn giản. Chỉ mất vài giây để tạo, xóa và hợp nhất các nhánh.

Thuật ngữ DVCS

Kho lưu trữ cục bộ

Mọi công cụ VCS đều cung cấp một nơi làm việc riêng như một bản sao làm việc. Các nhà phát triển thực hiện các thay đổi tại nơi làm việc riêng tư của họ và sau khi cam kết, những thay đổi này sẽ trở thành một phần của kho lưu trữ. Git tiến thêm một bước nữa bằng cách cung cấp cho họ một bản sao riêng của toàn bộ kho lưu trữ. Người dùng có thể thực hiện nhiều thao tác với kho lưu trữ này như thêm tệp, xóa tệp, đổi tên tệp, di chuyển tệp, cam kết thay đổi, v.v.

Thư mục làm việc và khu vực hoặc chỉ mục làm việc

Thư mục làm việc là nơi kiểm tra các tập tin. Trong các CVCS khác, các nhà phát triển thường thực hiện các sửa đổi và cam kết các thay đổi của họ trực tiếp với kho lưu trữ. Nhưng Git sử dụng một chiến lược khác. Git không theo dõi từng tệp được sửa đổi. Bất cứ khi nào bạn thực hiện một thao tác, Git sẽ tìm kiếm các tệp hiện diện trong khu vực dàn dựng. Chỉ những tệp có trong khu vực tổ chức mới được xem xét để cam kết và không phải tất cả các tệp đã sửa đổi.

Hãy để chúng tôi xem quy trình làm việc cơ bản của Git.

Step 1 - Bạn sửa đổi một tệp từ thư mục làm việc.

Step 2 - Bạn thêm các tệp này vào khu vực dàn dựng.

Step 3- Bạn thực hiện thao tác cam kết để di chuyển các tệp khỏi khu vực dàn dựng. Sau thao tác đẩy, nó sẽ lưu trữ các thay đổi vĩnh viễn vào kho lưu trữ Git.

Giả sử bạn đã sửa đổi hai tệp, cụ thể là “sort.c” và “search.c” và bạn muốn có hai cam kết khác nhau cho mỗi thao tác. Bạn có thể thêm một tệp trong khu vực dàn dựng và thực hiện cam kết. Sau lần cam kết đầu tiên, hãy lặp lại quy trình tương tự cho tệp khác.

# First commit
[bash]$ git add sort.c # adds file to the staging area [bash]$ git commit –m “Added sort operation”

# Second commit
[bash]$ git add search.c # adds file to the staging area [bash]$ git commit –m “Added search operation”

Blobs

Blob là viết tắt của Bcây hoàng yến Large Object. Mỗi phiên bản của một tệp được đại diện bởi các đốm màu. Một blob giữ dữ liệu tệp nhưng không chứa bất kỳ siêu dữ liệu nào về tệp. Nó là một tệp nhị phân và trong cơ sở dữ liệu Git, nó được đặt tên là hàm băm SHA1 của tệp đó. Trong Git, các tệp không được giải quyết bằng tên. Mọi thứ đều được giải quyết bằng nội dung.

Cây

Cây là một đối tượng, đại diện cho một thư mục. Nó chứa các đốm màu cũng như các thư mục con khác. Cây là một tệp nhị phân lưu trữ các tham chiếu đến các đốm màu và cây cũng được đặt tên làSHA1 băm của đối tượng cây.

Cam kết

Cam kết giữ trạng thái hiện tại của kho lưu trữ. Một cam kết cũng được đặt tên bởiSHA1băm. Bạn có thể coi một đối tượng cam kết là một nút của danh sách liên kết. Mọi đối tượng cam kết đều có một con trỏ đến đối tượng cam kết chính. Từ một cam kết nhất định, bạn có thể xem lại bằng cách nhìn vào con trỏ mẹ để xem lịch sử của cam kết. Nếu một cam kết có nhiều cam kết mẹ, thì cam kết cụ thể đó đã được tạo bằng cách hợp nhất hai nhánh.

Chi nhánh

Các nhánh được sử dụng để tạo ra một dòng phát triển khác. Theo mặc định, Git có một nhánh chính, giống như nhánh trong Subversion. Thông thường, một nhánh được tạo để hoạt động trên một tính năng mới. Khi tính năng được hoàn thành, nó được hợp nhất trở lại với nhánh chính và chúng tôi xóa nhánh. Mọi chi nhánh đều được tham chiếu bởi HEAD, nó trỏ đến cam kết mới nhất trong chi nhánh. Bất cứ khi nào bạn thực hiện cam kết, HEAD đều được cập nhật bản cam kết mới nhất.

Thẻ

Thẻ gán một tên có ý nghĩa với một phiên bản cụ thể trong kho lưu trữ. Các thẻ rất giống với các nhánh, nhưng sự khác biệt là các thẻ là bất biến. Nó có nghĩa là, thẻ là một nhánh, không ai có ý định sửa đổi. Khi một thẻ được tạo cho một cam kết cụ thể, ngay cả khi bạn tạo một cam kết mới, nó sẽ không được cập nhật. Thông thường, các nhà phát triển tạo thẻ cho các bản phát hành sản phẩm.

Nhân bản

Hoạt động sao chép tạo ra thể hiện của kho lưu trữ. Hoạt động sao chép không chỉ kiểm tra bản sao đang hoạt động, mà nó còn phản chiếu kho lưu trữ hoàn chỉnh. Người dùng có thể thực hiện nhiều thao tác với kho lưu trữ cục bộ này. Thời gian duy nhất mạng được tham gia là khi các phiên bản kho lưu trữ đang được đồng bộ hóa.

Kéo

Thao tác kéo sao chép các thay đổi từ phiên bản kho lưu trữ từ xa sang phiên bản cục bộ. Thao tác kéo được sử dụng để đồng bộ hóa giữa hai phiên bản kho lưu trữ. Thao tác này giống như thao tác cập nhật trong Subversion.

Đẩy

Hoạt động đẩy sao chép các thay đổi từ phiên bản kho lưu trữ cục bộ sang phiên bản từ xa. Điều này được sử dụng để lưu trữ các thay đổi vĩnh viễn vào kho lưu trữ Git. Điều này giống như hoạt động cam kết trong Subversion.

CÁI ĐẦU

HEAD là một con trỏ, luôn trỏ đến cam kết mới nhất trong nhánh. Bất cứ khi nào bạn thực hiện cam kết, HEAD đều được cập nhật bản cam kết mới nhất. Những người đứng đầu các chi nhánh được lưu trữ trong.git/refs/heads/ danh mục.

[CentOS]$ ls -1 .git/refs/heads/ master [CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49

Bản sửa đổi

Bản sửa đổi đại diện cho phiên bản của mã nguồn. Các bản sửa đổi trong Git được thể hiện bằng các cam kết. Những cam kết này được xác định bởiSHA1 hàm băm an toàn.

URL

URL đại diện cho vị trí của kho lưu trữ Git. URL Git được lưu trữ trong tệp cấu hình.

[tom@CentOS tom_repo]$ pwd /home/tom/tom_repo [tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:project.git
fetch = +refs/heads/*:refs/remotes/origin/*

Trước khi có thể sử dụng Git, bạn phải cài đặt và thực hiện một số thay đổi cấu hình cơ bản. Dưới đây là các bước để cài đặt ứng dụng khách Git trên Ubuntu và Centos Linux.

Cài đặt Git Client

Nếu bạn đang sử dụng bản phân phối GNU / Linux cơ sở Debian, thì apt-get lệnh sẽ làm những điều cần thiết.

[ubuntu ~]$ sudo apt-get install git-core [sudo] password for ubuntu: [ubuntu ~]$ git --version
git version 1.8.1.2

Và nếu bạn đang sử dụng phân phối GNU / Linux dựa trên RPM, thì hãy sử dụng yum lệnh như đã cho.

[CentOS ~]$
su -
Password:

[CentOS ~]# yum -y install git-core

[CentOS ~]# git --version
git version 1.7.1

Tùy chỉnh môi trường Git

Git cung cấp công cụ cấu hình git, cho phép bạn thiết lập các biến cấu hình. Git lưu trữ tất cả các cấu hình toàn cầu trong.gitconfigtập tin này nằm trong thư mục chính của bạn. Để đặt các giá trị cấu hình này là chung, hãy thêm--global tùy chọn, và nếu bạn bỏ qua --global , thì cấu hình của bạn là cụ thể cho kho lưu trữ Git hiện tại.

Bạn cũng có thể thiết lập cấu hình toàn hệ thống. Git lưu trữ các giá trị này trong/etc/gitconfigtệp, chứa cấu hình cho mọi người dùng và kho lưu trữ trên hệ thống. Để đặt các giá trị này, bạn phải có quyền gốc và sử dụng--system Lựa chọn.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Đặt tên người dùng

Thông tin này được sử dụng bởi Git cho mỗi lần cam kết.

[jerry@CentOS project]$ git config --global user.name "Jerry Mouse"

Đặt id email

Thông tin này được sử dụng bởi Git cho mỗi lần cam kết.

[jerry@CentOS project]$ git config --global user.email "[email protected]"

Tránh các cam kết hợp nhất để kéo

Bạn lấy các thay đổi mới nhất từ ​​kho lưu trữ từ xa và nếu những thay đổi này khác nhau, thì theo mặc định, Git sẽ tạo các cam kết hợp nhất. Chúng tôi có thể tránh điều này thông qua các cài đặt sau.

jerry@CentOS project]$ git config --global branch.autosetuprebase always

Tô màu

Các lệnh sau cho phép tô sáng màu cho Git trong bảng điều khiển.

[jerry@CentOS project]$ git config --global color.ui true [jerry@CentOS project]$ git config --global color.status auto

[jerry@CentOS project]$ git config --global color.branch auto

Đặt trình chỉnh sửa mặc định

Theo mặc định, Git sử dụng trình soạn thảo mặc định của hệ thống, được lấy từ biến môi trường VISUAL hoặc EDITOR. Chúng ta có thể cấu hình một cái khác bằng cách sử dụng git config.

[jerry@CentOS project]$ git config --global core.editor vim

Đặt công cụ hợp nhất mặc định

Git không cung cấp công cụ hợp nhất mặc định để tích hợp các thay đổi xung đột vào cây làm việc của bạn. Chúng tôi có thể đặt công cụ hợp nhất mặc định bằng cách bật các cài đặt sau.

[jerry@CentOS project]$ git config --global merge.tool vimdiff

Cài đặt danh sách Git

Để xác minh cài đặt Git của kho lưu trữ cục bộ, hãy sử dụng git config –list lệnh như dưới đây.

[jerry@CentOS ~]$ git config --list

Lệnh trên sẽ cho kết quả như sau.

user.name=Jerry Mouse
[email protected]
push.default=nothing
branch.autosetuprebase=always
color.ui=true
color.status=auto
color.branch=auto
core.editor=vim
merge.tool=vimdiff

Trong chương này, chúng ta sẽ thảo luận về vòng đời của Git. Trong các chương sau, chúng tôi sẽ đề cập đến các lệnh Git cho từng thao tác.

Quy trình làm việc chung như sau:

  • Bạn sao chép kho lưu trữ Git như một bản sao đang hoạt động.

  • Bạn sửa đổi bản sao làm việc bằng cách thêm / chỉnh sửa tệp.

  • Nếu cần, bạn cũng cập nhật bản sao làm việc bằng cách thực hiện các thay đổi của nhà phát triển khác.

  • Bạn xem lại các thay đổi trước khi cam kết.

  • Bạn cam kết các thay đổi. Nếu mọi thứ đều ổn, thì bạn đẩy các thay đổi vào kho lưu trữ.

  • Sau khi cam kết, nếu bạn nhận ra điều gì đó không ổn, thì bạn sửa lần cam kết cuối cùng và đẩy các thay đổi vào kho lưu trữ.

Dưới đây là sự trình bày bằng hình ảnh của quy trình làm việc.

Trong chương này, chúng ta sẽ xem cách tạo một kho lưu trữ Git từ xa; từ bây giờ, chúng tôi sẽ gọi nó là Git Server. Chúng tôi cần một máy chủ Git để cho phép cộng tác nhóm.

Tạo người dùng mới

# add new group
[root@CentOS ~]# groupadd dev

# add new user
[root@CentOS ~]# useradd -G devs -d /home/gituser -m -s /bin/bash gituser

# change password
[root@CentOS ~]# passwd gituser

Lệnh trên sẽ cho kết quả như sau.

Changing password for user gituser.
New password:
Retype new password:
passwd: all authentication token updated successfully.

Tạo kho lưu trữ trần

Hãy để chúng tôi khởi tạo một kho lưu trữ mới bằng cách sử dụng init lệnh theo sau bởi --bareLựa chọn. Nó khởi tạo kho lưu trữ mà không có thư mục làm việc. Theo quy ước, kho lưu trữ trống phải được đặt tên là.git.

[gituser@CentOS ~]$ pwd /home/gituser [gituser@CentOS ~]$ mkdir project.git

[gituser@CentOS ~]$ cd project.git/ [gituser@CentOS project.git]$ ls

[gituser@CentOS project.git]$ git --bare init Initialized empty Git repository in /home/gituser-m/project.git/ [gituser@CentOS project.git]$ ls
branches config description HEAD hooks info objects refs

Tạo cặp khóa RSA công khai / riêng tư

Hãy để chúng tôi hướng dẫn về quá trình định cấu hình máy chủ Git, ssh-keygen tiện ích tạo cặp khóa RSA công khai / riêng tư, mà chúng tôi sẽ sử dụng để xác thực người dùng.

Mở một thiết bị đầu cuối và nhập lệnh sau và chỉ cần nhấn enter cho mỗi đầu vào. Sau khi hoàn thành thành công, nó sẽ tạo ra một.ssh thư mục bên trong thư mục chính.

tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ ssh-keygen

Lệnh trên sẽ cho kết quả như sau.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/tom/.ssh/id_rsa): Press Enter Only
Created directory '/home/tom/.ssh'.
Enter passphrase (empty for no passphrase): ---------------> Press Enter Only
Enter same passphrase again: ------------------------------> Press Enter Only
Your identification has been saved in /home/tom/.ssh/id_rsa.
Your public key has been saved in /home/tom/.ssh/id_rsa.pub.
The key fingerprint is:
df:93:8c:a1:b8:b7:67:69:3a:1f:65:e8:0e:e9:25:a1 tom@CentOS
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
|
.
|
| Soo |
| o*B. |
| E = *.= |
| oo==. . |
| ..+Oo
|
+-----------------+

ssh-keygen đã tạo hai khóa, khóa đầu tiên là riêng tư (tức là id_rsa) và khóa thứ hai là công khai (tức là, id_rsa.pub).

Note: Không bao giờ chia sẻ KHÓA RIÊNG TƯ của bạn với người khác.

Thêm khóa vào các phím được ủy quyền

Giả sử có hai nhà phát triển làm việc trong một dự án, đó là Tom và Jerry. Cả hai người dùng đã tạo khóa công khai. Hãy để chúng tôi xem cách sử dụng các khóa này để xác thực.

Tom đã thêm khóa công khai của mình vào máy chủ bằng cách sử dụng ssh-copy-id lệnh như dưới đây -

[tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

Lệnh trên sẽ cho kết quả như sau.

[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Tương tự, Jerry đã thêm khóa công khai của mình vào máy chủ bằng cách sử dụng lệnh ssh-copy-id.

[jerry@CentOS ~]$ pwd /home/jerry [jerry@CentOS ~]$ ssh-copy-id -i ~/.ssh/id_rsa [email protected]

Lệnh trên sẽ cho kết quả như sau.

[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Đẩy các thay đổi vào Kho lưu trữ

Chúng tôi đã tạo một kho lưu trữ trống trên máy chủ và cho phép hai người dùng truy cập. Từ bây giờ, Tom và Jerry có thể đẩy các thay đổi của họ vào kho lưu trữ bằng cách thêm nó làm điều khiển từ xa.

Lệnh Git init tạo .git thư mục để lưu trữ siêu dữ liệu về kho lưu trữ mỗi khi nó đọc cấu hình từ .git/config tập tin.

Tom tạo một thư mục mới, thêm tệp README và cam kết thay đổi của mình như cam kết ban đầu. Sau khi cam kết, anh ta xác minh thông báo cam kết bằng cách chạygit log chỉ huy.

[tom@CentOS ~]$ pwd /home/tom [tom@CentOS ~]$ mkdir tom_repo

[tom@CentOS ~]$ cd tom_repo/ [tom@CentOS tom_repo]$ git init
Initialized empty Git repository in /home/tom/tom_repo/.git/

[tom@CentOS tom_repo]$ echo 'TODO: Add contents for README' > README [tom@CentOS tom_repo]$ git status -s
?? README

[tom@CentOS tom_repo]$ git add . [tom@CentOS tom_repo]$ git status -s
A README

[tom@CentOS tom_repo]$ git commit -m 'Initial commit'

Lệnh trên sẽ cho kết quả như sau.

[master (root-commit) 19ae206] Initial commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 README

Tom kiểm tra thông báo nhật ký bằng cách thực hiện lệnh git log.

[tom@CentOS tom_repo]$ git log

Lệnh trên sẽ cho kết quả như sau.

commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Tom đã cam kết các thay đổi của mình với kho lưu trữ cục bộ. Bây giờ, đã đến lúc đẩy các thay đổi vào kho lưu trữ từ xa. Nhưng trước đó, chúng ta phải thêm kho lưu trữ dưới dạng điều khiển từ xa, đây là thao tác một lần. Sau đó, anh ta có thể đẩy các thay đổi vào kho lưu trữ từ xa một cách an toàn.

Note- Theo mặc định, Git chỉ đẩy đến các nhánh phù hợp: Đối với mọi nhánh tồn tại ở phía cục bộ, phía từ xa sẽ được cập nhật nếu một nhánh có cùng tên đã tồn tại ở đó. Trong hướng dẫn của chúng tôi, mỗi khi chúng tôi đẩy các thay đổi đối vớiorigin master chi nhánh, sử dụng tên chi nhánh thích hợp theo yêu cầu của bạn.

[tom@CentOS tom_repo]$ git remote add origin [email protected]:project.git [tom@CentOS tom_repo]$ git push origin master

Lệnh trên sẽ cho kết quả như sau.

Counting objects: 3, done.
Writing objects: 100% (3/3), 242 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
master −> master

Bây giờ, các thay đổi đã được cam kết thành công vào kho lưu trữ từ xa.

Chúng tôi có một kho lưu trữ trống trên máy chủ Git và Tom cũng đã đẩy phiên bản đầu tiên của mình. Bây giờ, Jerry có thể xem các thay đổi của mình. Thao tác nhân bản tạo ra một thể hiện của kho lưu trữ từ xa.

Jerry tạo một thư mục mới trong thư mục chính của mình và thực hiện thao tác nhân bản.

[jerry@CentOS ~]$ mkdir jerry_repo [jerry@CentOS ~]$ cd jerry_repo/

[jerry@CentOS jerry_repo]$ git clone [email protected]:project.git

Lệnh trên sẽ cho kết quả như sau.

Initialized empty Git repository in /home/jerry/jerry_repo/project/.git/
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 241 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)

Jerry thay đổi thư mục thành kho lưu trữ cục bộ mới và liệt kê nội dung thư mục của nó.

[jerry@CentOS jerry_repo]$ cd project/

[jerry@CentOS jerry_repo]$ ls
README

Jerry sao chép kho lưu trữ và quyết định thực hiện các hoạt động chuỗi cơ bản. Vì vậy, anh ấy tạo tệp string.c. Sau khi thêm nội dung, string.c sẽ trông như sau:

#include <stdio.h>

int my_strlen(char *s)
{
   char *p = s;

   while (*p)
      ++p;

   return (p - s);
}

int main(void)
{
   int i;
   char *s[] = 
   {
      "Git tutorials",
      "Tutorials Point"
   };

   for (i = 0; i < 2; ++i)
      
   printf("string lenght of %s = %d\n", s[i], my_strlen(s[i]));

   return 0;
}

Anh ấy đã biên dịch và kiểm tra mã của mình và mọi thứ đều hoạt động tốt. Bây giờ, anh ấy có thể thêm những thay đổi này vào kho lưu trữ một cách an toàn.

Thao tác thêm Git thêm tệp vào vùng dàn dựng.

[jerry@CentOS project]$ git status -s
?? string
?? string.c

[jerry@CentOS project]$ git add string.c

Git đang hiển thị một dấu chấm hỏi trước tên tệp. Rõ ràng, những tệp này không phải là một phần của Git, và đó là lý do tại sao Git không biết phải làm gì với những tệp này. Đó là lý do tại sao, Git hiển thị dấu chấm hỏi trước tên tệp.

Jerry đã thêm tệp vào vùng lưu trữ, lệnh git status sẽ hiển thị các tệp có trong vùng dàn.

[jerry@CentOS project]$ git status -s
A string.c
?? string

Để thực hiện các thay đổi, anh ta đã sử dụng lệnh git commit theo sau là tùy chọn –m. Nếu chúng ta bỏ qua tùy chọn –m. Git sẽ mở một trình soạn thảo văn bản, nơi chúng ta có thể viết thông báo cam kết nhiều dòng.

[jerry@CentOS project]$ git commit -m 'Implemented my_strlen function'

Lệnh trên sẽ cho kết quả sau:

[master cbe1249] Implemented my_strlen function
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 string.c

Sau khi cam kết xem chi tiết nhật ký, anh ta chạy lệnh git log. Nó sẽ hiển thị thông tin của tất cả các cam kết với ID cam kết, tác giả cam kết, ngày cam kết vàSHA-1 băm của cam kết.

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Sau khi xem chi tiết cam kết, Jerry nhận ra rằng độ dài chuỗi không thể là số âm, đó là lý do tại sao anh ta quyết định thay đổi kiểu trả về của hàm my_strlen.

Jerry sử dụng git log lệnh để xem chi tiết nhật ký.

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả như sau.

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function

Jerry sử dụng git showlệnh để xem chi tiết cam kết. Lệnh git show mấtSHA-1 cam kết ID như một tham số.

[jerry@CentOS project]$ git show cbe1249b140dad24b2c35b15cc7e26a6f02d2277

Lệnh trên sẽ cho kết quả sau:

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


diff --git a/string.c b/string.c
new file mode 100644
index 0000000..187afb9
--- /dev/null
+++ b/string.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+
+int my_strlen(char *s)
+{
   +
   char *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p -s );
   +
}
+

Anh ta thay đổi kiểu trả về của hàm từ int thành size_t. Sau khi kiểm tra mã, anh ấy xem xét các thay đổi của mình bằng cách chạygit diff chỉ huy.

[jerry@CentOS project]$ git diff

Lệnh trên sẽ cho kết quả sau:

diff --git a/string.c b/string.c
index 187afb9..7da2992 100644
--- a/string.c
+++ b/string.c
@@ -1,6 +1,6 @@
#include <stdio.h>

-int my_strlen(char *s)
+size_t my_strlen(char *s)
{
   char *p = s;
   @@ -18,7 +18,7 @@ int main(void)
};
for (i = 0; i < 2; ++i)
{
   - printf("string lenght of %s = %d\n", s[i], my_strlen(s[i]));
   + printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
   return 0;
}

Git khác biệt cho thấy '+' ký tên trước các dòng mới được thêm vào và '−' cho các dòng đã xóa.

Jerry đã thực hiện các thay đổi và anh ấy muốn sửa lại lần cam kết cuối cùng của mình. Trong trường hợp này,git amendhoạt động sẽ giúp ích. Thao tác sửa đổi thay đổi cam kết cuối cùng bao gồm thông báo cam kết của bạn; nó tạo ra một ID cam kết mới.

Trước khi sửa đổi hoạt động, anh ta kiểm tra nhật ký cam kết.

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả như sau.

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Implemented my_strlen function


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Jerry cam kết các thay đổi mới với - hoạt động sửa đổi và xem nhật ký cam kết.

[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git add string.c

[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git commit --amend -m 'Changed return type of my_strlen to size_t'
[master d1e19d3] Changed return type of my_strlen to size_t
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 string.c

Bây giờ, git log sẽ hiển thị thông báo cam kết mới với ID cam kết mới -

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả như sau.

commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Jerry đã sửa đổi cam kết cuối cùng của mình bằng cách sử dụng thao tác sửa đổi và anh ấy sẵn sàng thực hiện các thay đổi. Hoạt động Đẩy lưu trữ dữ liệu vĩnh viễn vào kho lưu trữ Git. Sau một hoạt động đẩy thành công, các nhà phát triển khác có thể thấy các thay đổi của Jerry.

Anh ta thực hiện lệnh git log để xem chi tiết cam kết.

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t

Trước khi thao tác đẩy, anh ấy muốn xem lại các thay đổi của mình, vì vậy anh ấy sử dụng git show lệnh để xem xét các thay đổi của mình.

[jerry@CentOS project]$ git show d1e19d316224cddc437e3ed34ec3c931ad803958

Lệnh trên sẽ cho kết quả sau:

commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t

diff --git a/string.c b/string.c
new file mode 100644
index 0000000..7da2992
--- /dev/null
+++ b/string.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+
+size_t my_strlen(char *s)
+
{
   +
   char *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p -s );
   +
}
+
+int main(void)
+
{
   + int i;
   + char *s[] = 
   {
      + "Git tutorials",
      + "Tutorials Point"
      +
   };
   +
   +
   +
   for (i = 0; i < 2; ++i)
   printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
   +
   +
   return 0;
   +
}

Jerry hài lòng với những thay đổi của mình và anh ấy sẵn sàng thúc đẩy những thay đổi của mình.

[jerry@CentOS project]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 517 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
19ae206..d1e19d3 master −> master

Các thay đổi của Jerry đã được đẩy thành công vào kho lưu trữ; bây giờ các nhà phát triển khác có thể xem các thay đổi của anh ấy bằng cách thực hiện thao tác nhân bản hoặc cập nhật.

Sửa đổi chức năng hiện có

Tom thực hiện thao tác sao chép và tìm một tệp mới string.c. Anh ta muốn biết ai đã thêm tệp này vào kho lưu trữ và cho mục đích gì, vì vậy, anh ta thực hiệngit log chỉ huy.

[tom@CentOS ~]$ git clone [email protected]:project.git

Lệnh trên sẽ cho kết quả sau:

Initialized empty Git repository in /home/tom/project/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 726 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)

Thao tác Clone sẽ tạo một thư mục mới bên trong thư mục làm việc hiện tại. Anh ta thay đổi thư mục thành thư mục mới được tạo và thực hiệngit log chỉ huy.

[tom@CentOS ~]$ cd project/

[tom@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Sau khi quan sát nhật ký, anh nhận ra rằng tệp string.c đã được thêm vào bởi Jerry để thực hiện các hoạt động chuỗi cơ bản. Anh ấy tò mò về mật mã của Jerry. Vì vậy, anh ấy mở string.c trong trình soạn thảo văn bản và ngay lập tức tìm thấy một lỗi. Trong hàm my_strlen, Jerry không sử dụng con trỏ hằng. Vì vậy, anh ấy quyết định sửa đổi mã của Jerry. Sau khi sửa đổi, mã trông như sau:

[tom@CentOS project]$ git diff

Lệnh trên sẽ cho kết quả sau:

diff --git a/string.c b/string.c
index 7da2992..32489eb 100644
--- a/string.c
+++ b/string.c
@@ -1,8 +1,8 @@
#include <stdio.h>
-size_t my_strlen(char *s)
+size_t my_strlen(const char *s)
{
   - char *p = s;
   + const char *p = s;
   while (*p)
   ++p;
}

Sau khi thử nghiệm, anh ấy cam kết thay đổi của mình.

[tom@CentOS project]$ git status -s M string.c ?? string [tom@CentOS project]$ git add string.c

[tom@CentOS project]$ git commit -m 'Changed char pointer to const char pointer' [master cea2c00] Changed char pointer to const char pointer 1 files changed, 2 insertions(+), 2 deletions(-) [tom@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit cea2c000f53ba99508c5959e3e12fff493b
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 08:32:07 2013 +0530

Changed char pointer to const char pointer


commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit

Tom sử dụng lệnh git push để đẩy các thay đổi của mình.

[tom@CentOS project]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 336 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
d1e19d3..cea2c00 master −> master

Thêm chức năng mới

Trong khi đó, Jerry quyết định thực hiện string comparechức năng. Vì vậy, anh ta sửa đổi string.c. Sau khi sửa đổi, tệp trông như sau:

[jerry@CentOS project]$ git diff

Lệnh trên sẽ cho kết quả sau:

index 7da2992..bc864ed 100644
--- a/string.c
+++ b/string.c
30Git Tutorials
@@ -9,9 +9,20 @@ size_t my_strlen(char *s)
return (p -s );
}
+char *my_strcpy(char *t, char *s)
+
{
   +
   char *p = t;
   +
   + while (*t++ = *s++)
   + ;
   +
   +
   return p;
   +
}
+
int main(void)
{
   int i; 
   +
   char p1[32];
   char *s[] = 
   {
      "Git tutorials",
      "Tutorials Point"
      @@ -20,5 +31,7 @@ int main(void)
      for (i = 0; i < 2; ++i)
      printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i]));
      +
      printf("%s\n", my_strcpy(p1, "Hello, World !!!"));
      +
      return 0;
   }
}

Sau khi thử nghiệm, anh ấy đã sẵn sàng để thúc đẩy sự thay đổi của mình.

[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git add string.c

[jerry@CentOS project]$ git commit -m "Added my_strcpy function"
[master e944e5a] Added my_strcpy function
1 files changed, 13 insertions(+), 0 deletions(-)

Trước khi hoạt động đẩy, anh ta xác minh cam kết bằng cách xem thông báo nhật ký.

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit e944e5aab74b26e7447d3281b225309e4e59efcd
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:41:42 2013 +0530

Added my_strcpy function


commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530

Initial commit

Jerry hài lòng với những thay đổi và anh ấy muốn thúc đẩy những thay đổi của mình.

[jerry@CentOS project]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

To [email protected]:project.git
! [rejected]
master −> master (non-fast-forward)
error: failed to push some refs to '[email protected]:project.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.

Nhưng Git không cho phép Jerry thúc đẩy những thay đổi của mình. Vì Git xác định rằng kho lưu trữ từ xa và kho lưu trữ cục bộ của Jerry không đồng bộ. Vì điều này, anh ta có thể làm mất lịch sử của dự án. Để tránh tình trạng lộn xộn này, Git đã không thực hiện được thao tác này. Bây giờ, Jerry phải cập nhật kho lưu trữ cục bộ đầu tiên và chỉ sau đó, anh ta có thể đẩy các thay đổi của riêng mình.

Tìm nạp các thay đổi mới nhất

Jerry thực hiện lệnh git pull để đồng bộ hóa kho lưu trữ cục bộ của mình với kho lưu trữ từ xa.

[jerry@CentOS project]$ git pull

Lệnh trên sẽ cho kết quả sau:

remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git.server.com:project
d1e19d3..cea2c00 master −> origin/master
First, rewinding head to replay your work on top of it...
Applying: Added my_strcpy function

Sau khi thao tác kéo, Jerry kiểm tra thông báo nhật ký và tìm chi tiết cam kết của Tom với ID cam kết cea2c000f53ba99508c5959e3e12fff493ba6f69

[jerry@CentOS project]$ git log

Lệnh trên sẽ cho kết quả sau:

commit e86f0621c2a3f68190bba633a9fe6c57c94f8e4f
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:41:42 2013 +0530

Added my_strcpy function


commit cea2c000f53ba99508c5959e3e12fff493ba6f69
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 08:32:07 2013 +0530

Changed char pointer to const char pointer


commit d1e19d316224cddc437e3ed34ec3c931ad803958
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 08:05:26 2013 +0530

Changed return type of my_strlen to size_t


commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 07:32:56 2013 +0530
Initial commit

Bây giờ, kho lưu trữ cục bộ của Jerry được đồng bộ hoàn toàn với kho lưu trữ từ xa. Vì vậy, anh ấy có thể đẩy các thay đổi của mình một cách an toàn.

[jerry@CentOS project]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 455 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
cea2c00..e86f062 master −> master

Giả sử bạn đang triển khai một tính năng mới cho sản phẩm của mình. Mã của bạn đang được xử lý và đột nhiên có khách hàng báo cáo. Do đó, bạn phải tạm gác công việc tính năng mới của mình trong vài giờ. Bạn không thể cam kết một phần mã của mình và cũng không thể vứt bỏ các thay đổi của mình. Vì vậy, bạn cần một số không gian tạm thời, nơi bạn có thể lưu trữ các thay đổi từng phần của mình và sau này cam kết.

Trong Git, thao tác lưu trữ lấy các tệp được theo dõi đã sửa đổi của bạn, các thay đổi giai đoạn và lưu chúng vào một chồng các thay đổi chưa hoàn thành mà bạn có thể áp dụng lại bất kỳ lúc nào.

[jerry@CentOS project]$ git status -s
M string.c
?? string

Bây giờ, bạn muốn chuyển các nhánh để nâng cao khách hàng, nhưng bạn chưa muốn cam kết những gì bạn đang làm; vì vậy bạn sẽ lưu trữ các thay đổi. Để đẩy một kho mới vào ngăn xếp của bạn, hãy chạygit stash chỉ huy.

[jerry@CentOS project]$ git stash
Saved working directory and index state WIP on master: e86f062 Added my_strcpy function
HEAD is now at e86f062 Added my_strcpy function

Bây giờ, thư mục làm việc của bạn đã sạch sẽ và tất cả các thay đổi được lưu trên một ngăn xếp. Hãy để chúng tôi xác minh điều đó vớigit status chỉ huy.

[jerry@CentOS project]$ git status -s
?? string

Bây giờ bạn có thể yên tâm chuyển chi nhánh và làm việc ở nơi khác. Chúng tôi có thể xem danh sách các thay đổi được lưu trữ bằng cách sử dụnggit stash list chỉ huy.

[jerry@CentOS project]$ git stash list
stash@{0}: WIP on master: e86f062 Added my_strcpy function

Giả sử bạn đã giải quyết vấn đề khách hàng và bạn quay lại tính năng mới để tìm kiếm mã đã hoàn thành, chỉ cần thực thi git stash pop để xóa các thay đổi khỏi ngăn xếp và đặt chúng vào thư mục làm việc hiện tại.

[jerry@CentOS project]$ git status -s ?? string [jerry@CentOS project]$ git stash pop

Lệnh trên sẽ cho kết quả sau:

# On branch master
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
#
modified: string.c
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
#
string
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (36f79dfedae4ac20e2e8558830154bd6315e72d4)

[jerry@CentOS project]$ git status -s
M string.c
?? string

Như tên cho thấy, hoạt động di chuyển di chuyển một thư mục hoặc một tệp từ vị trí này sang vị trí khác. Tom quyết định chuyển mã nguồn vàosrcdanh mục. Cấu trúc thư mục được sửa đổi sẽ xuất hiện như sau:

[tom@CentOS project]$ pwd
/home/tom/project

[tom@CentOS project]$ ls README string string.c [tom@CentOS project]$ mkdir src

[tom@CentOS project]$ git mv string.c src/ [tom@CentOS project]$ git status -s
R string.c −> src/string.c
?? string

Để thực hiện những thay đổi này vĩnh viễn, chúng tôi phải đẩy cấu trúc thư mục đã sửa đổi vào kho lưu trữ từ xa để các nhà phát triển khác có thể thấy điều này.

[tom@CentOS project]$ git commit -m "Modified directory structure" [master 7d9ea97] Modified directory structure 1 files changed, 0 insertions(+), 0 deletions(-) rename string.c => src/string.c (100%) [tom@CentOS project]$ git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 320 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
e86f062..7d9ea97 master −> master

Trong kho lưu trữ cục bộ của Jerry, trước khi thực hiện thao tác kéo, nó sẽ hiển thị cấu trúc thư mục cũ.

[jerry@CentOS project]$ pwd /home/jerry/jerry_repo/project [jerry@CentOS project]$ ls
README string string.c

Nhưng sau thao tác kéo, cấu trúc thư mục sẽ được cập nhật. Bây giờ, Jerry có thể thấysrc thư mục và tệp có trong thư mục đó.

[jerry@CentOS project]$ git pull remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From git.server.com:project e86f062..7d9ea97 master −> origin/master First, rewinding head to replay your work on top of it... Fast-forwarded master to 7d9ea97683da90bcdb87c28ec9b4f64160673c8a. [jerry@CentOS project]$ ls
README src string

[jerry@CentOS project]$ ls src/
string.c

Cho đến bây giờ, cả Tom và Jerry đều sử dụng các lệnh thủ công để biên dịch dự án của họ. Bây giờ, Jerry quyết định tạo Makefile cho dự án của họ và cũng đặt tên riêng cho tệp “string.c”.

[jerry@CentOS project]$ pwd
/home/jerry/jerry_repo/project

[jerry@CentOS project]$ ls README src [jerry@CentOS project]$ cd src/

[jerry@CentOS src]$ git add Makefile [jerry@CentOS src]$ git mv string.c string_operations.c

[jerry@CentOS src]$ git status -s
A Makefile
R string.c −> string_operations.c

Git đang hiển thị R trước tên tệp để chỉ ra rằng tệp đã được đổi tên.

Đối với hoạt động cam kết, Jerry đã sử dụng cờ -a, làm cho git cam kết tự động phát hiện các tệp đã sửa đổi.

[jerry@CentOS src]$ git commit -a -m 'Added Makefile and renamed strings.c to
string_operations.c '

[master 94f7b26] Added Makefile and renamed strings.c to string_operations.c
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/Makefile
rename src/{string.c => string_operations.c} (100%)

Sau khi cam kết, anh ta đẩy các thay đổi của mình vào kho lưu trữ.

[jerry@CentOS src]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

Counting objects: 6, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 396 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
7d9ea97..94f7b26 master −> master

Giờ đây, các nhà phát triển khác có thể xem các sửa đổi này bằng cách cập nhật kho lưu trữ cục bộ của họ.

Tom cập nhật kho lưu trữ cục bộ của mình và tìm tệp nhị phân đã biên dịch trong srcdanh mục. Sau khi xem thông báo cam kết, anh ta nhận ra rằng tệp nhị phân đã biên dịch đã được thêm vào bởi Jerry.

[tom@CentOS src]$ pwd
/home/tom/project/src

[tom@CentOS src]$ ls Makefile string_operations string_operations.c [tom@CentOS src]$ file string_operations
string_operations: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.18, not stripped

[tom@CentOS src]$ git log
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

VCS chỉ được sử dụng để lưu trữ mã nguồn chứ không phải các tệp nhị phân thực thi. Vì vậy, Tom quyết định xóa tệp này khỏi kho lưu trữ. Để vận hành thêm, anh ta sử dụnggit rm chỉ huy.

[tom@CentOS src]$ ls
Makefile string_operations string_operations.c

[tom@CentOS src]$ git rm string_operations rm 'src/string_operations' [tom@CentOS src]$ git commit -a -m "Removed executable binary"

[master 5776472] Removed executable binary
1 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100755 src/string_operations

Sau khi cam kết, anh ta đẩy các thay đổi của mình vào kho lưu trữ.

[tom@CentOS src]$ git push origin master

Lệnh trên sẽ cho kết quả như sau.

Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 310 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
29af9d4..5776472 master −> master

Sai lầm là con người. Vì vậy, mỗi VCS đều cung cấp một tính năng để sửa lỗi cho đến một thời điểm nhất định. Git cung cấp một tính năng mà chúng tôi có thể sử dụng để hoàn tác các sửa đổi đã được thực hiện đối với kho lưu trữ cục bộ.

Giả sử người dùng vô tình thực hiện một số thay đổi đối với kho lưu trữ cục bộ của mình và sau đó muốn hoàn tác những thay đổi này. Trong những trường hợp như vậy,revert hoạt động đóng một vai trò quan trọng.

Hoàn nguyên các thay đổi chưa được chấp nhận

Giả sử Jerry vô tình sửa đổi một tệp từ kho lưu trữ cục bộ của anh ấy. Nhưng anh ấy muốn hoàn tác sửa đổi của mình. Để xử lý tình huống này, chúng ta có thể sử dụnggit checkoutchỉ huy. Chúng ta có thể sử dụng lệnh này để hoàn nguyên nội dung của tệp.

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git status -s M string_operations.c [jerry@CentOS src]$ git checkout string_operations.c

[jerry@CentOS src]$ git status –s

Hơn nữa, chúng ta có thể sử dụng git checkoutlệnh để lấy tệp đã xóa khỏi kho lưu trữ cục bộ. Giả sử Tom xóa một tệp khỏi kho lưu trữ cục bộ và chúng tôi muốn lấy lại tệp này. Chúng ta có thể đạt được điều này bằng cách sử dụng cùng một lệnh.

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ ls -1 Makefile string_operations.c [tom@CentOS src]$ rm string_operations.c

[tom@CentOS src]$ ls -1 Makefile [tom@CentOS src]$ git status -s
D string_operations.c

Git đang hiển thị chữ cái Dtrước tên tệp. Điều này chỉ ra rằng tệp đã bị xóa khỏi kho lưu trữ cục bộ.

[tom@CentOS src]$ git checkout string_operations.c [tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ git status -s

Note - Chúng tôi có thể thực hiện tất cả các thao tác này trước khi cam kết.

Xóa các thay đổi khỏi khu vực giai đoạn

Chúng tôi đã thấy rằng khi chúng tôi thực hiện một thao tác thêm, các tệp sẽ di chuyển từ kho lưu trữ cục bộ đến khu vực nêu rõ. Nếu người dùng vô tình sửa đổi tệp và thêm tệp đó vào khu vực tổ chức, họ có thể hoàn nguyên các thay đổi của mình bằng cách sử dụnggit checkout chỉ huy.

Trong Git, có một con trỏ HEAD luôn trỏ đến cam kết mới nhất. Nếu bạn muốn hoàn tác một thay đổi từ khu vực được tổ chức, thì bạn có thể sử dụng lệnh git checkout, nhưng với lệnh checkout, bạn phải cung cấp một tham số bổ sung, tức là con trỏ HEAD. Tham số con trỏ cam kết bổ sung hướng dẫn lệnh git checkout đặt lại cây làm việc và cũng để loại bỏ các thay đổi theo giai đoạn.

Giả sử Tom sửa đổi một tệp từ kho lưu trữ cục bộ của anh ấy. Nếu chúng tôi xem trạng thái của tệp này, nó sẽ cho thấy rằng tệp đã được sửa đổi nhưng không được thêm vào khu vực tổ chức.

tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[tom@CentOS src]$ git status -s # Modify file and view it’s status. [tom@CentOS src]$ git status -s
M string_operations.c

[tom@CentOS src]$ git add string_operations.c

Trạng thái Git cho thấy rằng tệp hiện diện trong khu vực dàn dựng, bây giờ hãy hoàn nguyên nó bằng cách sử dụng lệnh git checkout và xem trạng thái của tệp được hoàn nguyên.

[tom@CentOS src]$ git checkout HEAD -- string_operations.c

[tom@CentOS src]$ git status -s

Di chuyển con trỏ HEAD với Git Reset

Sau khi thực hiện một số thay đổi, bạn có thể quyết định xóa những thay đổi này. Lệnh đặt lại Git được sử dụng để đặt lại hoặc hoàn nguyên các thay đổi. Chúng tôi có thể thực hiện ba loại thao tác đặt lại khác nhau.

Biểu đồ dưới đây cho thấy sự thể hiện bằng hình ảnh của lệnh Git reset.

Mềm mại

Mỗi nhánh có một con trỏ HEAD, con trỏ này trỏ đến cam kết mới nhất. Nếu chúng ta sử dụng lệnh đặt lại Git với tùy chọn --soft theo sau là ID cam kết, thì nó sẽ chỉ đặt lại con trỏ HEAD mà không phá hủy bất kỳ thứ gì.

.git/refs/heads/mastertệp lưu trữ ID cam kết của con trỏ HEAD. Chúng tôi có thể xác minh nó bằng cách sử dụnggit log -1 chỉ huy.

[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

Bây giờ, hãy xem ID cam kết mới nhất, sẽ khớp với ID cam kết ở trên.

[jerry@CentOS project]$ git log -2

Lệnh trên sẽ cho kết quả như sau.

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

Hãy để chúng tôi đặt lại con trỏ HEAD.

[jerry@CentOS project]$ git reset --soft HEAD~

Bây giờ, chúng ta chỉ cần đặt lại con trỏ HEAD trở lại một vị trí. Hãy để chúng tôi kiểm tra nội dung của.git/refs/heads/master file.

[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

ID cam kết từ tệp đã được thay đổi, bây giờ hãy xác minh nó bằng cách xem thông báo cam kết.

jerry@CentOS project]$ git log -2

Lệnh trên sẽ cho kết quả như sau.

commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

Trộn

Git đặt lại với tùy chọn --mixed sẽ hoàn nguyên những thay đổi đó từ khu vực dàn dựng chưa được cam kết. Nó chỉ hoàn nguyên các thay đổi từ khu vực tổ chức. Các thay đổi thực tế được thực hiện đối với bản sao hoạt động của tệp không bị ảnh hưởng. Đặt lại Git mặc định tương đương với đặt lại git - hỗn hợp.

cứng

Nếu bạn sử dụng tùy chọn --hard với lệnh đặt lại Git, nó sẽ xóa khu vực tổ chức; nó sẽ đặt lại con trỏ HEAD về cam kết mới nhất của ID cam kết cụ thể và xóa các thay đổi tệp cục bộ.

Hãy để chúng tôi kiểm tra ID cam kết.

[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git log -1

Lệnh trên sẽ cho kết quả như sau.

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Jerry đã sửa đổi một tệp bằng cách thêm chú thích một dòng vào đầu tệp.

[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>

Anh ấy đã xác minh nó bằng cách sử dụng lệnh git status.

[jerry@CentOS src]$ git status -s
M string_operations.c

Jerry thêm tệp đã sửa đổi vào vùng dàn và xác minh nó bằng lệnh git status.

[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git status

Lệnh trên sẽ cho kết quả như sau.

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#

Trạng thái Git đang hiển thị rằng tệp hiện diện trong khu vực tổ chức. Bây giờ, đặt lại HEAD với - tùy chọn cứng.

[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Lệnh đặt lại Git đã thành công, lệnh này sẽ hoàn nguyên tệp khỏi vùng tổ chức cũng như loại bỏ bất kỳ thay đổi cục bộ nào được thực hiện đối với tệp.

[jerry@CentOS src]$ git status -s

Trạng thái Git cho thấy rằng tệp đã được hoàn nguyên khỏi khu vực tổ chức.

[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>

Lệnh head cũng cho thấy rằng thao tác đặt lại cũng loại bỏ các thay đổi cục bộ.

Hoạt động thẻ cho phép đặt tên có ý nghĩa cho một phiên bản cụ thể trong kho lưu trữ. Giả sử Tom và Jerry quyết định gắn thẻ mã dự án của họ để sau này họ có thể truy cập dễ dàng.

Tạo thẻ

Hãy để chúng tôi gắn thẻ HEAD hiện tại bằng cách sử dụng git tagchỉ huy. Tom cung cấp tên thẻ với tùy chọn -a và cung cấp thông báo thẻ với tùy chọn –m.

tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git tag -a 'Release_1_0' -m 'Tagged basic string operation code' HEAD

Nếu bạn muốn gắn thẻ một cam kết cụ thể, thì hãy sử dụng ID COMMIT thích hợp thay vì con trỏ HEAD. Tom sử dụng lệnh sau để đẩy thẻ vào kho lưu trữ từ xa.

[tom@CentOS project]$ git push origin tag Release_1_0

Lệnh trên sẽ cho kết quả sau:

Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
* [new tag]
Release_1_0 −> Release_1_0

Xem thẻ

Tom đã tạo thẻ. Bây giờ, Jerry có thể xem tất cả các thẻ có sẵn bằng cách sử dụng lệnh thẻ Git với tùy chọn –l.

[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git pull
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From git.server.com:project
* [new tag]
Release_1_0 −> Release_1_0
Current branch master is up to date.

[jerry@CentOS src]$ git tag -l
Release_1_0

Jerry sử dụng lệnh Git show theo sau là tên thẻ của nó để xem thêm chi tiết về thẻ.

[jerry@CentOS src]$ git show Release_1_0

Lệnh trên sẽ cho kết quả sau:

tag Release_1_0
Tagger: Tom Cat <[email protected]>
Date: Wed Sep 11 13:45:54 2013 +0530

Tagged basic string operation code


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

diff --git a/src/string_operations b/src/string_operations
deleted file mode 100755
index 654004b..0000000
Binary files a/src/string_operations and /dev/null differ

Xóa thẻ

Tom sử dụng lệnh sau để xóa các thẻ khỏi kho lưu trữ cục bộ cũng như từ xa.

[tom@CentOS project]$ git tag Release_1_0 [tom@CentOS project]$ git tag -d Release_1_0
Deleted tag 'Release_1_0' (was 0f81ff4)
# Remove tag from remote repository.

[tom@CentOS project]$ git push origin :Release_1_0
To [email protected]:project.git
- [deleted]
Release_1_0

Bản vá là một tệp văn bản, có nội dung tương tự như Git diff, nhưng cùng với mã, nó cũng có siêu dữ liệu về các cam kết; ví dụ: ID cam kết, ngày tháng, thông báo cam kết, v.v. Chúng tôi có thể tạo một bản vá từ các cam kết và những người khác có thể áp dụng chúng vào kho lưu trữ của họ.

Jerry thực hiện hàm strcat cho dự án của mình. Jerry có thể tạo một đường dẫn mã của mình và gửi cho Tom. Sau đó, anh ta có thể áp dụng bản vá nhận được cho mã của mình.

Jerry sử dụng Git format-patchlệnh để tạo bản vá cho cam kết mới nhất. Nếu bạn muốn tạo một bản vá cho một cam kết cụ thể, hãy sử dụngCOMMIT_ID bằng lệnh format-patch.

[jerry@CentOS project]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git status -s M string_operations.c ?? string_operations [jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m "Added my_strcat function" [master b4c7f09] Added my_strcat function 1 files changed, 13 insertions(+), 0 deletions(-) [jerry@CentOS src]$ git format-patch -1
0001-Added-my_strcat-function.patch

Lệnh trên tạo .patchcác tệp bên trong thư mục làm việc hiện tại. Tom có ​​thể sử dụng bản vá này để sửa đổi các tệp của mình. Git cung cấp hai lệnh để áp dụng các bản vágit amgit apply, tương ứng. Git apply sửa đổi các tệp cục bộ mà không tạo cam kết, trong khi git am sửa đổi tệp và tạo cam kết.

Để áp dụng bản vá và tạo cam kết, hãy sử dụng lệnh sau:

[tom@CentOS src]$ pwd /home/tom/top_repo/project/src [tom@CentOS src]$ git diff

[tom@CentOS src]$ git status –s [tom@CentOS src]$ git apply 0001-Added-my_strcat-function.patch

[tom@CentOS src]$ git status -s
M string_operations.c
?? 0001-Added-my_strcat-function.patch

Bản vá được áp dụng thành công, bây giờ chúng ta có thể xem các sửa đổi bằng cách sử dụng git diff chỉ huy.

[tom@CentOS src]$ git diff

Lệnh trên sẽ cho kết quả sau:

diff --git a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..f282fcf 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,5 +1,16 @@
#include <stdio.h>
+char *my_strcat(char *t, char *s)
diff --git a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..f282fcf 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,5 +1,16 @@
#include <stdio.h>
+char *my_strcat(char *t, char *s)
+
{
   +
   char *p = t;
   +
   +
   +
   while (*p)
   ++p;
   +
   while (*p++ = *s++)
   + ;
   + return t;
   +
}
+
size_t my_strlen(const char *s)
{
   const char *p = s;
   @@ -23,6 +34,7 @@ int main(void)
   {

Hoạt động nhánh cho phép tạo ra một dòng phát triển khác. Chúng ta có thể sử dụng thao tác này để tách quá trình phát triển thành hai hướng khác nhau. Ví dụ: chúng tôi đã phát hành một sản phẩm cho phiên bản 6.0 và chúng tôi có thể muốn tạo một nhánh để việc phát triển các tính năng của 7.0 có thể tách biệt với các bản sửa lỗi 6.0.

Tạo chi nhánh

Tom tạo một nhánh mới bằng lệnh git branch <tên nhánh>. Chúng ta có thể tạo một nhánh mới từ nhánh hiện có. Chúng tôi có thể sử dụng một cam kết hoặc thẻ cụ thể làm điểm bắt đầu. Nếu bất kỳ ID cam kết cụ thể nào không được cung cấp, thì chi nhánh sẽ được tạo với HEAD làm điểm bắt đầu.

[jerry@CentOS src]$ git branch new_branch [jerry@CentOS src]$ git branch
* master
new_branch

Một nhánh mới được tạo; Tom đã sử dụng lệnh git branch để liệt kê các nhánh có sẵn. Git hiển thị dấu hoa thị trước khi chi nhánh hiện đã thanh toán.

Hình ảnh đại diện của hoạt động tạo nhánh được hiển thị bên dưới:

Chuyển đổi giữa các chi nhánh

Jerry sử dụng lệnh git checkout để chuyển đổi giữa các nhánh.

[jerry@CentOS src]$ git checkout new_branch Switched to branch 'new_branch' [jerry@CentOS src]$ git branch
master
* new_branch

Lối tắt để tạo và chuyển nhánh

Trong ví dụ trên, chúng ta đã sử dụng hai lệnh để tạo và chuyển các nhánh tương ứng. Git cung cấp–btùy chọn với lệnh thanh toán; hoạt động này tạo ra một nhánh mới và ngay lập tức chuyển sang nhánh mới.

[jerry@CentOS src]$ git checkout -b test_branch Switched to a new branch 'test_branch' [jerry@CentOS src]$ git branch
master
new_branch
* test_branch

Xóa chi nhánh

Một nhánh có thể bị xóa bằng cách cung cấp tùy chọn –D với lệnh git branch. Nhưng trước khi xóa nhánh hiện có, hãy chuyển sang nhánh khác.

Jerry hiện đang ở test_branchvà anh ta muốn loại bỏ nhánh đó. Vì vậy, anh ta chuyển nhánh và xóa nhánh như hình dưới đây.

[jerry@CentOS src]$ git branch master new_branch * test_branch [jerry@CentOS src]$ git checkout master
Switched to branch 'master'

[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Bây giờ, Git sẽ chỉ hiển thị hai nhánh.

[jerry@CentOS src]$ git branch
* master
new_branch

Đổi tên chi nhánh

Jerry quyết định thêm hỗ trợ cho các ký tự rộng trong dự án hoạt động chuỗi của mình. Anh ấy đã tạo một nhánh mới, nhưng tên nhánh không phù hợp. Vì vậy, anh ta thay đổi tên chi nhánh bằng cách sử dụng–m theo sau là tùy chọn old branch namenew branch name.

[jerry@CentOS src]$ git branch * master new_branch [jerry@CentOS src]$ git branch -m new_branch wchar_support

Bây giờ, lệnh git branch sẽ hiển thị tên chi nhánh mới.

[jerry@CentOS src]$ git branch
* master
wchar_support

Hợp nhất hai chi nhánh

Jerry thực hiện một hàm để trả về độ dài chuỗi của chuỗi ký tự rộng. Mã mới sẽ xuất hiện như sau:

[jerry@CentOS src]$ git branch
master
* wchar_support

[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

Sau khi thử nghiệm, anh ấy cam kết và đẩy những thay đổi của mình sang nhánh mới.

[jerry@CentOS src]$ git status -s M string_operations.c ?? string_operations [jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Lưu ý rằng Jerry đang đẩy những thay đổi này sang nhánh mới, đó là lý do tại sao anh ta sử dụng tên nhánh wchar_support thay vì master chi nhánh.

[jerry@CentOS src]$ git push origin wchar_support  <−−− Observer branch_name

Lệnh trên sẽ cho kết quả như sau.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

Sau khi thực hiện các thay đổi, nhánh mới sẽ xuất hiện như sau:

Tom tò mò về những gì Jerry đang làm trong chi nhánh riêng của mình và anh ta kiểm tra nhật ký từ wchar_support chi nhánh.

[tom@CentOS src]$ pwd /home/tom/top_repo/project/src [tom@CentOS src]$ git log origin/wchar_support -2

Lệnh trên sẽ cho kết quả như sau.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Bằng cách xem các thông báo cam kết, Tom nhận ra rằng Jerry đã triển khai hàm strlen cho nhân vật rộng và anh ta muốn có cùng chức năng trong nhánh chính. Thay vì thực hiện lại, anh ta quyết định lấy mã của Jerry bằng cách hợp nhất chi nhánh của mình với chi nhánh chủ.

[tom@CentOS project]$ git branch * master [tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

Sau thao tác hợp nhất, nhánh chính sẽ xuất hiện như sau:

Bây giờ, chi nhánh wchar_supportđã được hợp nhất với nhánh chính. Chúng tôi có thể xác minh điều đó bằng cách xem thông báo cam kết hoặc bằng cách xem các sửa đổi được thực hiện trong tệp string_operation.c.

[tom@CentOS project]$ cd src/

[tom@CentOS src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
      
        Date: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string [tom@CentOS src]$ head -12 string_operations.c 
      

Lệnh trên sẽ cho kết quả như sau.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

Sau khi thử nghiệm, anh ta đẩy các thay đổi mã của mình sang nhánh chính.

[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master

Rebase Chi nhánh

Lệnh Git rebase là một lệnh hợp nhất nhánh, nhưng sự khác biệt là nó sửa đổi thứ tự của các cam kết.

Lệnh Git merge cố gắng đặt các cam kết từ các nhánh khác lên trên HEAD của nhánh cục bộ hiện tại. Ví dụ: nhánh cục bộ của bạn có cam kết A−> B−> C−> D và nhánh hợp nhất có cam kết A−> B−> X−> Y, thì git merge sẽ chuyển đổi nhánh cục bộ hiện tại thành một cái gì đó giống như A−> B−> C−> D−> X−> Y

Lệnh Git rebase cố gắng tìm ra tổ tiên chung giữa nhánh cục bộ hiện tại và nhánh hợp nhất. Sau đó, nó đẩy các cam kết đến chi nhánh cục bộ bằng cách sửa đổi thứ tự các cam kết trong chi nhánh cục bộ hiện tại. Ví dụ: nếu nhánh cục bộ của bạn có commit A−> B−> C−> D và nhánh hợp nhất có cam kết A−> B−> X−> Y, thì Git rebase sẽ chuyển đổi nhánh cục bộ hiện tại thành một cái gì đó giống như A− > B−> X−> Y−> C−> D.

Khi nhiều nhà phát triển làm việc trên một kho lưu trữ từ xa, bạn không thể sửa đổi thứ tự của các cam kết trong kho lưu trữ từ xa. Trong trường hợp này, bạn có thể sử dụng thao tác rebase để đặt các cam kết cục bộ của mình lên trên các cam kết của kho lưu trữ từ xa và bạn có thể đẩy các thay đổi này.

Thực hiện các thay đổi trong chi nhánh wchar_support

Jerry đang làm việc trên wchar_supportchi nhánh. Anh ta thay đổi tên của các chức năng và sau khi thử nghiệm, anh ta cam kết những thay đổi của mình.

[jerry@CentOS src]$ git branch
 master
* wchar_support
[jerry@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

diff --git a/src/string_operations.c b/src/string_operations.c
index 8fb4b00..01ff4e0 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <wchar.h>
-size_t w_strlen(const wchar_t *s)
+size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Sau khi xác minh mã, anh ta cam kết các thay đổi của mình.

[jerry@CentOS src]$ git status -s
M string_operations.c

[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git commit -m 'Changed function name'
[wchar_support 3789fe8] Changed function name
1 files changed, 1 insertions(+), 1 deletions(-)

[jerry@CentOS src]$ git push origin wchar_support

Lệnh trên sẽ cho kết quả sau:

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 409 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
64192f9..3789fe8 wchar_support -> wchar_support

Thực hiện các thay đổi trong nhánh chính

Trong khi đó ở nhánh chính, Tom cũng thay đổi tên của chức năng tương tự và đẩy những thay đổi của mình lên nhánh chủ.

[tom@CentOS src]$ git branch
* master
[tom@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

diff --git a/src/string_operations.c b/src/string_operations.c
index 8fb4b00..52bec84 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,7 +1,8 @@
#include <stdio.h>
#include <wchar.h>
-size_t w_strlen(const wchar_t *s)
+/* wide character strlen fucntion */
+size_t my_wc_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

Sau khi xác minh sự khác biệt, anh ta cam kết những thay đổi của mình.

[tom@CentOS src]$ git status -s
M string_operations.c

[tom@CentOS src]$ git add string_operations.c [tom@CentOS src]$ git commit -m 'Changed function name from w_strlen to my_wc_strlen'
[master ad4b530] Changed function name from w_strlen to my_wc_strlen
1 files changed, 2 insertions(+), 1 deletions(-)

[tom@CentOS src]$ git push origin master

Lệnh trên sẽ cho kết quả sau:

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 470 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
64192f9..ad4b530 master -> master

Trên wchar_supportnhánh, Jerry thực hiện hàm strchr cho chuỗi ký tự rộng. Sau khi thử nghiệm, anh ấy cam kết và đẩy các thay đổi của mình lênwchar_support chi nhánh.

[jerry@CentOS src]$ git branch
master
* wchar_support
[jerry@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

diff --git a/src/string_operations.c b/src/string_operations.c
index 01ff4e0..163a779 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,6 +1,16 @@
#include <stdio.h>
#include <wchar.h>
+wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   while (*ws) 
   {
      +
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Sau khi xác minh, anh ấy cam kết những thay đổi của mình.

[jerry@CentOS src]$ git status -s
M string_operations.c

[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git commit -m 'Addded strchr function for wide character string'
[wchar_support 9d201a9] Addded strchr function for wide character string
1 files changed, 10 insertions(+), 0 deletions(-)

[jerry@CentOS src]$ git push origin wchar_support

Lệnh trên sẽ cho kết quả sau:

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 516 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
3789fe8..9d201a9 wchar_support -> wchar_support

Giải quyết xung đột

Tom muốn xem Jerry đang làm gì trên chi nhánh riêng của mình, anh ấy cố gắng lấy những thay đổi mới nhất từ wchar_support nhánh, nhưng Git hủy hoạt động với thông báo lỗi sau.

[tom@CentOS src]$ git pull origin wchar_support

Lệnh trên tạo ra kết quả sau:

remote: Counting objects: 11, done.
63Git Tutorials
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From git.server.com:project
* branch
wchar_support -> FETCH_HEAD
Auto-merging src/string_operations.c
CONFLICT (content): Merge conflict in src/string_operations.c
Automatic merge failed; fix conflicts and then commit the result.

Giải quyết xung đột

Từ thông báo lỗi, rõ ràng là có xung đột trong src / string_operations.c. Anh ta chạy lệnh git diff để xem thêm chi tiết.

[tom@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

diff --cc src/string_operations.c
index 52bec84,163a779..0000000
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@@ -1,8 -1,17 +1,22 @@@
#include <stdio.h>
#include <wchar.h>
++<<<<<<< HEAD
+/* wide character strlen fucntion */
+size_t my_wc_strlen(const wchar_t *s)
++=======
+ wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   +
   while (*ws) 
   {
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
+ size_t my_wstrlen(const wchar_t *s)
++>>>>>>>9d201a9c61bc4713f4095175f8954b642dae8f86
{
   const wchar_t *p = s;

Vì cả Tom và Jerry đều thay đổi tên của cùng một chức năng, Git đang ở trong tình trạng bối rối và nó yêu cầu người dùng giải quyết xung đột theo cách thủ công.

Tom quyết định giữ tên chức năng do Jerry gợi ý, nhưng anh ấy giữ nguyên nhận xét do anh ấy thêm vào. Sau khi loại bỏ các điểm đánh dấu xung đột, git diff sẽ trông như thế này.

[tom@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau.

diff --cc src/string_operations.c
diff --cc src/string_operations.c
index 52bec84,163a779..0000000
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@@ -1,8 -1,17 +1,18 @@@
#include <stdio.h>
#include <wchar.h>
+ wchar_t *my_wstrchr(wchar_t *ws, wchar_t wc)
+
{
   +
   while (*ws) 
   {
      +
      if (*ws == wc)
      +
      return ws;
      +
      ++ws;
      + 
   }
   + return NULL;
   +
}
+
+/* wide character strlen fucntion */
- size_t my_wc_strlen(const wchar_t *s)
+ size_t my_wstrlen(const wchar_t *s)
{
   const wchar_t *p = s;

Vì Tom đã sửa đổi các tệp, anh ta phải thực hiện những thay đổi này trước tiên và sau đó, anh ta có thể kéo các thay đổi.

[tom@CentOS src]$ git commit -a -m 'Resolved conflict' [master 6b1ac36] Resolved conflict [tom@CentOS src]$ git pull origin wchar_support.

Tom đã giải quyết mâu thuẫn, bây giờ hoạt động kéo sẽ thành công.

GNU / Linux và Mac OS sử dụng line-feed (LF)hoặc dòng mới làm ký tự kết thúc dòng, trong khi Windows sử dụng line-feed and carriage-return (LFCR) kết hợp để biểu diễn ký tự kết thúc dòng.

Để tránh các cam kết không cần thiết vì những khác biệt về đầu dòng này, chúng ta phải định cấu hình ứng dụng khách Git để viết cùng một dòng kết thúc vào kho lưu trữ Git.

Đối với hệ thống Windows, chúng tôi có thể định cấu hình ứng dụng khách Git để chuyển đổi phần cuối dòng thành CRLF định dạng trong khi thanh toán và chuyển đổi chúng trở lại LFtrong quá trình cam kết hoạt động. Các cài đặt sau đây sẽ thực hiện những việc cần thiết.

[tom@CentOS project]$ git config --global core.autocrlf true

Đối với GNU / Linux hoặc Mac OS, chúng tôi có thể định cấu hình ứng dụng khách Git để chuyển đổi phần cuối dòng từ CRLF đến LF trong khi thực hiện thao tác thanh toán.

[tom@CentOS project]$ git config --global core.autocrlf input

GitHublà một dịch vụ lưu trữ dựa trên web dành cho các dự án phát triển phần mềm sử dụng hệ thống kiểm soát sửa đổi Git. Nó cũng có sẵn ứng dụng GUI tiêu chuẩn để tải xuống (Windows, Mac, GNU / Linux) trực tiếp từ trang web của dịch vụ. Nhưng trong phần này, chúng ta sẽ chỉ xem phần CLI.

Tạo kho lưu trữ GitHub

Tới github.com . Nếu bạn đã cóGitHub, sau đó đăng nhập bằng tài khoản đó hoặc tạo một tài khoản mới. Làm theo các bước từ trang web github.com để tạo một kho lưu trữ mới.

Hoạt động đẩy

Tom quyết định sử dụng GitHubngười phục vụ. Để bắt đầu một dự án mới, anh ấy tạo một thư mục mới và một tệp bên trong đó.

[tom@CentOS]$ mkdir github_repo [tom@CentOS]$ cd github_repo/

[tom@CentOS]$ vi hello.c [tom@CentOS]$ make hello
cc hello.c -o hello

[tom@CentOS]$ ./hello

Lệnh trên sẽ cho kết quả sau:

Hello, World !!!

Sau khi xác minh mã của mình, anh ta khởi tạo thư mục bằng lệnh git init và thực hiện các thay đổi của mình cục bộ.

[tom@CentOS]$ git init
Initialized empty Git repository in /home/tom/github_repo/.git/

[tom@CentOS]$ git status -s ?? hello ?? hello.c [tom@CentOS]$ git add hello.c

[tom@CentOS]$ git status -s A hello.c ?? hello [tom@CentOS]$ git commit -m 'Initial commit'

Sau đó, anh ấy thêm GitHub URL kho lưu trữ như một nguồn gốc từ xa và đẩy các thay đổi của anh ấy vào kho lưu trữ từ xa.

[tom@CentOS]$ git remote add origin https://github.com/kangralkar/testing_repo.git [tom@CentOS]$ git push -u origin master

Thao tác đẩy sẽ yêu cầu GitHubtên người dùng và mật khẩu. Sau khi xác thực thành công, thao tác sẽ thành công.

Lệnh trên sẽ cho kết quả sau:

Username for 'https://github.com': kangralkar
Password for 'https://[email protected]': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/kangralkar/test_repo.git
 * [new branch]      master −> master
 Branch master set up to track remote branch master from origin.

Từ bây giờ, Tom có ​​thể thực hiện bất kỳ thay đổi nào đối với GitHubkho. Anh ta có thể sử dụng tất cả các lệnh được thảo luận trong chương này vớiGitHub kho.

Hoạt động kéo

Tom đã đẩy thành công tất cả các thay đổi của mình vào GitHubkho. Giờ đây, các nhà phát triển khác có thể xem những thay đổi này bằng cách thực hiện thao tác nhân bản hoặc cập nhật kho lưu trữ cục bộ của họ.

Jerry tạo một thư mục mới trong thư mục chính của mình và sao chép GitHub kho lưu trữ bằng cách sử dụng lệnh git clone.

[jerry@CentOS]$ pwd /home/jerry [jerry@CentOS]$ mkdir jerry_repo

[jerry@CentOS]$ git clone https://github.com/kangralkar/test_repo.git

Lệnh trên tạo ra kết quả sau:

Cloning into 'test_repo'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.

Anh ta xác minh nội dung thư mục bằng cách thực hiện lệnh ls.

[jerry@CentOS]$ ls
test_repo

[jerry@CentOS]$ ls test_repo/
hello.c