2012-08-06 26 views
5

Có thể ai đó vui lòng cung cấp một ví dụ đơn giản về điều gì sẽ khiến Git đẩy tới một repo trung tâm thất bại vì không thể xảy ra chuyển tiếp nhanh? Các repo địa phương và nhà nước trung ương của repo cần phải trông như thế nào để điều này xảy ra? Thực sự gặp sự cố khi trực quan hóa việc này ...Điều gì có nghĩa là Git push không thể nhanh chóng được hợp nhất?

+0

Câu hỏi hay! Nhiều người không hiểu điều đó, nhưng hầu hết các câu hỏi tôi tìm thấy trong bài viết này đều không được viết tốt. – erikbwork

Trả lời

11

Tôi giả sử bạn đang nhìn thấy vấn đề này:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/mayoff/t/test/central' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Dưới đây là như thế nào “Cập nhật phi nhanh về phía trước đã bị từ chối” vấn đề xảy ra.

Giả sử Alice và Bob đang làm việc trên một dự án. Họ có một kho lưu trữ, và có một kho lưu trữ trung tâm mà cả hai đều đẩy và kéo. Ban đầu, ba kho giống như thế này:

initial synchronized repos

Giờ đây, Alice và Bob cả làm một số công việc. Mỗi cam kết một sự thay đổi khác nhau để kho địa phương của họ:

private repos have new commits

Tiếp theo, Alice đẩy sự thay đổi của mình để các repo Trung ương:

central repo updated by Alice

Tiếp theo, Bob cố gắng đẩy. Chi nhánh chính của trung tâm repo tại cam kết 3. Đẩy của Bob cố gắng cập nhật nó đến điểm tại cam kết 4. Vì cam kết 4 không có cam kết 3 là tổ tiên, cần phải hợp nhất, nhưng git push không thực sự hợp nhất. Nó chỉ làm "chuyển tiếp nhanh", nơi mà vị thầy mới có thầy cũ làm tổ tiên. Vì vậy, Bob nhận được lỗi vì anh ấy đang cố gắng thúc đẩy thứ gì đó yêu cầu hợp nhất thực sự, không phải là tiến nhanh.

Để đẩy thành công, Bob phải đầu tiên lấy mới cam kết từ repo Trung ương:

Bob has fetched Alice's commit

và ông đã để nhập các thay đổi của mình (cam # 4) với những thay đổi của Alice (cam # 3) , tạo ra một mới cam kết rằng có cả cam kết như tổ tiên:

Bob has merged the commits

Các lấy và hợp nhất có thể được thực hiện theo hai lệnh (git fetch tiếp theo git merge) hoặc trong một lệnh (git pull).

Bây giờ Bob có thể đẩy thành công, vì repo trung tâm thấy rằng tổng thể mới có tổng thể cũ làm tổ tiên.

Bob pushed the merge

Lưu ý rằng bây giờ Alice thiếu các cam kết của Bob. Nếu cô ấy cam kết nhiều hơn với repo của mình và cố gắng đẩy trước khi kéo từ repo trung tâm, cô ấy sẽ nhận được lỗi không chuyển tiếp nhanh và cô ấy sẽ phải tìm nạp và hợp nhất để sửa lỗi, giống như Bob đã làm.

+0

Tôi chỉ nhận ra rằng tất cả các mũi tên của tôi đều sai hướng. Oh well.Hy vọng rằng nó đủ rõ ràng. –

+0

Vâng, bây giờ họ cho thấy sự phát triển trong thời gian và không phải là cây git. Điều đó cũng không quá tệ. – erikbwork

+0

nhất quán là chìa khóa. và chỉ theo hướng tiến bộ thời gian thực sự có thể thoải mái hơn cho một số người. – araqnid

0

Chỉ cần thực hiện cam kết trên repo trung tâm trên cùng một chi nhánh mà không cần kéo đến địa phương của bạn. Sau đó cam kết cục bộ và cố gắng đẩy.

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