Bạn không thể sửa đổi file trên hai nhánh và chuyển đổi giữa các nhánh đó mà không commit hoặc stash file. Điều này là vì Git không chắc chắn thay đổi nào nên được lưu và thay đổi nào nên bị ghi đè.
Hướng dẫn này thảo luận lỗi "Your local changes to the following files would be overwritten by checkout" và ý nghĩa của nó. Chúng ta sẽ đi qua ví dụ để bạn tìm ra cách sửa lỗi này.
Your local changes to the following files would be overwritten by checkout
Hệ thống kiểm soát phiên bản Git cho phép bạn duy trì các dòng phát triển riêng biệt, gọi là nhánh. Thay đổi trên nhánh này không phản ánh trên nhánh kia trừ khi bạn hợp nhất hai nhánh.
Khi bạn điều hướng đến nhánh, bạn có thể xem kho tại thời điểm cụ thể trong lịch sử và làm thay đổi cần thiết. Bạn nên commit thay đổi khi sẵn sàng để Git theo dõi sự phát triển của dự án.
Bạn không thể chuyển đổi giữa hai nhánh nếu cả hai nhánh chứa thay đổi file chưa commit. Git cần biết file nên được lưu hay là phần của commit. Điều này bảo vệ bạn khỏi việc vô tình ghi đè mã bạn có thể muốn tham chiếu sau.
Ví dụ Tình huống
Chúng ta sẽ clone kho chứa một file gọi là README.md:
git clone https://github.com/career-karma-tutorials/ck-git
Nội dung file README.md như sau:
# ck-git
Kho của chúng ta có hai nhánh: development và master. Trong thư mục làm việc cục bộ, chúng ta sẽ thay đổi file README.md trên nhánh master gốc:
# Career Karma Git
Nhánh master của chúng ta giờ khác kho từ xa. Chúng ta sẽ chuyển sang nhánh development và thay đổi nội dung README thành:
# Career Karma [Development]
Chúng ta có thể thay đổi file trên nhánh development bằng cách thực thi lệnh:
git checkout development nano README.md
Tiếp theo, chuyển về nhánh master, commit thay đổi làm cho nhánh, và đẩy lên kho từ xa:
git checkout master git add README.md git commit -m "docs: Update README" git push
Lệnh git checkout cho phép chúng ta chuyển sang nhánh master. Xem lại, kho từ xa giờ chứa:
- README.md đã sửa trên nhánh development
- Nhánh master tiến trước một commit
Bây giờ, hãy sửa đổi README.md lại trên nhánh master:
# Tutorials
Điều này có nghĩa là cả hai nhánh chứa sự khác biệt giữa nhánh master từ xa. Hãy thử chuyển sang nhánh development với các thay đổi này:
git checkout development
Lệnh này trả về thông báo lỗi:
error: Your local changes to the following files would be overwritten by checkout: README.md Please commit your changes or stash them before you switch branches. Aborting
Giải pháp
Vì nhánh development và master chứa thay đổi chưa commit, Git không thể tiến hành checkout. Nếu Git tiến hành, thay đổi chưa commit chúng ta làm cho README.md trên nhánh master sẽ không được lưu.
Chúng ta có thể sửa lỗi này theo hai cách. Thứ nhất, commit thay đổi trên nhánh master:
git add README.md git commit -m "docs: Add tutorials message to README.md file" git push
Trong các lệnh này, chúng ta thêm README.md vào khu vực chuẩn bị, thêm tất cả file từ khu vực chuẩn bị vào commit, và đẩy thay đổi lên kho từ xa.
Git giờ có bản ghi về cách README.md xuất hiện với thay đổi chúng ta làm.
Thay vào đó, chúng ta có thể stash (lưu tạm) thay đổi cho sau. Đây là giải pháp tốt nếu bạn muốn thay đổi có thể truy cập sau khi chưa sẵn sàng thêm vào commit. Để stash thay đổi, bạn có thể chạy lệnh git stash:
git stash save README.md
Điều này sẽ lưu file README.md trong stash. Bất cứ khi nào sẵn sàng xem lại file này, chúng ta có thể truy cập stash dùng lệnh stash pop:
git stash pop
Lệnh này sẽ khôi phục file README.md trong kho. "Stashing" là cách khác nói "lưu cho sau". Stash không tạo commit cho thay đổi.
Sau khi chạy một trong các giải pháp trên, chúng ta có thể điều hướng đến nhánh development thành công:
git checkout development
Lệnh này chuyển nhánh sang "development" và thông báo cho chúng ta biết thay đổi này trong terminal:
Switched to branch 'development'
Chúng ta đã giải quyết vấn đề.
Kết luận
Lỗi Git "Your local changes to the following files would be overwritten by checkout" xảy ra khi bạn làm thay đổi trên hai nhánh mà không commit hoặc stash những thay đổi đó và thử điều hướng giữa các nhánh.
Bạn có thể sửa vấn đề này bằng cách hoặc stash thay đổi cho sau hoặc thêm vào commit.
Bây giờ bạn có kiến thức cần thiết để sửa lỗi này như chuyên gia!