2013-07-28 50 views
5

Những gì tôi có thể làm gì để tránh nhận được thông báo sau khi tôi đẩy một chi nhánh tính năng lần thứ hai:Không thể đẩy một số refs khi đẩy tính năng chi nhánh

git pull origin sprint_branch1 
git checkout -b feature_branch 

date > a.txt 
git add a.txt 
git commit -m 'added date' 

git push origin feature_branch 
:

To https://github.com/xxx/git_test.git 
! [rejected]  feature_branch -> feature_branch (non-fast-forward) 
error: failed to push some refs to 'https://github.com/xxx/git_test.git' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Những gì tôi làm điều này là

ai đó làm một bài đánh giá mã cho tính năng của tôi và người khác làm thay đổi đối với sprint_branch trong thời gian trung bình:

git checkout sprint_branch1 
date > a.txt 
git add a.txt 
git commit -m 'added another date' 
git push origin sprint_branch1 

tôi cần phải cải thiện tính năng của tôi vì vậy tôi làm

git checkout feature_branch 
git fetch origin 
git rebase origin/sprint_branch1 

tôi nhận được xung đột nhập và làm:

nano a.txt # removing inserted merge tags 
git add a.txt 
git rebase --continue 

sau đó tôi cải thiện tính năng của tôi

date >> a.txt 
git add a.txt 
git commit -m 'add another date again' 

Tôi thích để đẩy feature_branch tôi cho đánh giá thứ hai

git push origin feature_branch 

Tuy nhiên tôi nhận được thông báo lỗi được đề cập ở trên cùng. Git khuyên tôi nên sử dụng git pull, nhưng những người khác khuyên tôi nên sử dụng công việc rebase. Vậy tôi nên làm gì để đẩy feature_branch? Tôi có nên tạo một nhánh mới có tên feature_branch_v2 và đẩy nó không? Tôi có cần phải nhớ những tập tin để git thêm vào trong trường hợp đó hoặc tôi nên thêm tất cả mọi thứ (tạo ra một cam kết lộn xộn)? Có cách nào tốt hơn để đẩy mà không nhận được thông báo lỗi này không?

Trả lời

1

Git nói

hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 

Bạn chỉ có thể cần phải sử dụng các quy trình làm việc rebase để kéo rebase từ chi nhánh ở xa sau khi bạn đã thực hiện các cam kết, sau đó đẩy từ xa.

git commit -m 'add another date again' 
git pull --rebase 

Điều này có thể dẫn đến xung đột về rebase mà bạn sẽ phải giải quyết và sau đó tiếp tục rebase. Điều này chủ yếu gây ra phiên bản của cây trong sprint_branch1 nằm phía sau feature_branch.

Bạn cũng nên đảm bảo rằng các cam kết phù hợp cũng sẽ được thực hiện. Trong một cảm giác chung khi bạn đang sáp nhập với sprint_branch1, nó tốt hơn để làm một

git checkout feature_branch 
git merge sprint_branch1 

này thay vì rebase, kể từ rebase viết lại cam kết của bạn mà có thể gây ra vấn đề. Sau khi bạn hợp nhất nếu bạn chỉ cần đẩy nó sẽ hoạt động tốt.

EDIT 1:

Nếu bạn cần rebase và vẫn tránh lỗi này, bạn có thể sử dụng

git push --force origin feature_branch 

Tuy nhiên điều này không được khuyến khích đặc biệt là trong các đội phân tán, vì nó sẽ viết lại chi nhánh từ xa với chi nhánh địa phương của bạn không phụ thuộc vào bất kỳ thay đổi nào mà những người khác có thể đã đẩy vào nó.

6

Đây là nơi bạn đã đi sai:

git rebase origin/sprint_branch1 

Bạn không nên rebase chi nhánh công bố. Lệnh này cần phải có được một

git merge origin/sprint_branch1 

Nói chung bạn nên cẩn thận với git rebase - có vẻ là một số loại tôn giáo xung quanh nó, mặc dù nó là một công cụ rất nguy hiểm.

Bạn có thể tiếp tục như thế nào?

  • Nếu bạn là hoàn toàn chắc chắn không ai khác đang xảy ra để chạm vào chi nhánh tính năng một lần nữa và không ai đã làm bất kỳ thay đổi nó từ kéo cuối cùng của bạn, bạn chỉ có thể làm

    git push -f 
    

    Điều đó sẽ ghi đè lên HEAD trên máy chủ với HEAD của bạn.

  • Nếu bạn chắc chắn rằng không có thay đổi kể từ kéo cuối cùng của bạn, nhưng người khác sử dụng chi nhánh của bạn, bạn có thể làm ở trên và cho tất cả mọi người với một bản sao của chi nhánh của bạn rằng họ cần phải chạy

    git fetch origin 
    git checkout feature_branch 
    git reset --hard origin/feature_branch 
    

    Điều đó sẽ xóa tất cả thay đổi cục bộ của họ kể từ lần push cuối cùng của họ.

  • Cách an toàn nhất là bạn đổi tên địa phương feature_branch thành somethengi khác, tìm các cam kết bạn đã thêm, chi nhánh của origin/feature_branch hiện tại và cherry-pick tất cả thay đổi của bạn.

Chạy gitk feature_branch origin/feature_branch để hiểu rõ những gì đang diễn ra.

+0

'git push -f' Hôm nay, tôi" mất "99 commit của lịch sử từ xa .. Tất nhiên tôi có thể đưa họ trở lại điều khiển từ xa, nhưng phải mất rất nhiều thời gian và công sức. – hek2mgl