Git - Sửa lỗi

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 một tệp đã xóa từ 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 cho thấy 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 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, anh ta 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 ta 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 vùng phân bố.

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 tổ chức, 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 <tom@tutorialspoint.com>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <jerry@tutorialspoint.com>
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 <jerry@tutorialspoint.com>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <jerry@tutorialspoint.com>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

Trộn

Git reset 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 làm việc 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à cũng 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 <tom@tutorialspoint.com>
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ộ.