Mengapa git terus menampilkan perubahan saya saat saya berpindah cabang (diubah, ditambahkan, file terhapus) tidak peduli saya menjalankan git add atau tidak?

115

Saya benar-benar baru mengenal git dan saya telah mencoba memahami mengapa git terus menunjukkan apa pun yang saya ubah di satu cabang di cabang lain ketika saya menjalankan git checkout untuk beralih antar cabang Pertama saya mencoba untuk tidak menggunakan git add dan tidak berfungsi. Namun, saya mencoba kemudian menggunakan git add, tetapi tidak memperbaiki masalah. Saya belum menggunakan git commit.

Ini pada dasarnya yang saya lakukan:

$ 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")  

Saya pikir, saat menggunakan cabang, apapun yang Anda lakukan di satu cabang, itu tidak terlihat oleh semua cabang lainnya. Bukankah itu alasan membuat cabang?

Saya mencoba menggunakan "git add" tetapi perubahannya terlihat di kedua cabang. Apakah saya perlu menjalankan "git commit" sebelum beralih antar cabang untuk menghindari ini?

JPZ
sumber

Jawaban:

142

Perpindahan cabang membawa perubahan yang tidak terikat dengan Anda. Lakukan dulu, jalankan git checkout .untuk membatalkannya, atau jalankan git stashsebelum beralih. (Anda bisa mendapatkan perubahan Anda kembali dengan git stash apply)

Sean Clark Hess
sumber
10
git stash pop lebih baik kecuali jika Anda ingin membuat tumpukan besar.
siride
7
@JPZ: git stash hanya menangani file yang dilacak; file baru tidak dilacak, sehingga tidak akan disimpan.
siride
2
@JPZ: Jika Anda ingin git addmenyembunyikan file yang tidak terlacak, hal yang harus dilakukan adalah sebelum menyimpannya. Karena itu, saya tidak yakin Anda benar-benar ingin menyimpannya di sini - jika Anda bermaksud agar perubahan tersebut menjadi bagian dari cabang yang Anda alihkan, lakukan. (Jika Anda berniat untuk beralih kembali ke cabang itu dan mengerjakan perubahan lebih banyak sebelum menerapkannya, maka stashmungkin alat yang tepat untuk pekerjaan itu.)
Cascabel
16
"Perpindahan cabang membawa perubahan yang tidak perlu dilakukan" - Ini masuk akal dan mungkin ide desain terburuk. Apa gunanya memiliki cabang jika Anda tidak dapat bekerja secara terpisah? !!!
Nehem
1
Dalam kasus saya, saya memiliki satu cabang fitur dari cabang pengembangan. Saya berkomitmen di cabang fitur tetapi itu menunjukkan perubahan ketika saya memeriksa cabang pengembangan juga.
Hitesh Garg
31

Jawaban singkatnya: ya, Anda perlu berkomitmen. Pastikan Anda melakukannya di cabang yang benar!

Cabang adalah penunjuk ke komit. Saat Anda berkomitmen dengan cabang yang diperiksa, cabang maju untuk menunjuk ke komit baru itu. Saat Anda memeriksa cabang, Anda memeriksa komit yang ditunjuknya. (Anda dapat menganggap komit sebagai snapshot dari pohon kerja Anda.)

Jadi, jika Anda memiliki perubahan yang belum Anda lakukan, perubahan tersebut tidak akan terpengaruh dengan berpindah cabang. Tentu saja, jika pergantian cabang tidak kompatibel dengan perubahan Anda,git checkout hanya akan menolak untuk melakukannya.

git addadalah perintah untuk melakukan perubahan, yang kemudian akan Anda lakukan. Itu tidak merekam perubahan tersebut ke dalam sejarah repositori. Ini hanya menempatkan mereka ke dalam area pementasan (indeks); git commitkemudian menggunakan konten dari area pementasan tersebut untuk membuat komit.

Bertingkat
sumber