2011-11-10 42 views
9

tôi đã làm:Git: Làm thế nào để đẩy từ "không nhánh" đến nhánh mới từ xa?

git co upstream/master # To no branch. 
<then did a trivial edit on some file...> 
git commit -a -m "Trivial edit" 
git push origin NewBranch 

Nhưng nhận điều này:

$ git push origin ignore-netbeans-config 
error: src refspec ignore-netbeans-config does not match any. 

Tôi có thể đẩy đến một chi nhánh mới mà không cần tạo một địa phương?

+0

Câu hỏi hay! Tất nhiên, nếu bạn có thể làm bất kỳ chỉnh sửa thêm ở đây, bạn muốn đi trước và tạo một chi nhánh để được an toàn. – Cascabel

Trả lời

10

Hãy rõ ràng lên một vài chi tiết nhỏ đầu tiên:

  1. Chi nhánh là "ref" dưới namespace refs/heads. Chỉ cần ls .git/refs/headscat các tệp ở đó để xem ý tôi là gì.
  2. Thẻ là "ref" trong không gian tên refs/tags. Chỉ cần ls .git/refs/tags để xem cho chính mình.
  3. HEAD chỉ là một "ref" khác, nhưng nó đặc biệt ở khía cạnh mà nó có thể là "biểu tượng". Chỉ cần cat .git/HEAD và xem những gì nó nói.

Hoạt động push hoạt động trên "ref" và "ánh xạ" mặc định giữ lại không gian tên. Điều này có nghĩa là khi tôi đẩy nhánh, nó sẽ xuất hiện như một nhánh trên điều khiển từ xa; khi tôi đẩy thẻ, thẻ sẽ xuất hiện dưới dạng thẻ trên điều khiển từ xa. Hãy xem xét các tình huống sau:

  1. Tôi muốn đẩy thẻ moo và làm cho nó xuất hiện như là một chi nhánh trên máy chủ từ xa (vâng, tôi về cơ bản "chuyển đổi" một thẻ vào một chi nhánh). Đây là cách tôi sẽ làm điều đó:

    git push origin moo:refs/heads/moo

  2. Git cần một cách để phân biệt giữa nhanh về phía trước và không ff đẩy, vì vậy mà người ta không kết thúc ghi đè lên công việc của người khác do nhầm lẫn. Giả sử tôi muốn đẩy các chi nhánh master, nextpu, trong đó chỉ pu là không phải ff. Đây là cách tôi sẽ làm điều đó (lưu ý rằng bạn phải cung cấp một bản đồ rõ ràng khi bạn đang sử dụng +):

    git push origin master next +pu:pu

  3. Bây giờ, chúng ta hãy cho câu hỏi của bạn. Bạn muốn đẩy HEAD của mình để nó xuất hiện trong không gian tên refs/heads trên điều khiển từ xa dưới dạng nhánh có tên "ignore-netbeans-config". Nếu nhánh này không tồn tại trước đây, hoặc nếu bạn ghi đè lên một số cam kết trong đó (ví dụ: push không phải ff), hãy sử dụng +. Nếu không, đừng. Kết quả cuối cùng:

    git push origin +HEAD:refs/heads/ignore-netbeans-config

TL; DR phiên bản: git push origin +HEAD:refs/heads/ignore-netbeans-config

+0

Cảm ơn bạn đã giải thích! –

11

thử

git push origin HEAD:refs/heads/ignore-netbeans-config 
+0

Ah, điều đó sẽ hiệu quả. +1. – manojlds

+0

Bạn sẽ có thể bỏ qua phần "refs/heads /" của nó. –

+0

@AdamDymitruk, Đó là những gì tôi đã thử - không hoạt động. –

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