Cách hoàn nguyên nhiều cam kết trong Git

Cách hoàn nguyên nhiều cam kết trong Git
Git Command Line

Hiểu về đảo ngược cam kết Git

Hoàn nguyên nhiều cam kết trong kho Git là một nhiệm vụ phổ biến khi các thay đổi trước đó cần được hoàn tác mà không làm thay đổi lịch sử của dự án. Đó là một phương pháp an toàn để theo dõi lại các thay đổi trong khi vẫn duy trì tính toàn vẹn của công việc trước đây của bạn. Cách tiếp cận này đặc biệt hữu ích khi bạn đã chia sẻ những thay đổi của mình với người khác và rebase không còn là một lựa chọn khả thi nữa.

Thử thách nảy sinh khi bạn cần hoàn nguyên một loạt các cam kết—như chuyển từ HEAD ở cam kết D trở lại A, bỏ qua các cam kết B, C và D một cách hiệu quả. Hiểu phương pháp và thứ tự chính xác để hoàn nguyên các cam kết này là rất quan trọng để duy trì một cam kết kho lưu trữ sạch sẽ và chức năng.

Yêu cầu Sự miêu tả
git reset --hard A Đặt lại HEAD của nhánh hiện tại thành cam kết đã chỉ định (A trong trường hợp này), loại bỏ tất cả các thay đổi trong thư mục và chỉ mục làm việc kể từ cam kết đó.
git push --force Buộc đẩy tới kho lưu trữ từ xa, ghi đè các thay đổi ở điều khiển từ xa bằng trạng thái nhánh hiện tại. Điều này là cần thiết sau khi thiết lập lại cứng nếu các thay đổi đã được đẩy trước đó.
git revert <commit> --no-commit Hoàn nguyên các thay đổi được đưa ra bởi cam kết đã chỉ định mà không thực hiện hoàn nguyên. Điều này cho phép nhiều lần hoàn nguyên được nhóm thành một cam kết duy nhất.
git commit -m "Message" Cam kết nội dung khu vực tổ chức hiện tại vào kho lưu trữ với thông báo được cung cấp, hoàn tất quá trình hoàn nguyên hoặc đặt lại.

Giải thích về tập lệnh lệnh Git

Các tập lệnh được cung cấp được thiết kế để quản lý và hoàn nguyên các thay đổi trong kho Git, bằng cách đặt lại nhánh về trạng thái trước đó hoặc bằng cách hoàn nguyên có chọn lọc các cam kết. Các git reset --hard A lệnh rất quan trọng vì nó trực tiếp xác định lại HEAD của nhánh cho lần xác nhận trước đó, được xác định là 'A'. Hành động này loại bỏ tất cả các thay đổi được thực hiện đối với nhánh sau lần xác nhận A, làm cho trạng thái kho lưu trữ giống hệt với trạng thái tại lần xác nhận A. Lệnh này rất mạnh nhưng phải được sử dụng thận trọng vì nó xóa vĩnh viễn các thay đổi, khiến nó phù hợp khi bạn cần hoàn nguyên rõ ràng đến một trạng thái tốt đã biết.

Các git revert lệnh, kết hợp với --no-commit tùy chọn, được sử dụng khi bạn muốn hoàn tác các thay đổi cụ thể được đưa ra bởi các cam kết B, C và D nhưng muốn ghi lại những gì đã được hoàn tác. Phương pháp này duy trì lịch sử, điều này có lợi cho các kho lưu trữ được chia sẻ, nơi việc hiểu rõ diễn biến của các thay đổi là quan trọng. Sau khi hoàn nguyên các cam kết cần thiết, một git commit được sử dụng để nhóm tất cả các lần đảo ngược thành một ảnh chụp nhanh, giúp đơn giản hóa lịch sử dự án và giúp bạn dễ hiểu bối cảnh của việc đảo ngược hơn. Việc sử dụng git push --force là cần thiết để cập nhật kho lưu trữ từ xa sau những thay đổi mạnh mẽ như vậy đối với lịch sử của chi nhánh.

Đặt lại nhánh Git thành một cam kết cụ thể

Sử dụng dòng lệnh Git

git checkout your-branch-name
git reset --hard A
git push origin your-branch-name --force

Hoàn nguyên nhiều thay đổi trong Git

Viết kịch bản với Bash cho hoạt động Git

git checkout your-branch-name
git revert D --no-commit
git revert C --no-commit
git revert B --no-commit
git commit -m "Reverted commits B, C, and D"
git push origin your-branch-name

Kỹ thuật nâng cao để quản lý lịch sử Git

Khi xử lý kho lưu trữ Git, người dùng nâng cao thường cần nhiều thứ hơn là chỉ đảo ngược hoặc đặt lại cam kết cơ bản. Một kỹ thuật như vậy là sử dụng rebase tương tác để chỉnh sửa lịch sử được kiểm soát nhiều hơn. Rebase tương tác cho phép bạn chọn, thu nhỏ, chỉnh sửa hoặc bỏ qua các cam kết khỏi danh sách chi tiết trong phiên rebase, giúp kiểm soát tốt hơn lịch sử cam kết. Phương pháp này đặc biệt hữu ích khi chuẩn bị các lịch sử phức tạp trước khi hợp nhất chúng vào một nhánh chính, đảm bảo rằng lịch sử của dự án rõ ràng và dễ hiểu.

Một phương pháp nâng cao khác là sử dụng reflog, một cơ chế trong Git ghi lại các cập nhật đối với đầu các nhánh và các tài liệu tham khảo khác trong kho lưu trữ. Việc reflog có thể rất có giá trị đối với các tình huống khôi phục khi bạn cần xem lại và có thể khôi phục các trạng thái trước đó của dự án mà không còn có thể truy cập trực tiếp thông qua các mẹo nhánh do quá trình dọn dẹp quá mức hoặc lỗi trong thao tác lịch sử.

Các câu hỏi Git cần thiết đã được trả lời

  1. cái gì làm git reset --hard lệnh làm gì?
  2. Nó đặt lại HEAD của nhánh hiện tại về cam kết đã chỉ định, loại bỏ tất cả các thay đổi trong vùng tổ chức và thư mục làm việc kể từ cam kết đó.
  3. Tôi có thể hoàn nguyên một cam kết hợp nhất không?
  4. Có, bạn có thể hoàn nguyên một cam kết hợp nhất cụ thể bằng cách sử dụng git revert -m 1 <commit>, trong đó "1" chỉ định cam kết gốc của việc hợp nhất cần giữ lại.
  5. Vai trò của là gì git reflog?
  6. Relog được sử dụng để theo dõi các thay đổi đối với đầu các nhánh và các tài liệu tham khảo khác trong kho lưu trữ, giúp khôi phục các cam kết bị mất hoặc khám phá các thay đổi được thực hiện trong kho lưu trữ.
  7. Làm thế nào số 8 khác với hợp nhất?
  8. Rebase viết lại lịch sử dự án bằng cách thay đổi cơ sở của một nhánh thành một cam kết mới, điều này có thể làm cho lịch sử sạch hơn so với việc hợp nhất.
  9. Có an toàn để đẩy mạnh sau khi đặt lại chi nhánh không?
  10. Việc ép buộc là cần thiết sau khi đặt lại nếu các thay đổi đã được đẩy nhưng nó có thể ghi đè các thay đổi từ xa và nên thận trọng khi sử dụng.

Suy nghĩ cuối cùng về việc đảo ngược cam kết Git

Quản lý thành công kho lưu trữ Git khi cần hoàn nguyên nhiều lần xác nhận liên quan đến việc hiểu các hàm ý và kỹ thuật có sẵn. Cho dù thông qua việc thiết lập lại cứng cho một cam kết cụ thể hay sử dụng cẩn thận các lệnh hoàn nguyên cho mỗi cam kết, mục tiêu vẫn là đảm bảo kho lưu trữ luôn sạch sẽ và lịch sử có thể hiểu được. Đối với các dự án cộng tác, điều quan trọng là phải thông báo những thay đổi này và quản lý kho lưu trữ từ xa một cách cẩn thận để tránh gián đoạn. Cuối cùng, việc nắm vững các lệnh này cho phép các nhà phát triển duy trì quyền kiểm soát dòng thời gian dự án của họ một cách hiệu quả.