Trang chủ Thủ Thuật Cách khắc phục, chỉnh sửa hoặc hoàn tác cam kết Git (Thay...

Cách khắc phục, chỉnh sửa hoặc hoàn tác cam kết Git (Thay đổi lịch sử Git)

0
36

Cách khắc phục, chỉnh sửa hoặc hoàn tác cam kết Git (Thay đổi lịch sử Git)

Git logo

Lịch sử cam kết của Git được thiết kế để không thay đổi (đối với hầu hết các phần) và theo dõi mọi thay đổi trong dự án của bạn để bạn không bao giờ mất việc. Tuy nhiên, đôi khi cần phải viết lại lịch sử Git, vì vậy Git cung cấp một vài công cụ để chỉnh sửa các cam kết hiện có.

Thêm các thay đổi mới cho cam kết

Trường hợp sử dụng phổ biến nhất cho trường hợp này là khi bạn thực hiện một thông báo cam kết và sau đó, trước khi chuyển sang điều khiển từ xa, hãy nhận ra rằng bạn đã nhầm lẫn và cần thực hiện một thay đổi nhỏ. Tất nhiên, bạn có thể chỉ thực hiện một cam kết thứ hai, nhưng điều đó là không cần thiết và cũng cho tất cả đồng nghiệp của bạn thấy sai lầm ngớ ngẩn của bạn khi cuối cùng bạn đẩy đến điều khiển từ xa.

Nếu bạn chỉ cần thêm các thay đổi, bạn có thể sử dụng git commit --amend . Điều này sửa đổi cam kết gần đây nhất và kết hợp với các thay đổi bổ sung mà bạn đã tổ chức.

Trước tiên, bạn sẽ cần thực hiện các thay đổi của mình:

git thêm.

Và sau đó sửa đổi:

git commit --amend --no-edit

--no-edit sẽ làm cho lệnh không sửa đổi thông báo cam kết. Nếu bạn cần làm rõ những thay đổi mới trong một thông báo mới, hãy bỏ cờ này đi và bạn sẽ được nhắc về thông báo cam kết mới.

Bên dưới, lệnh sửa đổi thực hiện một cam kết mới với các thay đổi bổ sung và sau đó thay thế hoàn toàn cam kết nguồn trong lịch sử Git. Cam kết cũ vẫn có thể truy cập được từ git reflog (thông tin thêm về điều đó bên dưới), nhưng về sau, cam kết mới là thứ duy nhất tồn tại. Khi bạn đẩy đến một repo từ xa, không có cách nào để biết rằng cam kết đã được sửa đổi, đó là một thay đổi hoàn toàn cục bộ.

Quảng cáo

Vì điều này, bạn sẽ không muốn sửa đổi các cam kết đã được đẩy, vì bạn sẽ gặp phải nhiều vấn đề và buộc phải đẩy lên điều khiển từ xa, điều này không tốt cho bất kỳ ai.

Chỉ thay đổi thông báo cam kết Git

Nếu bạn không cần thực hiện bất kỳ thay đổi nào và chỉ muốn sửa lỗi đánh máy, bạn cũng có thể chạy amend mà không có bất kỳ thay đổi nào:

git commit --amend -m "một thông báo cam kết được cập nhật"

Những thay đổi chưa rõ ràng từ các cam kết

Lệnh sửa đổi của Git chỉ hoạt động nếu bạn thực sự thêm các thay đổi. Khi chúng tôi nói “được thêm vào”, chúng tôi không chỉ muốn nói đến các dòng mã mới; thay đổi một dòng mã cũng là thêm các thay đổi. Xóa một dòng mã hoặc toàn bộ tệp cũng là một thay đổi được thêm vào, mặc dù nó đang xóa dữ liệu khỏi dự án khi thay đổi đó được áp dụng.

Tuy nhiên, cũng có những trường hợp bạn có thể muốn thực sự xóa các thay đổi khỏi các cam kết. Ví dụ: giả sử bạn đã chạy:

git thêm.
git cam kết

Và thêm mọi thay đổi trong repo của bạn vào các thay đổi theo giai đoạn, và cam kết thực hiện trước khi nhận ra, “ôi tào lao! Tôi không có ý định cam kết một tập tin đó! ” Trong trường hợp này, bạn sẽ cần phải gửi tất cả các thay đổi trở lại giai đoạn, và sau đó bỏ phân loại các tệp bạn không muốn đẩy theo cách thủ công.

Giải pháp là thực hiện đặt lại, xóa cam kết và gửi lại các thay đổi. Có một số loại đặt lại, nhưng tất cả đều liên quan đến việc lấy các cam kết từ lịch sử của Git và gửi chúng trở lại dàn, thư mục cục bộ hoặc thẳng vào thùng rác.

f5026f58

Quảng cáo

Trong trường hợp này, thiết lập lại mềm là những gì bạn muốn, điều này sẽ gửi tất cả các thay đổi trở lại giai đoạn. Bạn có thể sử dụng cách viết tắt sau để đặt lại cam kết đằng sau HEAD, nếu không, bạn sẽ cần lấy tham chiếu từ git reflog :

git reset --soft HEAD ~

Sau đó, bạn sẽ cần xóa tệp mà bạn không muốn cam kết. Cách thực hiện việc này thực sự cũng là đặt lại, trong trường hợp này là đặt lại hỗn hợp trên một tệp cụ thể:

git reset --mixed filename

Điều này hoạt động vì việc đặt lại một tệp này sẽ xóa các thay đổi khỏi giai đoạn và nó sẽ không được cam kết khi bạn thực hiện lại cam kết.

Bạn cũng có thể thực hiện thiết lập lại hỗn hợp trên toàn bộ repo và git add tất cả các tệp ngoại trừ tệp bạn không muốn. Điều này dễ thực hiện hơn nếu bạn đang sử dụng ứng dụng khách GUI Git.

Cần Hoàn tác / Xóa một cam kết? Sử dụng hoàn nguyên

Hoàn nguyên cam kết là cách dễ nhất để xóa các thay đổi. Về cơ bản, nó nhận tất cả các thay đổi từ cam kết mục tiêu và áp dụng ngược lại với chúng. Nếu bạn đã tạo một tệp, tệp đó sẽ bị xóa. Nếu bạn đã xóa một dòng mã, mã đó sẽ được thêm lại. Đó là cách được Git chấp thuận để “xóa” hoặc “hoàn tác” một cam kết, vì bản gốc vẫn được lưu trong lịch sử git.

Để sử dụng nó, hãy chạy git log để xem các cam kết:

git log

5b6c2c8a

Sao chép ID tham chiếu, sau đó hoàn nguyên cam kết:

git hoàn nguyên 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Nếu bạn chỉ gặp khó khăn trong vim , hãy nhấn Q và có thể chạy git config --global core.editor "nano" .

Sử dụng Rebasing cho bất cứ điều gì phức tạp hơn

Rebasing về cơ bản là một phương pháp di chuyển các cam kết trong kho lưu trữ của bạn. Thay vì hợp nhất, rebase sẽ viết lại lịch sử git để chuyển các cam kết riêng lẻ đến một vị trí mới. Các cam kết ban đầu vẫn còn lơ lửng và bị xóa khỏi lịch sử Git chính thức, mặc dù chúng vẫn ở đó trong git reflog .

86db9305

Quảng cáo

Chúng tôi sẽ không đi sâu vào chi tiết chính xác của nó ở đây, nhưng nếu bạn quan tâm đến cách nó hoạt động, bạn có thể đọc hướng dẫn sử dụng git rebase của chúng tôi.

Nếu bạn muốn quay lại thì sao?

May mắn thay, Git luôn ghi lại mọi thay đổi, ngay cả khi bạn phá vỡ các quy tắc và viết lại lịch sử.

Mỗi lần đầu chi nhánh của bạn sẽ được cập nhật cho lý do nào, Git lưu trữ trạng thái của nội dung thư mục trước khi cập nhật trong tham chiếu Log, hoặc reflog . Bạn có thể xem nhật ký bằng git reflog :

git reflog

ecf50827

Nhiều người trong số này sẽ là cam kết thực tế, nhưng nó cũng bao gồm những thay đổi khác. Nếu bạn cần quay lại bất kỳ thay đổi riêng lẻ nào, bạn có thể thực hiện khôi phục cài đặt gốc:

git reset --hard fdb9db9

Điều này cung cấp một mạng lưới an toàn tốt đẹp, nhưng bạn nên cảnh báo rằng reflog chỉ theo dõi các thay đổi đã thực sự được cam kết, không chỉ theo giai đoạn và nó chỉ theo dõi các chuyển động của đầu nhánh. Ngoài ra, reflog chỉ giữ các mục nhập trong 90 ngày. Sau đó, bạn sẽ chỉ có thể khôi phục lại cam kết thực tế.

How to Scale Docker Containers Across Servers Using Kubernetes

Làm thế nào để mở rộng vùng chứa Docker trên các máy chủ bằng cách sử dụng Kubernetes

How Does Git Reset Actually Work? Soft, Hard, and Mixed Resets Explained

Git Reset thực sự hoạt động như thế nào? Giải thích các giá trị đặt lại mềm, cứng và hỗn hợp

How to Use Readonly Properties in PHP 8.1

Cách sử dụng thuộc tính Readonly trong PHP 8.1

What is Docker Swarm Mode and When Should You Use It?

Chế độ Docker Swarm là gì và khi nào bạn nên sử dụng nó?

How to Lint Your Kubernetes Manifests With Kube-Score

Làm thế nào để thu hút Kubernetes của bạn thao túng với Kube-Score

How to Quickly Deploy WordPress as a Docker Container

Cách nhanh chóng triển khai WordPress dưới dạng Docker Container

Dịch từ: https://www.cloudsavvyit.com/13067/how-to-fix-edit-or-undo-git-commits-changing-git-history/

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây