2009-09-25 42 views
9

tôi cố gắng đẩy tôi (lần đầu tiên bao giờ hết!) Git repo như ban đầu này:Tại sao "git push helloworld + master: master" thay vì chỉ "git push helloworld"?

$ git push helloworld 

Nhưng tôi đã trở lại này:

To [email protected]:helloworld.git 
! [rejected]  HEAD -> master (non-fast forward) error: 
failed to push some refs to '[email protected]:helloworld 
git' 

Vì vậy, tôi tìm thấy another StackOverflow question về "cam kết sửa đổi" và cố gắng một gợi ý từ đó mà không thực sự biết liệu nó có giúp ích cho tôi hay không:

[email protected] /c/test/helloworld (master) 
$ git push helloworld +master:master 

Đã hoạt động!

Nhưng tôi không biết tại sao nó cố định vấn đề của tôi :(

Có thể ai đó giải thích tại sao các công trình này nhưng "git push helloworld" không?

+1

Đã thêm giải pháp khác, để trả lời nhận xét của bạn. – VonC

Trả lời

18

Có vẻ bạn đã viết lại lịch sử của bạn (SHA-1 kết hợp với cam kết) trong chi nhánh chủ của bạn

Điều đó có nghĩa, bạn có thể không còn đẩy trong một chế độ nhanh về phía trước của bạn

các lực lượng chủ + push to diễn ra:..
bằng có tùy chọn + hàng đầu, bạn có thể yêu cầu git cập nhật thông tin <dst> ngay cả khi bản cập nhật không tiến nhanh.

Lưu ý: điều này có thể xấu nếu bất kỳ ai khác đã nhân bản kho lưu trữ của bạn, vì chúng sẽ không còn có thể kéo nhánh chính của bạn mà không có xung đột.
Xem thêm điều này SO answer for more.


Lưu ý: như đã đề cập by Junio C. Hamano:

Có hai cơ chế an toàn độc lập:

  • việc gửi an toàn cuối cùng có thể được ghi đè bởi "git push --force" và/hoặc bằng cách sử dụng một refspec có tiền tố '+');

  • độ an toàn khi nhận được có thể bị ghi đè bằng biến cấu hình receive.denynonfastworwards của kho lưu trữ mà bạn đang đẩy vào.

Giá trị mặc định sau là "không an toàn", nhưng nếu sự an toàn được kích hoạt trong kho, việc bắt buộc từ phía gửi sẽ không hủy kích hoạt. IOW, cả hai đầu cần đồng ý để cho phép hành vi không an toàn.


Như đã đề cập trong Git FAQ, một khóa học có thể có của hành động là:

Lý do có thể nhất cho điều này là bạn cần phải kéo từ xa đầu tiên. Bạn có thể thấy những gì thay đổi phía từ xa có bằng cách lấy trước và sau đó kiểm tra nhật ký.Ví dụ,

$ git fetch origin 
$ git log master..origin/master 

sẽ liệt kê tất cả những thay đổi ở phía xa có mà phía bạn thì không.
Nếu bạn muốn có một đại diện đồ họa, hãy sử dụng gitk --left-right master...origin/master.
Mũi tên ở bên trái là những thay đổi bạn muốn đẩy, mũi tên bên phải là những thay đổi ở phía xa.

giải pháp khác (đó là những gì bạn đã làm):

$ git push origin +branchname 

Điều này sẽ buộc các bản cập nhật. Nếu bạn không có sự cho phép, sau đó đôi khi điều này sẽ làm việc:

$ git push origin :branchname 
$ git push origin +branchname 

tức, xóa các chi nhánh từ xa đầu tiên (điều này thường được cho phép), sau đó lại đẩy "mới" (hoặc có lẽ rewound) branch.

Được cảnh báo rằng nếu bạn tua lại cành, những người khác có thể gặp sự cố khi kéo.
Có khả năng họ sẽ hợp nhất trong nhánh mà họ đã tìm nạp bằng nhánh mới mà bạn đã xuất bản, giữ lại những thay đổi mà bạn đang cố gắng loại bỏ một cách hiệu quả.
Tuy nhiên, nó sẽ chỉ là bản sao của chúng có bản sửa đổi xấu. Vì lý do này, tua cành được xem là nhẹ xã hội. Tuy nhiên, nó thường là thích hợp.

+0

Đây là kho lưu trữ git riêng chỉ để tìm hiểu các dây - vì vậy tôi không lo lắng về xung đột với người khác. Những gì tôi muốn làm là xóa kho lưu trữ này và làm điều đó một cách chính xác trong thời gian tới. Tôi nên làm gì thay vì "+ master: master" sau khi tôi nhận được thông báo "[reject]"? –

+0

Đó là nó. Cảm ơn bạn rất nhiều! Tôi redid nó từ đầu, nhưng lần này tôi đã làm một kéo đầu tiên và nó đã làm việc. Thật là một điều kỳ lạ! Trong Mercurial tôi đã không bao giờ phải làm một cái gì đó như thế khi tôi đang thiết lập một dự án mới. –

+0

hg push có cờ hiệu lực cho cùng một lý do. Nếu bạn thay đổi lịch sử (thông qua mq hoặc bất cứ điều gì), bạn sẽ phải ép buộc đó. – Dustin