2009-11-24 35 views
33

Giả sử tôi đã thực hiện một số cam kết và muốn chọn anh đào mà tôi chuyển sang kho lưu trữ từ xa. Làm thế nào tôi có thể làm điều đó (trong ascii: C1-> C2-> C3-> C4 và tôi muốn đẩy C2 và C4). Sẽ sắp xếp lại với rebase, resetting, push và sau đó thiết lập lại công việc? (C1-> C2-> C3-> C4 => C2-> C4-> C1-> C3 => đặt lại C4 => đẩy => đặt lại C3). Có cách nào đẹp hơn không?git: đẩy một cam kết duy nhất

+0

Có, bạn có thể viết lại lịch sử (hoặc tạo nhánh riêng với lịch sử bắt buộc) rồi nhấn. Đây là cách duy nhất. –

+3

Tôi cũng đang tìm kiếm cùng một vấn đề. Tài nguyên này có thể hữu ích https://miteshshah.github.io/linux/git/how-to-push-single-commit-with-git/ –

Trả lời

20

Nếu bạn có cam kết trên một nhánh riêng, bạn có thể chọn cam kết từ nhánh tư nhân và áp dụng chúng cho chi nhánh chính thức. Tại thời điểm này, bạn có thể đẩy tất cả các cam kết của mình trên nhánh chính thức (đó là tập hợp con mà bạn đã chọn trước đó).

+2

Hoặc nếu bạn cam kết là trên chi nhánh chính thức, bạn có thể anh đào chọn vào một chi nhánh tạm thời và đẩy nó đến chi nhánh chính thức từ xa. ummm ... đúng không? – andho

+0

IMHO Kỹ thuật đơn giản và dễ sử dụng nhất. – Benj

3

IIRC, do git coi cam kết hoạt động, C4 vốn có C3, do đó khái niệm "đẩy C4 chứ không phải C3" không có ý nghĩa với git (và tương tự C2 tương ứng với C1). (Xem câu trả lời cho this previous question.)

+2

Không đúng! C4 tham khảo C3 là cha mẹ của nó, nhưng câu trả lời khác là chính xác hơn: bạn có thể chọn lựa cam kết trong lịch sử và áp dụng chúng cho các bậc cha mẹ khác nhau. –

+0

Không phải là nó giống như C4 vốn đã áp dụng nó thay đổi cho C3 nhưng thay đổi của C4 là của riêng nó. – andho

+7

Sử dụng 'git cherry-pick' trên' C4' để áp dụng nó cho một nhánh khác sẽ không dẫn đến 'C4' trên nhánh mới, mà là' C4'', một cam kết khác (nhưng tương tự). Nếu một người nào đó sau đó sáp nhập vào nhánh với 'C4' trên đó, các vấn đề có thể phát sinh. – Amber

49

Những gì bạn đang tìm kiếm:

git push origin commit-id:master 

tín dụng đi vào: http://blog.dennisrobinson.name/push-only-one-commit-with-git/

Ghi chú:

  • Đẩy một cam kết push tất cả các cam kết trước khi nó (như Amber nói). Phím là sắp xếp lại các cam kết của bạn (git rebase -i) trước tiên, vì vậy chúng là theo thứ tự bạn muốn đẩy chúng.
  • Chi nhánh được đề xuất + phương pháp chọn anh đào (được đề xuất bởi midtiby) cũng hoạt động, nhưng tại sao lại tạo ra các nhánh cây khi bạn không cần.
  • commit-id không phải là một sha1. Để đẩy mọi thứ trước các cam kết N lần cuối , hãy sử dụng "HEAD ~ N" thay cho commit-id.
+5

Đây phải là câu trả lời được chấp nhận. 1 cảm ơn. –

6
$ git push <remote name> <commit hash>:<remote branch name> 

# Example: 
$ git push origin 2dc2b7e393e6b712ef103eaac81050b9693395a4:master 
+2

xin vui lòng thêm một số ý kiến ​​với câu trả lời của bạn điều này sẽ làm cho dễ dàng để undrstnd ... –

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