Có một số câu trả lời ở đây với một quan niệm sai lầm về git reset --soft
. Mặc dù có một điều kiện cụ thể git reset --soft
sẽ chỉ thay đổi HEAD
(bắt đầu từ trạng thái đầu tách rời), thông thường (và cho mục đích sử dụng), nó di chuyển tham chiếu chi nhánh mà bạn hiện đã kiểm tra. Tất nhiên, nó không thể làm điều này nếu bạn không kiểm tra chi nhánh (do đó điều kiện cụ thể git reset --soft
sẽ chỉ thay đổi HEAD
).
Tôi thấy đây là cách tốt nhất để suy nghĩ git reset
. Bạn không chỉ di chuyển HEAD
( mọi thứ đều như vậy ), bạn cũng đang di chuyển nhánh ref , ví dụ : master
. Điều này tương tự với những gì xảy ra khi bạn chạy git commit
(nhánh hiện tại di chuyển cùng HEAD
), ngoại trừ thay vì tạo (và chuyển sang) một cam kết mới , bạn chuyển sang cam kết trước .
Đây là điểm reset
, thay đổi một nhánh thành một thứ khác hơn là một cam kết mới, không thay đổi HEAD
. Bạn có thể thấy điều này trong ví dụ tài liệu:
Hoàn tác một cam kết, làm cho nó trở thành một nhánh chủ đề
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Bạn đã thực hiện một số cam kết, nhưng nhận ra rằng họ còn sớm để ở trong nhánh "chính". Bạn muốn tiếp tục đánh bóng chúng trong một nhánh chủ đề, vì vậy hãy tạo nhánh "topic / wip" khỏi ĐẦU hiện tại.
- Tua lại nhánh chính để thoát khỏi ba cam kết đó.
- Chuyển sang chi nhánh "topic / wip" và tiếp tục làm việc.
Điểm của loạt lệnh này là gì? Bạn muốn di chuyển một chi nhánh , ở đây master
, vì vậy trong khi bạn đã master
kiểm tra, bạn chạy git reset
.
Câu trả lời được bình chọn hàng đầu ở đây nói chung là tốt, nhưng tôi nghĩ tôi nên thêm câu này để sửa một số câu trả lời với những quan niệm sai lầm.
Thay đổi chi nhánh của bạn
git reset --soft <ref>
: đặt lại con trỏ nhánh cho nhánh đang được kiểm tra thành cam kết tại tham chiếu đã chỉ định , <ref>
. Các tập tin trong thư mục làm việc và chỉ mục của bạn không được thay đổi. Cam kết từ giai đoạn này sẽ đưa bạn trở lại nơi bạn đã ở trước git reset
lệnh.
Thay đổi chỉ mục của bạn quá
git reset --mixed <ref>
hoặc tương đương
git reset <ref>
:
Liệu những gì --soft
làm và cũng reset chỉ số cho phù hợp với các cam kết tại tham chiếu cụ thể. Mặc dù git reset --soft HEAD
không có gì (vì nó nói di chuyển nhánh đã kiểm tra sang nhánh đã kiểm tra) git reset --mixed HEAD
, hoặc tương đương git reset HEAD
, là một lệnh phổ biến và hữu ích vì nó đặt lại chỉ mục về trạng thái của lần xác nhận cuối cùng của bạn.
Thay đổi thư mục làm việc của bạn quá
git reset --hard <ref>
: Làm những gì --mixed
không và cũng ghi đè thư mục làm việc của bạn. Lệnh này tương tự git checkout <ref>
, ngoại trừ rằng (và đây là điểm quan trọng về reset
) tất cả các hình thức git reset
di chuyển mà nhánh ref HEAD
đang trỏ tới.
Một lưu ý về "lệnh như vậy và lệnh đó di chuyển TRƯỚC":
Nó không hữu ích để nói một lệnh di chuyển HEAD
. Bất kỳ lệnh nào thay đổi nơi bạn đang ở trong lịch sử cam kết của bạn sẽ di chuyển HEAD
. Đó là những gì HEAD
là , một con trỏ đến bất cứ nơi nào bạn đang có. HEAD
là bạn , và vì vậy sẽ di chuyển bất cứ khi nào bạn làm.