Git chỉ đang cố gắng đoán cho bạn những gì bạn đang cố gắng làm. Nó đang làm cho mọi nỗ lực để bảo tồn lịch sử không bị phá vỡ. Tất nhiên, nó không hoàn hảo. Vì vậy, git mv
cho phép bạn rõ ràng với ý định của bạn và để tránh một số lỗi.
Hãy xem xét ví dụ này. Bắt đầu với một repo trống,
git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
mv a c
mv b a
git status
Kết quả:
# 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")
Tự động sửa lỗi thất bại :( Hoặc đã làm điều đó?
$ 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
và sau đó
$ 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
Bây giờ hãy thử thay thế (nhớ xóa .git
thư mục khi thử nghiệm):
git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
git mv a c
git status
Càng xa càng tốt:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: a -> c
git mv b a
git status
Bây giờ, không ai là hoàn hảo:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a
# deleted: b
# new file: c
#
Có thật không? Nhưng đương nhiên là...
git add *
git commit -m "change"
git log c
git log --follow c
... Và kết quả cũng giống như trên: chỉ --follow
hiển thị toàn bộ lịch sử.
Bây giờ, hãy cẩn thận với việc đổi tên, vì một trong hai tùy chọn vẫn có thể tạo ra các hiệu ứng kỳ lạ . Thí dụ:
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
Tương phản với:
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
Kết quả:
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
Up ... Bây giờ lịch sử đang quay trở lại ban đầu a thay vì b ban đầu , đó là sai. Vì vậy, khi chúng tôi thực hiện hai động tác cùng một lúc, Git trở nên bối rối và không theo dõi các thay đổi đúng cách. Nhân tiện, trong các thí nghiệm của tôi, điều tương tự cũng xảy ra khi tôi xóa / tạo tệp thay vì sử dụng git mv
. Tiến hành cẩn thận; Mày đã được cảnh báo...