2013-07-20 39 views
6

Trong các tài liệu git (và nhiều SO đề) cách tiếp cận reset này được đề nghị:Tại sao rõ ràng gọi git reset --soft trước khi thiết lập lại git (--mixed)

$ git reset --soft HEAD^ ;# go back to WIP state <2> 
$ git reset          <3> 

.2. Điều này loại bỏ các cam kết WIP từ lịch sử cam kết, và đặt cây làm việc của bạn để nhà nước ngay trước khi bạn thực hiện ảnh chụp đó.

.3. Tại thời điểm này, tệp chỉ mục vẫn có tất cả các thay đổi WIP mà bạn đã cam kết là WIP chụp nhanh. Việc này sẽ cập nhật chỉ mục để hiển thị các tệp WIP của bạn là không được cam kết.

https://www.kernel.org/pub/software/scm/git/docs/git-reset.html

Rõ ràng đó là tốt, nhưng có vẻ như hai lệnh dưới đây có thể được thay thế bằng

$ git reset HEAD^ 

(tương đương với)

$ git reset --mixed HEAD^ 

mà nên đặt lại cả con trỏ HEAD và chỉ mục cho cam kết trước đó. Có thực sự là một sự khác biệt giữa kết quả của lệnh này và hai lệnh trước đó không? Nếu không, có một số lý do để thích quá trình hai giai đoạn? Hoặc là nó chỉ được thực hiện theo cách đó trong các tài liệu để minh họa một cách rõ ràng hành vi của --soft?

Trả lời

5

Không, dường như không có sự khác biệt nào.
Nó là nhiều hơn để minh họa cho git reset --soft (tức làchỉ di chuyển HEAD, mà có thể have other more practical uses)

git reset HEAD là dành cho "unstaging", và đơn giản git reset HEAD^ nào cả (di chuyển HEAD, và unstage, không cần --mixed, vì nó là tùy chọn mặc định)


Dưới đây là một thử nghiệm nhanh để xem những gì trông giống như:

Trước (bạn chỉ cần chuyển về tính năng, nơi bạn cam kết một "wip" - công việc cơ bản dở dang):

C:\Users\VonC\prog\git\test\r\r3>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (2 minutes ago) <VonC> 
| * fd8d97d - (HEAD, origin/feature, feature) snap WIP (3 minutes ago) <VonC> 
| * 16066dd - f1 (3 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (3 minutes ago) <VonC> 

reset bản thân:

C:\Users\VonC\prog\git\test\r\r3>git reset "HEAD^" 
Unstaged changes after reset: 
M  f 

Cung cấp cho bạn các trạng thái:

C:\Users\VonC\prog\git\test\r\r3>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# 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: f 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

log sau git reset HEAD^

C:\Users\VonC\prog\git\test\r\r3>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (6 minutes ago) <VonC> 
| * fd8d97d - (origin/feature) snap WIP (7 minutes ago) <VonC> 
| * 16066dd - (HEAD, feature) f1 (7 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (8 minutes ago) <VonC> 

Trong hai bước, bạn đã có thể nhìn thấy sau khi đăng nhập sau git reset --soft HEAD^:

C:\Users\VonC\prog\git\test\r\r2>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (65 seconds ago) <VonC> 
| * fd8d97d - (origin/feature) snap WIP (89 seconds ago) <VonC> 
| * 16066dd - (HEAD, feature) f1 (2 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (2 minutes ago) <VonC> 

Bạn chỉ số vẫn sẽ phản ánh những gì đã được dàn dựng cho wip:

C:\Users\VonC\prog\git\test\r\r2>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: f 
# 

reset sau đó sẽ unstaged, mang lại cho bạn trở lại cùng một sân khấu hơn là một git reset HEAD^ sẽ có trong một bước:

C:\Users\VonC\prog\git\test\r\r2>git reset 
Unstaged changes after reset: 
M  f 

C:\Users\VonC\prog\git\test\r\r2>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# 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: f 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
+0

Cảm ơn bạn đã xác nhận. Và chắc chắn có những cách sử dụng khác cho git reset --soft. (Trong trường hợp cơ bản nhất, thường không có lý do gì để đặt lại chỉ mục là tốt, trong trường hợp đó --soft sẽ giúp bạn tiết kiệm thời gian để sắp xếp lại các tệp.) Nhưng tốt để biết chắc chắn rằng không cần thiết cho cả hai -stage quá trình nếu bạn đang lập kế hoạch để thiết lập lại chỉ mục là tốt anyway. Tại sao phải nhập nhiều ký tự hơn mức cần thiết? –

+0

@NathanStretch Tôi đồng ý. Nó là nhiều hơn để đưa ra một lựa chọn (trong trường hợp bạn cam kết một công việc đang tiến hành bao gồm các diễn biến cần được dàn dựng và * các diễn biến khác cần được dàn dựng * riêng *: sau đó, bạn unstage mọi thứ, và 'git add' những gì bạn muốn cam kết đầu tiên trong wip của bạn. – VonC

Các vấn đề liên quan