2010-02-20 32 views
20

Tôi đã xem các câu hỏi khác nhau về vấn đề này. Đầu tiên cung cấp a huge question and answer (có liên quan? Không chắc chắn) và thứ hai cung cấp wrong answer as best answer.Git merge -s của họ: Đơn giản?

Tôi có chi nhánh được gọi là great-use-this. Tôi có một chi nhánh khác gọi là master. Tôi muốn hợp nhất great-use-this thành chính và tránh xung đột tự động hợp nhất.

cách đơn giản nhất và dễ nhất để thực hiện việc này là gì?

Lưu ý:. Tôi đã thực sự figured này ra (sử dụng một chi nhánh thứ ba và ours, nhưng điều này sẽ là tốt để có trên SO nào

+0

Xem thêm http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

Would được tốt đẹp để hiển thị một ví dụ về các chi nhánh thứ ba + 'ours' phương pháp tiếp cận, đặc biệt là kết quả đồ thị cam kết, bao nhiêu tiếng ồn, vv – lkraav

+0

@ lkraav Tôi không có ví dụ đó nữa. Tôi làm tất cả mọi thứ hoặc với 'git merge BRANCH --squash' hoặc đôi khi sử dụng' git reset --soft master' và sau đó kiểm tra như thể đó là một cam kết mới. Xin lỗi, nhưng nếu bạn yêu cầu một ví dụ đơn giản trong một câu hỏi khác, điều đó thật đáng yêu. –

Trả lời

25

Vâng, tạo ra một chi nhánh thứ ba và làm một merge -s ours là một giải pháp.

Nhưng bạn sẽ tìm thấy tất cả "let's not advertised any "theirs" merging strategy" here.

giữa thay thế công việc của bạn với một công việc chi nhánh khác, hoặc đơn giản là nhận được thoát khỏi của công việc hiện tại và thay thế nó hoàn toàn bởi một trong những khác, Junio ​​C. Hamano (chính Git Maintainer) thích cách tiếp cận thứ hai:

Tôi nghĩ rằng "-s theirs" thậm chí còn tồi tệ hơn. Đó là cách bạn sẽ loại bỏ những gì bạn đã làm (có lẽ vì phía bên kia có giải pháp tốt hơn nhiều so với hack của bạn), nhưng điều đó có thể dễ dàng hơn nhiều và sạch thực hiện với:

$ git reset --hard origin/master 

Một số người có thể nói "Nhưng với 'merge -s theirs', tôi cũng có thể giữ những gì mình đã làm ". Việc đặt lại đó đơn giản là loại bỏ những gì tôi đã làm.

Logic đó cũng là thiếu sót. Thay vào đó, bạn có thể:

$ git branch i-was-stupid 
$ git reset --hard origin/master 

nếu bạn thực sự muốn lưu hồ sơ về sự thất bại của mình.

Một vấn đề lớn "-s theirs" có, so với "khôi phục nguồn gốc, loại bỏ hoặc đặt sang bên trên lịch sử không thành công" là lịch sử 'chính' của bạn mà phát triển thêm của bạn dựa trên sẽ giữ cho crap thất bại của bạn nó mãi mãi nếu bạn đã làm "-s của họ".

Hy vọng rằng bạn sẽ trở thành một lập trình viên tốt hơn theo thời gian, và cuối cùng bạn có thể có một cái gì đó đáng để chia sẻ với thế giới gần mũi của nhánh chủ của bạn. Tuy nhiên, khi điều đó xảy ra, bạn không thể cung cấp nhánh chính của bạn để được kéo lên thượng nguồn, vì thế giới rộng hơn sẽ không quan tâm đến những sai lầm trước đó của bạn chút nào.

+1

Vấn đề với logic là, điều này xảy ra với tôi khi tôi sáp nhập vào nhánh chính. Chỉ vì git không thể hiểu được việc hợp nhất tự động không có nghĩa là nó không hoàn toàn rõ ràng. Nhưng tôi muốn lịch sử tiến lên phía trước. Trong mọi trường hợp, hầu hết các lịch sử này sẽ được chuyển vào thùng rác. –

+0

cú pháp làm việc cho tôi là 'git reset --hard origin/master' –

2

Tôi đang tự mình hướng về tùy chọn git reset --hard BRANCHNAME nhưng tôi đã phát hiện ra rằng có "của họ" trong Git (v. 1.7.1 ít nhất).

Nếu bạn muốn thử, chỉ cần thêm đối số "-Xtheirs" vào lệnh hợp nhất.

Ví dụ, bắt đầu trong tổng thể:

git checkout -b editBranch
-- edit your files --
git add .
git commit -m "Updated the files"
git checkout master
git merge -Xtheirs editBranch

Nếu bạn đã xóa bất kỳ tập tin trong editBranch, bạn sẽ nhận được một conflit hợp nhất có thể được giải quyết với git rm FILENAME.

Một lần nữa, có vẻ như khả năng đặt lại --hard BRANCHNAME là tùy chọn tốt hơn, nhưng nếu bạn có trường hợp bạn thực sự cần, họ sẽ giúp bạn ở đó.

+4

Điều đáng chú ý là' -Xtheirs' hoàn toàn khác với chiến lược '-s theirs' giả định. '-Xtheirs' chuyển tùy chọn' theirs' sang chiến lược phối hợp đệ quy để giải quyết các phần tử xung đột bằng cách chọn phiên bản 'của chúng'. '-s theirs', nếu được thực hiện như' -s ours' sẽ chọn toàn bộ cây 'của họ' thay vì bất kỳ loại hợp nhất thông minh nào. –

+1

Tôi nghĩ rằng tôi nhận được điều đó. Điều đó có nghĩa là "-s của họ" thực sự giống như khi bạn "git reset --hard BRANCHNAME"? –

+0

@Charles Bailey, muốn bình luận về điều này, xin vui lòng? –

8

Ran vào vấn đề này ngày khác:

httpx: //seanius.net/blog/2011/02/git-merge-s-theirs/

Cập nhật: Cũ url là xuống. Dưới đây là bài viết qua Archive.org của Wayback Machine:

git merge -s ours ref-to-be-merged 
git diff --binary ref-to-be-merged | git apply -R --index 
git commit -F .git/COMMIT_EDITMSG --amend 
+0

Cảm ơn @Sean Finney, bài viết thú vị. Cá nhân, tôi đã làm rất nhiều 'reset --hard' và' reset --soft' với refs để có được nơi tôi muốn đi, đó là tàn bạo và messes lên lịch sử cam kết (vì vậy bạn kết thúc bằng cách sử dụng 'đẩy --force' rất nhiều :)), nhưng giải pháp của bạn trông chắc chắn. Tôi sẽ phải kiểm tra nó ra sớm. –