Tại sao khi switch branch thì dữ liệu thay đổi trong workspace bị mang sang branch mới?
1. Có một branch master, chứa file sample.txt.
2. Tạo một branch tên là abc,
3. Switch qua branch abc này
4. Thay đổi file sample.txt bằng cách thêm dòng text "Hello I am abc" save lại nhưng ko commit
5. Switch về lại branch master
6. Kiểm tra file sample.txt
Result : File sample.txt hiển thị dòng “Hello i am abc”
Theo mình nghĩ lẽ ra file sample.txt này ko bị thay đổi theo branch abc mới đúng logic chứ nhỉ. Mình vẫn chưa hiểu chỗ này lắm. 2 branch khác nhau , chưa thực hiện lệnh merge và sao giờ data lại giống nhau.
Tuy nhiên ở bước 4 nếu mình thay đổi xong và thực hiện lệnh commit. Sau đó switch sang master thì thấy master vẫn giữ data cũ (không có chữ “Hello I am abc”). Khi mình tiến hành merge với branch abc thì file này mới được cập nhật. Như thế này thì mới đúng logic.
Còn việc chưa commit từ branch abc mà data trên master bị thay đổi theo là sao ấy nhỉ. Bạn nào giải thích giúp mình chỗ này.
Vì các thay đổi này được thực hiện ở Workspace của bạn, khi mình switch branch các dữ liệu này sẽ được merge vào branch mới. Tính năng này để dùng khi bạn muốn phát triển một tính năng mới cho hệ thống của mình, khi đang làm thì bạn sực nhớ ra là tính năng này nên mang sang branh mà làm. Ngay khi đấy bạn sẽ cần tạo nhánh, cách nhanh nhất là
Mở rộng:
Git có
git diff
hoặcgit status
git add ten_file
. Khi này file đã có sự thay đổi sẽ được lưu vào vùng này. Để hiển thị thay đổi, khi này bạn phải dùng lệnhgit diff --cache
git commit
git push
Xem thêm cheat sheet này bạn sẽ thấy: http://ndpsoftware.com/git-cheatsheet.html
Thông tin thêm:
git diff
tức là so sánh giữa working space và indexgit diff --cache
tức là so sánh giữa index và local repositoryindex sẽ đúng bằng với commit mới nhất của local repository, khi mình
git add
thì dữ liệu của index sẽ thay đổi, khi đó mình phải sử dụng lệnhgit diff
với--cache
để so sánh giữa index và local repository.Khi bạn commit lên branch thì dữ liệu sẽ lưu vào local repository rồi. Bây giờ
workspace == index == local repo != remote repo (vì bạn chưa
git push
)Nên khi bạn switch branch thì git không merge nữa
Ghi chú thêm là trong cheat sheet: http://ndpsoftware.com/git-cheatsheet.html có nói về stash, stash thứ bạn cần dùng khi bạn không muốn dữ liệu trên workspace được merge sang nhánh mới. Nhưng Đạt sẽ không trả lời ở topic này, vì nó sẽ làm rắc rối hơn vấn đề.
Đúng sở trường của a Đạt rồi, trả lời chi tiết quá
Cảm ơn anh Đạt về câu trả lời thật sự chi tiết.
Nhưng em vẫn còn thắc mắc về mặt logic của nó.
Ví dụ ở master A em đang có một source code tạm ổn rồi. Em tạo một branch mới để vọc và thay đổi một vài thứ trong code . Sau đó em save lại và ko commit hoặc do cúp điện ngay lúc vừa save xong.
Em mở máy lên lai và vào nhánh master, lúc này code đã bị thay đổi rồi. Sếp bảo push code lên server đi. Vậy giờ em phải làm sao với đống code lộn xộn hiện tại của master ?
Lúc này em đã commit hết ở master rồi hay chưa?
Tại sao không commit? Nên nói với sếp là sử dụng nguồn khác nha, đi làm mà cúp điện vậy đang chơi game bị disconnect sao?
Nếu em vào nhánh master thì em phải check xem thử có code nào thay đổi ở local hay không chứ?
Code nào nhỉ? Master em chưa ở clean state mà switch branch àNhầm, push thì cứ push chứ, code đang nằm ở local repository thì push thoải mái, cái bị thay đổi là cái workspace mà.
Lời khuyên của mình là bạn nên đọc lý thuyết về Git, rất rõ ràng dễ hiểu mà.
https://git-scm.com/doc
Sau khi hiểu core của nó rồi thì làm việc với branch chỉ là chuyện đơn giản.
Mình chỉ mất 2 ngày từ newbie là hiểu rõ và làm việc tốt với nó.