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à

git checkout -b ten_branch_moi

Mở rộng:

Git có

  • workspace: là thư mục thuộc về git, mọi thay đổi ở sẽ được hiển thị khi bạn gõ git diff hoặc git status
  • index/cache/stage: là tên cho cùng một vùng, vì lý do lịch sử nên nó có nhiều tên như vậy, dùng lưu trữ dữ liệu khi bạn dùng lệnh 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ệnh git diff --cache
  • local repository: là nơi sẽ lưu trữ sự thay đổi khi bạn dùng lệnh git commit
  • remote repository: là nơi sẽ lưu trữ sự thay đổi khi bạn dùng lệnh 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à index
git diff --cache tức là so sánh giữa index và local repository
index 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ệnh git 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 :smile:


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 đề.

3 Likes

Đúng sở trường của a Đạt rồi, trả lời chi tiết quá :grinning:

1 Like

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? :grin:

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 à :wink:

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à.

1 Like

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ó.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?