2012-05-27 28 views
7

Tôi đang cố gắng bắt đầu với git trên một dự án github. (Tôi đã sử dụng CVS, SVN và hg trong nhiều năm; git là khó khăn để có được đầu của tôi xung quanh). Tôi đang làm theo hướng dẫn chính xác như tôi có thể và đơn giản là không thể làm cho nó hoạt động được.Hợp nhất các xung đột cập nhật từ phía trên

tôi sao chép dự án forked tôi:

git clone [email protected]:davidgiven/linux-allwinner.git 

Theo đề xuất, tôi thêm một từ xa 'ngược dòng' theo dõi các dự án mà một của tôi là chia hai từ:

git remote add upstream https://github.com/amery/linux-allwinner.git 

tôi lấy từ nó:

git fetch upstream 

Tất cả điều này đều ổn. Nhưng, đã một tuần kể từ khi tôi chia tay dự án, và thượng nguồn đã có những thay đổi. Vì vậy, tôi muốn kéo những thay đổi đó. Tôi hiện đang ở nhánh bên phải --- allwinner-v3.0-android-v2 --- vì vậy tôi hợp nhất từ ​​thượng nguồn vào chi nhánh của tôi:

git merge upstream/allwinner-v3.0-android-v2 

... và tôi nhận được xung đột nhập.

CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/common.h 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/Makefile 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby.S 
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/Makefile 
[etc] 

Bây giờ, tôi đã đăng ký không có gì; Tôi chưa bắt đầu công việc, và dự án của tôi hoàn toàn bị ảnh hưởng kể từ khi tôi chia nó. Do đó, không nên có bất kỳ xung đột nào. Nhưng có một số; những gì đang xảy ra, và làm thế nào để sửa nó?

Cập nhật:

git show-branch HEAD upstream/allwinner-v3.0-android-v2 thấy điều này, mà tôi phải nói rằng tôi không hiểu một lời:

! [HEAD] arm: sun3i: add getioaddr macro 
! [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0 
-- 
+ [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0 
+ [upstream/allwinner-v3.0-android-v2^] arm: sunxi: renable early_printk in all _defconfig except crane's 
+ [HEAD] arm: sun3i: add getioaddr macro 
+ [HEAD^] arm: sun3i: add dummy machine type 
+0

Âm thanh như trường hợp bạn muốn rebase thay vì hợp nhất. – ThiefMaster

+0

'git show-branch HEAD upstream/allwinner-v3.0-android-v2' có thể tiết lộ điều gì đó thú vị. – georgebrock

+0

Đó có phải là đầu ra hoàn chỉnh từ 'show-branch' không? Tôi hy vọng nó kết thúc bằng một dòng bắt đầu bằng '++' – georgebrock

Trả lời

11

Nó có thể là, thượng nguồn đã viết lại lịch sử (rebase, sửa đổi , ...) - họ không nên làm điều đó, nhưng bạn sẽ không bao giờ biết.

Vì bạn nói rằng bạn không có bất kỳ thay đổi cục bộ hoặc cam kết, bạn nên mang theo kho của bạn trở lại trạng thái sạch sẽ bằng cách đặt chi nhánh của bạn:

git reset --hard upstream/allwinner-v3.0-android-v2 

(này sẽ loại bỏ bất kỳ thay đổi địa phương và thực hiện cam kết của TRỤ hiện không thể truy cập!)


Ở trên giả định rằng bạn sẽ (có hiệu lực) đẩy mới thiết lập lại trạng thái của chi nhánh của bạn để kho từ xa của bạn, nếu không bạn sẽ gặp phải những xung đột một lần nữa khi y cố gắng kéo từ origin.

git push origin +allwinner-v3.0-android-v2 

Nếu bạn đã đã cam kết bản thân tại địa phương, bạn phải rebase (hoặc cherry-pick) cam kết của bạn trên đầu trang của các chi nhánh thượng nguồn, và sau đó làm một push to xứ. Bằng cách đó bạn sẽ viết lại lịch sử địa phương của bạn theo cùng một cách thượng nguồn đã làm và áp dụng những thay đổi của bạn trên đầu trang, ví dụ:

git rebase --onto upstream/branch \ 
    last-original-upstream-commit-before-yours \ 
    your-branch 
+0

Tôi đã thử điều đó. Thật không may nó không giúp ... bây giờ 'git push' thất bại, nói với tôi rằng tôi cần phải 'git pull' trước; nhưng 'git pull' tạo ra các lỗi kết hợp giống nhau mà tôi đi trước. Đây thực sự là điều tôi mong đợi; sự hiểu biết của tôi là 'git reset' thay đổi nhánh hiện tại thành nhánh được chỉ định, vì vậy bây giờ tôi chỉ có một bản sao của' upstream/allwinner-v3.0-android-v2' được kiểm tra cục bộ dưới dạng 'allwinner-v3.0-android -v2'. Nhưng kể từ khi các xung đột xảy ra giữa 'origin/...' và 'upstream/...', điều duy nhất được thay đổi là khi các xung đột xảy ra. –

+0

@DavidGiven: git đẩy tới đâu? Nó sẽ thất bại, vì sự thúc đẩy của bạn không còn tiến xa hơn nữa. Bạn đề cập đến trong câu hỏi của bạn rằng bạn đã không cam kết bất cứ điều gì, vì vậy có lẽ một đẩy buộc duy nhất là con đường để đi? – knittl

+0

'git push origin allwinner-v3.0-android-v2'. (Mà, tình cờ, chính xác là một thứ giống như một 'git push'.) TBH, tôi muốn biết những gì đang xảy ra ở đây; Tôi không có bất kỳ cam kết nào được nêu ra, nhưng tôi muốn bắt đầu làm việc này khá sớm, vì vậy tôi cần một giải pháp chung trong trường hợp nó xảy ra một lần nữa chứ không phải là một giải pháp nuke-tất cả mọi thứ. –

2

Các show-branch đầu ra có nghĩa là upstreamHEAD đã từng bổ sung thêm hai cam kết kể từ khi tổ tiên chung của họ (giả sử đó là đầu ra đầy đủ).(Xem thêm: http://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/) Nếu bạn chưa tự mình làm điều gì đó, điều đó có nghĩa là thượng lưu đã đẩy lùi lại (hoặc cái gì đó khác đã thay đổi lịch sử). Vì bạn đã không cam kết bất cứ điều gì, câu trả lời của knittl là chính xác những gì bạn muốn.

Đối với những gì đáng giá, tôi cũng yêu thích git log --oneline --graph --decorate --remotes --branches cho việc này. Bạn sẽ nhận được một biểu đồ ASCII với tất cả các nhánh và điều khiển từ xa của bạn, vì vậy bạn có thể hình dung những gì đã xảy ra ở đâu.

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