Làm thế nào để đừng sợ
tôi muốn cho bạn thấy rằng không có vấn đề làm thế nào xấu bạn mess up, cam kết không bao giờ bị phá hủy * và bạn luôn có thể trở lại nơi mà bạn bắt đầu.
Tôi đã thực hiện một cây git giả có hình dạng giống như bạn mô tả:
Tôi bây giờ sẽ quét sạch ba cam kết cuối cùng từ các chi nhánh 'backup':
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
$ git reset --hard HEAD~3
HEAD is now at 07e71d9 Merged "getDepsForScript" function
$ git log --oneline
07e71d9 Merged "getDepsForScript" function
...
Rất tiếc, điều đó thật tệ. Hãy quay lại nơi chúng ta bắt đầu. Trước tiên, hãy xem những gì chúng tôi đã làm:
$git reflog
07e71d9 [email protected]{0}: HEAD~3: updating HEAD
9b41f46 [email protected]{1}: commit: Removed extraneous whitespace
...
Bạn có thể thấy rằng khi chúng tôi đặt lại, tất cả git đã làm là thực hiện HEAD trỏ đến cam kết cũ đó. Nhưng không có cam kết thực sự bị mất - họ chỉ trở thành trẻ mồ côi, không phải là một phần của bất kỳ chi nhánh nào. Hãy đặt chúng trở thành một phần của nhánh "sao lưu" một lần nữa:
$ git reset --hard 9b41f46
HEAD is now at 9b41f46 Removed extraneous whitespace
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
Git nghĩa là không bao giờ phải nói bạn đang xin lỗi.
* Các vật thể lỏng lẻo cuối cùng cũng bị thu gom rác, nhưng không phải cho đến khi chúng được ít nhất hai tuần tuổi.
Cách làm những gì bạn muốn.
Đầu tiên chúng ta hãy kết hợp hai cam kết trong tổng thể:
$ git checkout master
$ git rebase -i HEAD~2
Git sẽ khởi động soạn thảo của bạn. Thay đổi này:
pick 6389f4e Moved "loaded" function out of "require".
pick 41fb646 comma
này:
pick 6389f4e Moved "loaded" function out of "require".
s 41fb646 comma
Và lưu. Git sẽ lại khởi chạy trình soạn thảo của bạn. Thay đổi này:
# This is a combination of two commits.
# The first commit's message is:
Moved "loaded" function out of "require".
# This is the 2nd commit message:
comma
này:
Moved "loaded" function out of "require".
và lưu lại.
Bây giờ chúng ta hãy sắp xếp lại các cam kết trong 'backup':
$ git checkout backup
$ git rebase -i remotes/origin/master
Khi soạn thảo của bạn bật lên, thay đổi này:
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
pick 9b41f46 Removed extraneous whitespace <-----
này:
pick 9b41f46 Removed extraneous whitespace <-----
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
và lưu lại.
Bây giờ anh đào-chọn sáp nhập "chuyển nạp" cam kết tắt của thầy và lên chi nhánh hiện tại ("backup")
$git cherry-pick master
Make điểm bậc thầy với cùng cam kết là "backup"
$git checkout master
$git reset --hard backup
Loại bỏ các chi nhánh xoắn
$git branch -D twist
Câu hỏi này có tiêu đề khá xấu "git rebase help" và là một loạt các hoạt động riêng biệt mà bạn muốn thực hiện. Thử lặp lại điều này dưới dạng một câu hỏi duy nhất. Mục tiêu đầu tiên bạn đang cố gắng thực hiện, dưới hình thức một câu hỏi, có thể sẽ làm cho phần còn lại của họ rõ ràng. – Dustin
Tôi không nghĩ rằng đó là một tiêu đề xấu, nó chắc chắn là một vấn đề đòi hỏi phải rebasing của cam kết. –
Bạn có chắc chắn muốn kết hợp các nhánh 'twist' và' backup' không? Tôi hỏi bởi vì cả hai đều có cam kết với mô tả tìm kiếm giống hệt nhau. –