Git hanya mencoba menebak untuk Anda apa yang Anda coba lakukan. Itu membuat setiap upaya untuk melestarikan sejarah yang tak terputus. Tentu saja itu tidak sempurna. Begitugit mv memungkinkan Anda untuk eksplisit dengan niat Anda dan menghindari beberapa kesalahan.
Pertimbangkan contoh ini. Dimulai dengan repo kosong,
git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
mv a c
mv b a
git status
Hasil:
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a
# deleted: b
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# c
no changes added to commit (use "git add" and/or "git commit -a")
Deteksi otomatis gagal :( Atau berhasil?
$ git add *
$ git commit -m "change"
$ git log c
commit 0c5425be1121c20cc45df04734398dfbac689c39
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:24:56 2013 -0400
change
lalu
$ git log --follow c
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:24:56 2013 -0400
change
commit 50c2a4604a27be2a1f4b95399d5e0f96c3dbf70a
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:24:45 2013 -0400
initial commit
Sekarang coba sebagai gantinya (jangan lupa untuk menghapus .gitfolder saat bereksperimen):
git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
git mv a c
git status
Sejauh ini baik:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: a -> c
git mv b a
git status
Sekarang, tidak ada yang sempurna:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a
# deleted: b
# new file: c
#
Betulkah? Tapi tentu saja...
git add *
git commit -m "change"
git log c
git log --follow c
... dan hasilnya sama seperti di atas: hanya --followmenampilkan riwayat lengkap.
Sekarang, berhati-hatilah dengan penggantian nama, karena opsi mana pun masih dapat menghasilkan efek aneh . Contoh:
git init
echo "First" >a
git add a
git commit -m "initial a"
echo "Second" >b
git add b
git commit -m "initial b"
git mv a c
git commit -m "first move"
git mv b a
git commit -m "second move"
git log --follow a
commit 81b80f5690deec1864ebff294f875980216a059d
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:35:58 2013 -0400
second move
commit f284fba9dc8455295b1abdaae9cc6ee941b66e7f
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:34:54 2013 -0400
initial b
Bandingkan dengan:
git init
echo "First" >a
git add a
git commit -m "initial a"
echo "Second" >b
git add b
git commit -m "initial b"
git mv a c
git mv b a
git commit -m "both moves at the same time"
git log --follow a
Hasil:
commit 84bf29b01f32ea6b746857e0d8401654c4413ecd
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:37:13 2013 -0400
both moves at the same time
commit ec0de3c5358758ffda462913f6e6294731400455
Author: Sergey Orshanskiy <*****@gmail.com>
Date: Sat Oct 12 00:36:52 2013 -0400
initial a
Ups ... Sekarang histori akan kembali ke inisial alih - alih inisial b , yang salah. Jadi ketika kami melakukan dua gerakan sekaligus, Git menjadi bingung dan tidak melacak perubahan dengan benar. Ngomong-ngomong, dalam percobaan saya hal yang sama terjadi ketika saya menghapus / membuat file alih-alih menggunakan git mv. Lanjutkan dengan hati-hati; Anda sudah diperingatkan ...