2 Pertanyaan: Perbedaan antara git rm di-cache dan git atur ulang KEPALA

pertanyaan dibuat di Sat, Mar 21, 2015 12:00 AM

Saya bingung dengan git rm --cached, saya kira.
Saya memiliki repositori dan file yang dikomit. Saya memodifikasi file dan saya lakukan: git add myfile Situs File sekarang dipentaskan.
Ketika saya melakukan git status:

 
# On branch master   
# Changes to be committed:  
#   (use "git reset HEAD <file>..." to unstage)  
#  
#       modified:   com/main/StringMain.java  
#  

Sekarang file tersebut adalah file terlacak yang dimodifikasi. Jadi saya berasumsi bahwa ada di area pementasan. Jadi saya tidak mengerti apa arti rekomendasi (use "git reset HEAD <file>..." to unstage). Jadi saya lakukan: git rm --cached bukannya diikuti oleh git commit. Tetapi ini sepertinya menghapus file saya agar tidak dilacak dan membuatnya tidak terlacak.
Jika saya lakukan git status:

 
# On branch master  
# Untracked files:  
#   (use "git add <file>..." to include in what will be committed)  
#  
#       com/  
nothing added to commit but untracked files present (use "git add" to track)  

Jadi apa yang terjadi?

    
11
2 Jawaban                              2                         

Berikut ini salah satu cara untuk memikirkannya:

 
git rm --cached [file]

Ini hanya menghapus file dari dilacak (status file dalam setelah itu ditambahkan - yaitu. git add [file] )

 
git reset HEAD [file]

Ini terus melacak perubahan pada file, tetapi akan mengembalikannya ke area 'tidak dipentaskan'.

Ini contohnya.

Pertama, saya membuat 4 file yang tidak terlacak:

 
$ for i in {A..D}; do touch $i; echo "First line" > $i; done
$ ls
A   B   C   D
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    A
    B
    C
    D

nothing added to commit but untracked files present (use "git add" to track)

Selanjutnya, saya melacaknya menggunakan git add, maka saya akan melakukan perubahan:

 
$ git add .

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   A
    new file:   B
    new file:   C
    new file:   D

$ git commit -m "First Commit"
[master 6e8d625] First Commit
 4 files changed, 4 insertions(+)
 create mode 100644 A
 create mode 100644 B
 create mode 100644 C
 create mode 100644 D

$ git status
On branch master
nothing to commit, working directory clean

Sekarang saya akan memodifikasi file A jadi git mengambil perubahan, maka saya akan menambahkan file yang diubah ke area pementasan:

 
$ echo "First line of file A" > A

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   A

no changes added to commit (use "git add" and/or "git commit -a")

$ git add A

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   A

Sekarang di sinilah perbedaannya.

Contoh pertama yang akan saya berikan kepada Anda adalah apa yang terjadi ketika Anda menggunakan git rm --cached :

 
$ git rm --cached A
rm 'A'

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    A

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    A

Perhatikan bagaimana file A sekarang tidak terlacak, seperti halnya sebelum menambahkannya ke git di awal (ketika " git add. " digunakan).

Sekarang, contoh kedua adalah jika saya harus menggunakan git atur ulang HEAD sebagai gantinya:

 
$ git reset HEAD A
Unstaged changes after reset:
M   A

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   A

no changes added to commit (use "git add" and/or "git commit -a")

Di sini Anda akan melihat bahwa itu me-reset status file A kembali ke keadaan tidak bertahap, tetapi masih terus melacak perubahan itu.

    
13
2015-07-04 18 18: 51: 00Z

git rm --cached menghapus file dari indeks.

git reset HEAD me-reset versi indeks file kembali ke kondisinya di komit HEAD.

Jadi perbedaannya adalah bahwa yang pertama menghapus file, sedangkan yang kedua mengembalikannya ke versi yang dikomit terakhir.


Untuk memverifikasi ini, Anda dapat menggunakan git diff untuk membandingkan pohon kerja dengan indeks, dan git diff --cached untuk membandingkan indeks dengan komit kepala.

Saat Anda menjalankan git rm --cached, file yang dimodifikasi dihapus seluruhnya dari indeks. Itu masih ada di direktori kerja dan komit terakhir. Jika Anda membandingkan indeks dengan komit terakhir:

 
git diff --cached modified_file

Anda akan melihat bahwa file yang dimodifikasi tidak ada dalam indeks. Ini dikonfirmasi oleh:

 
git status

Yang akan menampilkan file sebagai dijadwalkan untuk dihapus saat komit. Direktori kerja Anda tidak terpengaruh oleh git rm --cached, karena --cached bekerja langsung di indeks.

    
7
2013-06-15 11: 08: 40Z
  1. Jadi maksud Anda, git rm --cached menghapus file dari "database" dari git?Is this what you mean by the index? I thought that yang di-cache` merujuk ke area pementasan yang merupakan sesuatu antara komit dan yang tidak dilacak. Jika apa yang saya katakan sudah benar, saya tidak mengerti mengapa rm cached kemudian menghapus dari git db
    2013-06-15 16: 18: 44Z
  2. Saya juga melakukan git add perubahan. Kemudian saya melakukan git log --decorate --graph --oneline dan saya melihat HEAD pada commit terbaru. Jika saya lakukan git reset HEAD com/main/StringMain.java maka git log --decorate --graph --oneline masih menunjukkan hal yang sama. Jadi, bagaimana HEAD terpengaruh?
    2013-06-15 16: 27: 25Z
  3. Indeks dan area pementasan adalah hal yang sama. Indeks adalah batu loncatan untuk komit. Tindakan komit secara permanen menyimpan status indeks sebagai komit HEAD baru.
    2013-06-15 19: 15: 52Z
  4. @ Andomar Sayangnya, git rm --cached tidak selalu menghapus unstage perubahan. Misalnya, jika Anda memodifikasi file yang dilacak, tambahkan modifikasi ke indeks, kemudian jalankan git rm --cached, itu tidak akan menghapus modifikasi dari indeks , tetapi, sebagai gantinya, itu akan menempatkan dalam indeks file yang akan dihapus pada saat yang sama git status akan memberi tahu file tersebut tidak terlacak?!?! Memang membingungkan.
    2014-04-26 15: 25: 24Z
  5. Kasus utama saya untuk menggunakan ini adalah yang saya lakukan git add . dan kemudian saya memutuskan untuk memodifikasi .gitignore. Jadi saya ingin menggunakan salah satu dari dua perintah ini (rm atau reset seperti pada jawaban Anda) sebelum melakukan git add . lagi. Apakah kedua perintah itu sama dalam kasus penggunaan saya? Atau apakah git reset HEAD benar-benar mengubah direktori kerja? Terima kasih.
    2016-11-06 17: 05: 54Z
sumber ditempatkan sini