2012-04-09 26 views
6

Tôi đang sửa đổi mã (không phải git) của người khác. Tôi đã tải xuống bản gốc, tiếp tục sửa đổi của tôi, và nhảy súng và thực hiện phiên bản sửa đổi cam kết đầu tiên của tôi. Đây là một sai lầm, tôi nên thêm mã được tải xuống ban đầu làm cam kết đầu tiên của mình.(khác) sửa đổi lịch sử git để thêm cam kết đầu tiên

Sau đó, để thêm sự xúc phạm đến thương tích, tôi đã thêm mã gốc như một nhánh của biên tập đầu tiên của tôi .. Nói cách khác, nó là một mớ hỗn độn lớn bây giờ :(

Trong thuật ngữ đơn giản, những gì tôi có vẻ như đồ thị màu xanh bên dưới. C5 là mã gốc thực tế, C1, C2-C6 là thay đổi dần dần của tôi (C4 là không cần thiết). tôi thà có màu xanh lá cây là lịch sử của tôi.

enter image description here

Bất kỳ ý tưởng như thế nào để sửa đổi lịch sử để thực hiện việc này?

Cảm ơn nhiều,

ranh mãnh

+0

tôi cắt nhỏ tại C6 trở đi, nhưng mọi cam kết trong tương lai tất nhiên phải tuân theo nguyên trạng. – sly

+0

Tôi tự hỏi, nếu nó có thể sạch hơn để khôi phục từng cam kết vào thư mục riêng của nó, và bắt đầu từ đầu bằng một 'init' và sau đó sao chép trên mỗi phiên bản và' commit' theo thứ tự đúng. Nó không phải là một giải pháp git, nhưng đó là một giải pháp có thể thực sự nhanh hơn. –

+2

Cảm ơn Randolph. Tuy nhiên tôi rất quan tâm đến giải pháp git để tìm hiểu về nó. (cũng có một tấm gương trực tuyến - nhưng không được chia sẻ mà tôi muốn chỉ đẩy và được thực hiện) – sly

Trả lời

9

Tôi đã làm điều này hoàn toàn tại dòng lệnh, nhưng đang đi để chèn ảnh chụp màn hình từ SourceTree để minh họa cho những gì đang xảy ra.

tiên nhận được 7 hoặc 8 chữ số đầu tiên của cam kết id (50da9c3) từ C5 cam kết và đưa vào vào clipboard của bạn hoặc trong TextEdit hoặc một cái gì đó - bạn sẽ cần nó sau này

Đối với xác nhận, đây là của chúng tôi bắt đầu từ trạng thái:

enter image description here

Dưới đây là các bước để có được nơi bạn muốn:

Tạo một chi nhánh mới không bắt rễ để bắt đầu xây dựng cam kết tắt của tên cơ sở

git symbolic-ref HEAD refs/heads/base 

Bây giờ loại bỏ tất cả các file và thư mục từ git

git rm --cached -r . 

Bây giờ tất cả các tập tin được 'untracked' loại bỏ chúng khỏi thư mục làm việc địa phương

git clean -d --force 

Bây giờ tạo ra một cam kết với không có gì trong đó (đây sẽ là cam kết mà mọi thứ khác sẽ được xây dựng).

git commit --allow-empty -m'Initial Commit' 

cây của bạn sẽ trông như thế này bây giờ:

enter image description here

Bây giờ anh đào chọn c5 cam kết (những gì bạn đã có trên clipboard)

git cherry-pick 50da9c3 

enter image description here

Bây giờ hãy root lại nhánh master trên Chi nhánh cơ sở

git rebase --onto base --root master 

enter image description here

Bây giờ bạn có thể xóa các cơ sở và các chi nhánh c4-c5

git branch -d base 

enter image description here

git branch -D c4-c5branch 

enter image description here

Hãy nhớ rằng 'Cam kết ban đầu' là một cam kết trống không có tệp, vì vậy đừng bị lừa. Cam kết C5 thực sự là cam kết dựa trên nội dung đầu tiên.

+1

điều này vô cùng hữu ích. Cảm ơn bạn! – sly

+0

Rất vui được giúp đỡ. –

+1

một lời cảm ơn khác! – Benoit

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