Tại sao git liên tục hiển thị các thay đổi của tôi khi tôi chuyển các nhánh (tệp đã sửa đổi, thêm, xóa) cho dù tôi có chạy git add hay không?


115

Tôi thực sự mới sử dụng git và tôi đang cố gắng hiểu tại sao git tiếp tục hiển thị bất kỳ thứ gì tôi đã thay đổi ở một nhánh này trong nhánh khác khi tôi chạy git checkout để chuyển đổi giữa các nhánh Đầu tiên tôi đã thử không sử dụng git add và không hoạt động. Tuy nhiên, sau đó tôi đã thử sử dụng git add, nhưng không khắc phục được sự cố. Tôi chưa sử dụng git commit.

Về cơ bản đây là những gì tôi đang làm:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Tôi nghĩ rằng, trong khi sử dụng các nhánh, bất cứ điều gì bạn làm ở một nhánh, nó sẽ vô hình đối với tất cả các nhánh khác. Đó không phải là lý do tạo ra các nhánh sao?

Tôi đã thử sử dụng "git add" nhưng những thay đổi có thể nhìn thấy ở cả hai nhánh. Tôi có cần chạy "git commit" trước khi chuyển đổi giữa các nhánh để tránh điều này không?

Câu trả lời:


142

Chuyển đổi nhánh mang theo những thay đổi không cam kết với bạn. Hãy cam kết trước, chạy git checkout .để hoàn tác chúng hoặc chạy git stashtrước khi chuyển đổi. (Bạn có thể lấy lại các thay đổi của mình bằng git stash apply)


10
git stash pop tốt hơn trừ khi bạn muốn tạo một kho lưu trữ khổng lồ.
siride

7
@JPZ: git stash chỉ xử lý các tệp được theo dõi; các tệp mới không được theo dõi, vì vậy chúng sẽ không bị lưu trữ.
siride

2
@JPZ: Nếu bạn muốn lưu trữ các tệp chưa được theo dõi, điều cần làm là git addchúng trước khi lưu trữ. Điều đó nói rằng, tôi không chắc bạn thực sự muốn lưu trữ ở đây - nếu bạn có ý định cho những thay đổi đó là một phần của nhánh bạn đang chuyển đổi, hãy cam kết chúng. (Nếu bạn có ý định quay lại với chi nhánh và làm việc trên những thay đổi hơn trước khi cam kết họ, sau đó stashcó thể là công cụ thích hợp cho công việc.)
Cascabel

16
"Chuyển đổi các nhánh mang theo những thay đổi không cam kết với bạn" - Điều này có ý nghĩa và có lẽ là ý tưởng thiết kế tồi tệ nhất. Có ích lợi gì khi có chi nhánh nếu bạn không thể làm việc một cách cô lập? !!!
nehem

1
Trong trường hợp của tôi, tôi có một nhánh tính năng từ nhánh phát triển. Tôi đã cam kết trong nhánh tính năng nhưng nó cũng cho thấy những thay đổi khi tôi kiểm tra nhánh phát triển.
Hitesh Garg,

31

Câu trả lời ngắn gọn: có, bạn cần phải cam kết. Tuy nhiên, hãy chắc chắn rằng bạn làm điều đó trên đúng nhánh!

Một nhánh là một con trỏ đến một cam kết. Khi bạn cam kết với một chi nhánh đã được kiểm tra, chi nhánh sẽ tiến tới trỏ đến cam kết mới đó. Khi bạn kiểm tra một chi nhánh, bạn đang kiểm tra cam kết mà nó trỏ đến. (Bạn có thể coi các cam kết như ảnh chụp nhanh cây công việc của mình.)

Vì vậy, nếu bạn có những thay đổi mà bạn chưa cam kết, chúng sẽ không bị ảnh hưởng khi chuyển các nhánh. Tất nhiên, nếu việc chuyển đổi chi nhánh không tương thích với những thay đổi của bạn, git checkoutđơn giản là sẽ từ chối thực hiện.

git addlà một lệnh cho các thay đổi theo giai đoạn, sau đó bạn sẽ cam kết. Nó không ghi lại những thay đổi đó vào lịch sử của kho lưu trữ. Nó chỉ đơn giản là đặt chúng vào một vùng dàn dựng (chỉ mục); git commitsau đó sử dụng nội dung của vùng dàn dựng đó để tạo cam kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.