2012-01-20 5 views
52

Tôi đã bắt đầu làm việc trên một dự án và tôi đã thực hiện một số cam kết không mong muốn mà tôi đã đẩy tới gốc. Bây giờ, khi tôi cố gắng thực hiện một yêu cầu kéo, Github muốn cam kết tất cả các cam kết trước đó.Git Loại bỏ các cam kết không mong muốn khỏi Yêu cầu Kéo

Câu hỏi của tôi là, làm thế nào để loại bỏ các cam kết không mong muốn và cam kết các thay đổi mà tôi muốn cam kết để tôi cập nhật với chính?

+0

Tra cứu "git rebase". bạn có thể bí mật với nhau và để lại một số cam kết. –

Trả lời

34

Tôi cho rằng nguồn gốc của bạn là ngã ba của một số dự án mà bạn muốn thực hiện yêu cầu kéo?

Vì bạn sẽ thay đổi lịch sử (bằng cách đặt lại đầu), bạn sẽ cần phải đẩy bằng --force flag. Tìm giá trị băm của lần commit tốt cuối cùng của bạn bằng cách sử dụng git log.

Bây giờ chạy

git reset SHA 

này sẽ thay đổi người đứng đầu của bạn để sha đó và giữ gìn những thay đổi trong các tập tin vì đó tốt cam kết cuối cùng, chỉ số của bạn cũng sẽ được đặt lại.

Bây giờ bạn có thể thay đổi mã của mình và thực hiện các cam kết bạn muốn. Nhưng bạn phải làm git push --force vì bạn đã thay đổi lịch sử của kho lưu trữ. Điều này có nghĩa là bất kỳ ai chia sẻ kho lưu trữ của bạn sẽ không thể kéo các thay đổi từ bạn nữa. Nhưng bạn sẽ có thể làm một yêu cầu kéo đến thượng nguồn của bạn.

+0

Có phải lực đẩy chỉ là một vấn đề nếu ai đó nhánh nhánh mà yêu cầu kéo của tôi dựa trên? Hoặc nếu họ làm bất kỳ ngã ba ở tất cả từ kho của tôi? Nếu họ xóa chi nhánh vi phạm, họ có thể đồng bộ hóa với kho lưu trữ của tôi một lần nữa không? Có cách nào để loại bỏ các cam kết khỏi yêu cầu kéo một cách sạch sẽ mà không có lực đẩy không? – endolith

+1

@endolith Chỉ khi chúng dựa trên cam kết trên chi nhánh của bạn. Bất kỳ cam kết nào là hậu duệ của một cam kết mà sau này được rebased sẽ bị ảnh hưởng và không thể được trivially sáp nhập như cam kết ban đầu không còn tồn tại. Miễn là không ai sáp nhập hoặc cam kết căn cứ vào yêu cầu kéo của bạn cho đến khi lực lượng thực hiện của bạn đẩy miễn phí của bạn để thay đổi yêu cầu kéo của bạn bằng cách ép buộc nhánh của bạn nếu bạn muốn. Nó sẽ không xảy ra nếu bạn làm cho nó rõ ràng trong yêu cầu kéo của bạn rằng bạn chủ động thay đổi nó. –

+0

Yêu cầu kéo phải được mở để thay đổi nhánh có hiệu lực –

0

Nếu bạn đang sử dụng git gui, Goto git gui và trực quan hóa lịch sử chi nhánh của bạn. (trước khi thực hiện bước tiếp theo, hãy sao lưu các thay đổi cục bộ mà bạn muốn đẩy) Nhấp chuột phải vào điểm mà chi nhánh muốn đặt lại thành chính và nhấp vào đặt lại. Sau khi đặt lại, trong dòng lệnh, gõ git push -f Bây giờ thực hiện các thay đổi cần thiết trong nhánh, hãy commit n lần nữa. Nếu bạn tạo yêu cầu kéo ngay bây giờ, nó sẽ chỉ có cam kết mới sau khi đặt lại chi nhánh.