Những lỗi Git thường gặp là gì và cách khắc phục chúng?



Hoàn tác các lỗi phổ biến nhất khi lập phiên bản mã của bạn trong công cụ hệ thống lập phiên bản git và bảo vệ tính toàn vẹn dữ liệu của bạn.

Với sự bùng nổ của công nghệ, điều không thể tránh khỏi đối với bất kỳ nhân viên CNTT nào phải làm việc trên nhiều dữ liệu đồng thời và dữ liệu của bạn luôn phát triển theo thời gian. Điều cần thiết là theo dõi mọi thay đổi trong dữ liệu và chuẩn bị để hoàn tác hoặc hoàn nguyên mọi thay đổi không mong muốn khi được yêu cầu.

Tôi phải thú nhận rằng, việc lập phiên bản dữ liệu của tôi trong Git cho phép tôi thử nghiệm nhiều hơn trong quá trình phát triển dự án của mình. Nếu tôi làm sai, tôi biết git luôn có cách để hoàn tác và / hoặc hoàn nguyên phiên bản đó của dự án của tôi về như trước khi tôi làm hỏng. Mỗi lớp được thiết kế để cho phép các thay đổi dữ liệu được xem xét và sửa đổi và / hoặc sửa chữa trước khi chuyển dữ liệu trong giai đoạn tiếp theo. Vì vậy, sau đây là những sai lầm được đề cập trong blog này:





Tệp / thư mục tách giai đoạn khỏi Chỉ mục

class vs interface trong java

Trong khi thêm và / hoặc sửa đổi tệp, bạn thường có xu hướng sử dụng hành vi mặc định của lệnh ‘git add’, đó là thêm tất cả các tệp và thư mục vào Chỉ mục.Đôi khi bạn cảm thấy cần phải tách một số tệp nhất định hoặc sửa đổi chúng lần cuối trước khi cam kết chúng.



Cú pháp: git đặt lại


xóa tệp khỏi Chỉ mục - những lỗi git thường gặp -Edureka

Việc hủy tổ chức tệp khỏi khu vực Chỉ mục cho bạn một cơ hội khác để làm việc lại dữ liệu của mình trước khi cam kết với kho lưu trữ cục bộ.



Chỉnh sửa tin nhắn đã cam kết cuối cùng

Chỉ huy: git cam kết --amend
Bạn có thể chỉnh sửa thông báo cam kết mới nhất mà không cần tạo mới. Để liệt kê các bản ghi cam kết, tôi đã đặt bí danh 'hist':
Chỉ huy: git config --global alias.hist 'log --pretty = format: '% C (yellow)% h% Creset% ad | % C (xanh lục)% s% Đặt lại% C (đỏ)% d% Đặt lại% C (xanh lam) [% an] '--graph --dec decor --date = short'x


Không sửa đổi thông báo cam kết đã được đẩy vào một kho lưu trữ từ xa và được chia sẻ với những người khác, vì điều đó sẽ làm cho lịch sử cam kết trước đó không hợp lệ và do đó mọi công việc dựa trên đó có thể bị ảnh hưởng.

Quên một số thay đổi trong lần cam kết cuối cùng

Giả sử bạn quên thực hiện một số sửa đổi và đã cam kết ảnh chụp nhanh của mình, bạn cũng không muốn thực hiện một cam kết khác để làm nổi bật sai lầm của mình.
Chỉ huy: git cam kết --amend


Tôi đã đánh dấu cách id sha-1 của đối tượng cam kết gần đây đã được tạo lại và thay đổi. Tôi giả vờ đã thực hiện một cam kết duy nhất kết hợp cả hai thay đổi thành một.

Hủy các thay đổi cục bộ

Vì vậy, đây là một trường hợp mà tôi đã sửa đổi tệp ‘README’ và sắp xếp nó. Tiếp theo, tôi sửa đổi cùng một tệp lần thứ hai nhưng nhận ra rằng tôi không muốn thay đổi lần thứ hai.

Bây giờ, hãy để tôi không hoàn tác toàn bộ thay đổi theo cách thủ công, tôi có thể chỉ cần kéo phiên bản theo giai đoạn của tệp.
Cú pháp:
thanh toán git -–Các thay đổi địa phương trong một tệp
thanh toán git -– Thay đổi địa phương trong tất cả các tệp trong thư mục & nhút nhát & nhút nhát

Chỉ huy: thanh toán git - README

Vì vậy, tôi đã loại bỏ những thay đổi cuối cùng của mình đối với tệp và chấp nhận phiên bản theo giai đoạn của tệp. Trong lần cam kết tiếp theo, chỉ phiên bản theo giai đoạn của tệp sẽ được đưa vào kho lưu trữ cục bộ.

Dữ liệu cá nhân được cam kết vào kho lưu trữ cục bộ

Tôi muốn xóa một số dữ liệu nhất định khỏi kho lưu trữ cục bộ nhưng vẫn giữ các tệp trong thư mục làm việc.
Cú pháp:
git reset --mixed HEAD ~
git reset --mixed

Chỉ huy: git reset --mixed HEAD ~ 1
HEAD ~ 1 chỉ ra một cam kết ngay trước khi cam kết gần đây được chỉ ra bởi HEAD nhánh hiện tại.

Các tệp trong ảnh chụp nhanh hiện tại đã bị xóa khỏi cả kho lưu trữ cục bộ và khu vực tổ chức. Thêm các mẫu sau vào tệp .gitignore chung để loại trừ chúng khỏi bị git theo dõi.
vim ~ / .gitignore_global
# tệp mật khẩu #
*.vượt qua
*.Chìa khóa
* .passwd

Với điều này, cam kết có ảnh chụp nhanh các tệp mật khẩu bị xóa và bạn sẽ có được một khu vực tổ chức sạch sẽ. Các tệp của tôi vẫn hiện diện trên thư mục làm việc của tôi nhưng không còn hiện diện trong kho lưu trữ cục bộ, cũng sẽ không được đẩy lên kho lưu trữ từ xa.

Thận trọng: Nếu bạn mất chúng, git không thể khôi phục chúng cho bạn vì nó không biết về nó.

Thay thế cam kết mới nhất bằng một cam kết mới

Cú pháp: git reset --soft [/ HEAD ~ n>]

Tùy chọn ‘–soft’ chỉ xóa các tệp đã cam kết khỏi kho lưu trữ cục bộ trong khi chúng vẫn được sắp xếp trong Chỉ mục và bạn có thể cam kết lại chúng sau khi xem xét. là phần 1 của ảnh chụp nhanh mà bạn muốn xóa khỏi kho lưu trữ cục bộ. trong đó n là số lần cam kết trước khi cam kết HEAD

Chỉ huy :git reset --soft HEAD ~ 1


Sửa đổi tệp và phân loại lại

Chỉ huy: git commit -m 'Thêm index.html và style.css'
Lịch sử cam kết của bạn bây giờ hóa ra là:

Đã cam kết dữ liệu sai

Cú pháp:
git reset --hard HEAD ~ n–Đặt lại dự án thành ‘n’ cam kết trước khi có ảnh chụp nhanh cam kết mới nhất
git reset --hard–Đặt lại dự án thành ảnh chụp nhanh id cam kết

Chỉ huy: git reset --hard HEAD ~ 1


Cam kết mới nhất và các tệp bị hỏng sẽ bị xóa khỏi kho lưu trữ cục bộ, khu vực dàn dựng cũng như thư mục làm việc.

Thận trọng: Đó là một lệnh nguy hiểm vì bạn sẽ mất các tệp trong thư mục làm việc. Không được khuyến nghị trên kho lưu trữ được chia sẻ từ xa.

dữ liệu lớn và hadoop là gì

Quay lại trạng thái dự án cũ của tôi

Bạn có thể chuyển sang trạng thái cũ hơn của dự án của mình trong lịch sử thời gian. Nếu bạn xáo trộn trong phiên bản mới nhất hoặc cần cải tiến trong mã cũ hơn, bạn có thể muốn tạo một nhánh khác từ ảnh chụp nhanh dự án cũ đó để không cản trở công việc hiện tại của bạn. Hãy xem cách:
a. Liệt kê lịch sử dự án và quyết định id cam kết cũ hơn, lệnh:đi lịch sử
b. Tạo một nhánh khác từ id cam kết:git checkout -b old-state e7aa9a5
c. Tiếp tục làm việc trên mã và sau đó hợp nhất / rebase với nhánh 'chính'.

Khôi phục chi nhánh cục bộ đã xóa

Có thể tạo lại công việc bị mất trên một nhánh tham chiếu. Giả sử, tôi đã xóa nhánh ‘old_code’ mà không hợp nhất với nhánh chính và mất công. Và không, tôi cũng không đẩy chi nhánh đến một kho lưu trữ từ xa, sau đó thì sao? Git theo dõi tốt và giữ một mục nhật ký về tất cả các thay đổi được thực hiện trên mỗi tài liệu tham khảo, hãy xem của tôi:đi reflog

Vì vậy, HEAD @ {2} là con trỏ khi tôi chuyển sang nhánh 'old_code', hãy khôi phục điều đó:

Cú pháp:git checkout -b
Chỉ huy:git checkout -b old_code HEAD @ {2}

Bạn hiện phải ở trong nhánh 'old_code' với tác phẩm mới nhất của bạn tại thời điểm tạo. Ngoài ra, con trỏ 'reflog' tại HEAD @ {1} là cam kết gần đây được thực hiện trên nhánh 'old_code'. commit chỉ cần chạy lệnh dưới dạng:git đặt lại --hard HEAD @ {1}.Thao tác này cũng khôi phục các tệp đã sửa đổi trong thư mục làm việc.

Nếu bạn muốn biết chi tiết cách lệnh này hoạt động và cách bạn có thể quản lý các mục nhập ‘reflog’, bạn cũng có thể đọc bài đăng trước của tôi vềkhôi phục nhánh đã xóa từ git reflog.

Hoàn tác các thay đổi được thực hiện trong một cam kết

đihoàn nguyênđược sử dụng để ghi lại một số cam kết mới để đảo ngược tác dụng của một số cam kết trước đó.
Cú pháp: git hoàn nguyên
Từ nhật ký cam kết của tôi, tôi muốn đảo ngược thay đổi được thực hiện trong id cam kết được đánh dấu:

Chỉ huy: git hoàn nguyên 827bc0d

Tốt hơn hết là bạn không đặt lại '–hard' các cam kết được chia sẻ, mà thay vào đó là 'git hoàn nguyên' chúng để lưu giữ lịch sử để mọi người dễ dàng theo dõi nhật ký lịch sử để tìm ra những gì đã được hoàn nguyên, bởi ai và tại sao?

Bạn có thể sử dụng cùng một logic tham chiếu các cam kết liên quan đến con trỏ HEAD thay vì đưa ra id cam kết, như trong HEAD ~ 3 hoặc HEAD ~ 4, v.v.

Đặt sai tên cho chi nhánh của tôi

Bạn có thể đổi tên tên chi nhánh địa phương. Điều này xảy ra nhiều lần đến mức bạn có thể muốn đổi tên chi nhánh của mình dựa trên vấn đề bạn đang giải quyết mà không phải di chuyển tất cả công việc của bạn từ vị trí này sang vị trí khác. Ví dụ: bạn có thể ở trên cùng một chi nhánh hoặc một chi nhánh khác và vẫn có thể đổi tên chi nhánh mong muốn như hình dưới đây:
Cú pháp: git chi nhánh -m
Chỉ huy: git branch -m old_code old_ # 4920

Như bạn có thể thắc mắc liệu git có lưu lại dấu vết của việc đổi tên này không? Có, nó đề cập đến các mục nhập ‘reflog’ của bạn, đây là của tôi:

Việc đổi tên một nhánh sẽ không ảnh hưởng đến nhánh theo dõi từ xa của nó. Chúng ta sẽ xem trong phần từ xa cách thay thế một nhánh trên kho lưu trữ từ xa

Sắp xếp lại nhật ký lịch sử trước khi chuyển sang điều khiển từ xa

Làm thế nào tôi ước tôi sẽ thực hiện một số cam kết sớm hơn những người khác và sẽ không thực hiện một số cam kết nào cả. Tương tác sắp xếp lại và chỉnh sửa các cam kết cũ để sửa chữa hoặc cải tiến mã một cách hiệu quả
Cú pháp: git rebase -i
Chỉ huy: git rebase -i fb0a90e–Bắt đầu khôi phục các cam kết được thực hiện sau id cam kết fb0a90e

Tham quan lại git rebase tài liệu để hiểu rebase ‘–interactive hoặc -i’ khác với rebase thông thường như thế nào.

Đã cam kết các thay đổi không liên quan thành một cam kết duy nhất

Trong trường hợp này, bạn cần chia một cam kết cũ bị chôn vùi thành nhiều cam kết hợp lý.
Cú pháp: git rebase -i
Chỉ huy: git rebase -i fb0a90e
Trong trình chỉnh sửa rebase, bạn phải chọn id cam kết e7aa9a5 và thay đổi nó thành 'chỉnh sửa' thay vì 'chọn'.

những thay đổi không liên quan - những lỗi git thường gặp -Edureka

Bây giờ bạn sẽ ở trong phiên bản commit id-e7aa9a5 của dự án. Đầu tiên, đặt lại lịch sử cam kết và khu vực tổ chức về lệnh cam kết trước đó:git đặt lại HEAD ~ 1
Thứ hai, chỉnh sửa + giai đoạn + cam kết các tệp riêng lẻ
Lệnh:
git thêm mã && git cam kết -m 'Thêm mã ban đầu'
git thêm mã mới && git cam kết -m 'Thêm mã mới'

Thứ ba, tiếp tục rebase và kết thúc.

Chỉ huy :git rebase - tiếp tục
Thứ tư, xem lịch sử với các cam kết bổ sung.

Chỉ huy: đi lịch sử

chia cam kết thành nhiều bằng cách sử dụng rebase - Các lỗi git thường gặp - Edureka

Thay đổi email tác giả trong tất cả các cam kết trên tất cả các chi nhánh

Tôi đã lập phiên bản và cam kết các tệp dự án của mình trong git từ rất lâu rồi, nhưng cho đến nay, tôi chưa bao giờ thấy rằng id email của tôi đã bị xâm phạm trong nhật ký lịch sử cam kết của tôi, thậm chí được xuất bản trên các kho lưu trữ từ xa. Chà, điều này có thể xảy ra với bất kỳ ai khi ban đầu bạn thiết lập cấu hình trong tệp “.gitconfig”. Vì vậy, git của tôi có thể viết lại các biến môi trường mà chúng tôi cung cấp khi tạo một đối tượng cam kết.

Đầu tiên tôi nhận được danh sách id email để quyết định những cái tôi muốn thay đổi:
Chỉ huy: git log --all --pretty = format: '% an% d'–This in tên tác giả (refname / branch-name)

Thứ hai, tôi chạy qua mọi cam kết trên mỗi nhánh và viết lại đối tượng cam kết với id email mới
Chỉ huy:
git filter-branch --env-filter '
nếu ['$ GIT_AUTHOR_NAME' = 'divya']
sau đó
GIT_AUTHOR_EMAIL = 'divya@github.com'

' -- --tất cả

logic mờ trong trí tuệ nhân tạo

Tệp bị mất và tìm thấy

Giả sử bạn bị mất một tệp nào đó và bạn không nhớ tên của nó, nhưng có thể nhớ lại các từ nhất định trong tệp. Trong trường hợp này, bạn có thể làm theo các bước sau-
Bước 1: Liệt kê tất cả các cam kết từng chứa ảnh chụp nhanh tệp với mẫu đã tìm kiếm
Chỉ huy :git rev-list --all | xargs git grep -i 'dấu thời gian'



Bước 2 : Tạo một nhánh mới 'lost-found' từ id cam kết được đánh dấu này
Cú pháp: git checkout -b bị mất-tìm thấy d8c6a76a6dcb1fc6e8c3f6b097e1bd07e7cd328f

Quên chi nhánh nào có id cam kết của tôi

Đôi khi, sau khi bạn phát hiện một id cam kết có lỗi, bạn cũng có thể muốn biết tất cả các nhánh có cam kết này trên chúng để bạn có thể sửa chữa tất cả. Việc kiểm tra lịch sử của từng chi nhánh không thực tế lắm trong một dự án nhiều chi nhánh lớn.

Một cam kết xấu được thực hiện trong ứng dụng xây dựng điều hướng của tôi đã từng làm hỏng mã, đó là khi tôi sử dụng Lệnh ‘git bisect’ để phát hiện id cam kết bị lỗi tiếp theo làchỉ huy:git branch --containsđể liệt kê các nhánh có cam kết xấu đó.

Vì vậy, bây giờ tôi biết tất cả các nhánh vẫn có cam kết xấu, tôi có thể hoàn nguyên hoặc đặt lại tập thay đổi này.

Xóa cam kết khỏi lịch sử

Đôi khi tôi cảm thấy cần phải xóa sạch một cam kết khỏi lịch sử và không để lại dấu vết của nó. Tôi không khuyên bạn nên thử đóng thế này trên một chi nhánh được chia sẻ mà chỉ trên chi nhánh địa phương của bạn.
Cú pháp: git rebase -i
Chỉ huy :git rebase -i 93859d8
Trong trình chỉnh sửa rebase-> thay thế ‘chỉnh sửa’ bằng ‘thả’ cho id cam kết được đánh dấu: 69f4813

Trong một số trường hợp, việc viết lại này có thể dẫn đến xung đột. Bạn phải giải quyết xung đột sau đó tiến hành thêm.

Cảnh báo : Đây là một lệnh nguy hiểm vì lệnh này ghi lại lịch sử và có thể làm mất dữ liệu. Vì vậy, một nhánh khác với đối tác từ xa của nó và sẽ phải được đẩy bằng--lực lượnghoặc là- hợp đồng cho thuêLựa chọn.

Đã đẩy nhầm một nhánh vào điều khiển từ xa

Bây giờ, đây là những gì tôi muốn làm- Tôi muốn xóa một chi nhánh xa và cũng ngừng theo dõi nó từ chi nhánh địa phương của tôi. 'git pushLệnh ‘khi được sử dụng với--xóa bỏtùy chọn xóa nhánh từ xa Vì vậy, đây là cách tôi lấy bản sao cục bộ của dự án nhân bản -

git clone https://github.com/greets/myProj.git
cd myProj


Sau khi, nhánh từ xa bị xóa, những người khác trên repo được chia sẻ phải làm mới và cập nhật các tham chiếu từ xa của họ với--prunetùy chọn để xóa các tham chiếu đối tượng bị thiếu:git fetch - prune -v origin

Trong bài đăng này, tôi đã đề cập đến một số lỗi hoặc thay đổi phổ biến mà git có thể giúp bạn sửa chữa. Mỗi mã là duy nhất và được phát triển theo cách của nó, vì vậy cũng có những cách khác nhau để tiếp cận và khắc phục sự cố. Bạn luôn có thể tham khảo các quan chức tài liệu git để hiểu cách các lệnh git khác nhau bảo vệ mã nguồn của bạn và cách sử dụng các lệnh theo cách tốt nhất có thể.

Bây giờ bạn đã hiểu các lỗi Git phổ biến, hãy xem phần này của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo Chứng chỉ Edureka DevOps giúp người học hiểu DevOps là gì và có được kiến ​​thức chuyên môn về các quy trình và công cụ DevOps khác nhau như Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack và GIT để tự động hóa nhiều bước trong SDLC.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến vấn đề này trong phần nhận xét về 'lỗi Git phổ biến' này và chúng tôi sẽ liên hệ lại với bạn