Trong v2.24 git switch
là một cái gì đó giống như một cái két sắt git checkout
.
Do đó tôi đổi tên bí danh dưới đây để git hop
cho
"hop trên cành mà không thay đổi worktree"
Vì lợi ích của người đọc:
Mặc dù tôi nghĩ rằng giải pháp của Charles Bailey là một giải pháp chính xác, nhưng giải pháp này cần một sự điều chỉnh khi chuyển sang một thứ gì đó không phải là nhánh cục bộ. Ngoài ra, cần có một số cách thực hiện với các lệnh thông thường dễ hiểu. Đây là những gì tôi nghĩ ra:
git checkout --detach
git reset --soft commitish
git checkout commitish
Giải thích:
git checkout --detach
cũng giống như git checkout HEAD^{}
việc bỏ nhánh hiện tại phía sau và chuyển sang "trạng thái nguyên thủ tách rời". Vì vậy, sửa đổi tiếp theo của HEAD
không ảnh hưởng đến bất kỳ nhánh nào. Việc tách HEAD
ra không ảnh hưởng đến worktree cũng như chỉ mục.
git reset --soft commitish
sau đó di chuyển HEAD
đến SHA của đã cho commitish
. Nếu bạn cũng muốn cập nhật chỉ mục, hãy bỏ --soft
đi, nhưng tôi không khuyên bạn nên làm như vậy. Điều này, một lần nữa, không chạm vào worktree và ( --soft
) không phải là chỉ mục.
git checkout commitish
sau đó lại gắn HEAD
vào commitish
(nhánh) đã cho. (Nếu commitish
là SHA thì không có gì xảy ra.) Điều này cũng không ảnh hưởng đến chỉ mục cũng như worktree.
Giải pháp này chấp nhận mọi thứ đề cập đến một cam kết, vì vậy đây là lý tưởng cho một số git
bí danh. Dưới rev-parse
đây chỉ là một bài kiểm tra để đảm bảo rằng không có gì bị hỏng trong chuỗi, sao cho lỗi chính tả không vô tình chuyển sang trạng thái đầu tách rời (khôi phục lỗi sẽ phức tạp hơn nhiều).
Điều này dẫn đến git hop treeish
bí danh sau :
git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
FYI, bạn có thể tìm thấy nó trong danh sách git
bí danh của tôi .