Ý nghĩa chính xác của các trò chơi của chúng tôi là gì và của họ trong tiếng Anh là gì?


323

Điều này nghe có vẻ quá cơ bản của một câu hỏi, nhưng tôi đã tìm kiếm câu trả lời và bây giờ tôi bối rối hơn trước.

"Của chúng ta" và "của họ" có nghĩa gì trong git khi sáp nhập chi nhánh của tôi vào chi nhánh khác của tôi? Cả hai nhánh là "của chúng ta".

Trong một cuộc xung đột hợp nhất là "của chúng ta" luôn luôn là phần trên của hai phiên bản được hiển thị?

Có phải "của chúng ta" luôn đề cập đến nhánh mà CHÍNH đã chỉ đến khi bắt đầu hợp nhất không? Nếu vậy thì tại sao không sử dụng một tài liệu tham khảo sở hữu rõ ràng như "chi nhánh hiện tại" thay vì sử dụng một đại từ sở hữu như "chúng ta" mơ hồ (vì cả hai chi nhánh về mặt kỹ thuật là của chúng ta)?

Hoặc chỉ sử dụng tên chi nhánh (thay vì nói "của chúng tôi" chỉ nói "chủ địa phương" hoặc như vậy)?

Phần khó hiểu nhất với tôi là nếu tôi chỉ định trong tệp .gitattribut của một nhánh cụ thể. Hãy nói trong nhánh thử nghiệm Tôi có tệp .gitattribut sau đây:

config.xml merge=ours

Bây giờ tôi kiểm tra và chỉ điểm CHÍNH để làm chủ sau đó hợp nhất trong thử nghiệm . Kể từ khi thầy là của chúng ta, và kiểm tra 's .gitattributes không được chọn ra, sẽ thậm chí nó có ảnh hưởng? Nếu nó có ảnh hưởng, vì chủ nhân bây giờ là "của chúng ta", vậy thì chuyện gì sẽ xảy ra?

Câu trả lời:


375

Tôi nghi ngờ bạn nhầm lẫn ở đây vì về cơ bản là khó hiểu. Để làm cho mọi thứ tồi tệ hơn, toàn bộ công cụ của chúng ta / của họ chuyển đổi vai trò (trở nên ngược) khi bạn đang thực hiện một cuộc nổi loạn.

Cuối cùng, trong một git merge, nhánh "của chúng ta" đề cập đến nhánh bạn đang hợp nhất vào :

git checkout merge-into-ours

và nhánh "của họ" đề cập đến nhánh (đơn) mà bạn đang hợp nhất:

git merge from-theirs

và ở đây "chúng ta" và "họ" làm cho một số ý nghĩa, vì mặc dù "họ" có lẽ là bạn dù sao, "họ" không phải là một trong những bạn đã vào khi bạn chạy git merge.

Mặc dù sử dụng tên chi nhánh thực tế có thể khá tuyệt, nhưng nó lại bị phá vỡ trong các trường hợp phức tạp hơn. Chẳng hạn, thay vì ở trên, bạn có thể làm:

git checkout ours
git merge 1234567

nơi bạn đang hợp nhất bằng ID cam kết thô. Tệ hơn, bạn thậm chí có thể làm điều này:

git checkout 7777777    # detach HEAD
git merge 1234567       # do a test merge

trong trường hợp không có tên chi nhánh liên quan!

Tôi nghĩ rằng nó rất ít giúp đỡ ở đây, nhưng trên thực tế, theo gitrevisionscú pháp , bạn có thể tham khảo một đường dẫn riêng lẻ trong chỉ mục theo số, trong quá trình hợp nhất xung đột

git show :1:README
git show :2:README
git show :3:README

Giai đoạn # 1 là tổ tiên chung của các tệp, giai đoạn # 2 là phiên bản nhánh mục tiêu và giai đoạn # 3 là phiên bản bạn đang hợp nhất từ ​​đó.


Lý do các khái niệm "của chúng ta" và "của họ" bị hoán đổi xung quanh rebaselà vì rebase hoạt động bằng cách thực hiện một loạt các quả anh đào, vào một nhánh ẩn danh (chế độ CHÍNH). Nhánh mục tiêu là nhánh ẩn danh và nhánh hợp nhất là nhánh ban đầu (pre-rebase) của bạn: vì vậy "--ours" có nghĩa là nhánh rebase ẩn danh đang xây dựng trong khi "--theirs" có nghĩa là "nhánh của chúng tôi bị từ chối" .


Đối với mục gitattribut: nó có thể có tác dụng: "chúng ta" thực sự có nghĩa là "sử dụng giai đoạn # 2" trong nội bộ. Nhưng như bạn lưu ý, nó không thực sự tại chỗ vào thời điểm đó, vì vậy nó không có tác dụng ở đây ... tốt, trừ khi bạn sao chép nó vào cây công việc trước khi bạn bắt đầu.

Ngoài ra, bằng cách này, điều này áp dụng cho tất cả việc sử dụng của chúng tôi và của họ, nhưng một số ở cấp độ toàn bộ tệp ( -s oursđối với chiến lược hợp nhất; git checkout --ourstrong xung đột hợp nhất) và một số trên cơ sở từng mảnh ( -X ourshoặc -X theirstrong khi-s recursive hợp nhất). Mà có lẽ không giúp được gì với sự nhầm lẫn.

Tôi chưa bao giờ nghĩ ra một cái tên hay hơn cho những thứ này. Và: xem câu trả lời của VonC cho một câu hỏi khác, nơi git mergetoolgiới thiệu thêm tên cho những cái này, gọi chúng là "cục bộ" và "từ xa"!


28
+1. Về chúng tôi và của họ bị đảo ngược trong rebase, xem thêm: stackoverflow.com/a/2960751/6309stackoverflow.com/a/3052118/6309
VonC

1
Hai thứ "hợp nhất" với nhau. Khi hợp nhất xảy ra cả hai bên hợp nhất "thành" lẫn nhau. Tôi cảm thấy sẽ không đúng khi nói rằng một trong hai bên là "không hợp nhất thành bất cứ điều gì". Nếu không có tên chi nhánh liên quan (như bạn chỉ ra) thì có những tên cam kết liên quan (bạn có thể nói "7777777's" và "1234567 '" thay vì "của chúng tôi" và "của họ"). Tôi hiểu những gì xảy ra trong một cuộc nổi loạn và tôi không thấy nó khó hiểu chút nào. Tôi nghĩ rằng "ĐẦU" và "đến" sẽ hoạt động tốt hơn "của chúng ta" và "của họ" bởi vì luôn có một "ĐẦU" (cho dù nó có tách ra hay không).
CommaToast

15
Tôi đoán vì cái đầu là chỗ dựa của tâm trí, là nguồn gốc của bản sắc, là nguồn gốc của bản thân, nên có ý nghĩa hơn một chút khi nghĩ về bất cứ điều gì mà ĐẦU chỉ ra là "của tôi" ("của chúng ta", kể từ khi Tôi đoán tôi và TRỤ làm hai). Nếu không có gì nữa, đó sẽ chỉ là một thiết bị ghi nhớ tốt.
CommaToast

1
Điều đó đang được nói, tôi vẫn muốn tạo một bản sao vật lý của toàn bộ repo trước khi làm bất cứ điều gì như
nổi loạn

3
"Trong trường hợp không có tên chi nhánh liên quan!" ... Vì vậy, nó nên sử dụng nhận xét / băm xác nhận thay thế. Bất cứ điều gì nó có thể có được bàn tay của nó trên. Thực tế mọi thứ sẽ tốt hơn "của chúng ta" và "của họ". Tôi tự hỏi có bao nhiêu ngàn dev giờ sự nhầm lẫn này đã bốc hơi. câu trả lời của git cho "phân tích phật ý nhất" của C ++;)
Jarrod Smith

49

'Của chúng ta ' trong Git đang đề cập đến nhánh làm việc ban đầu có phần có thẩm quyền / kinh điển của lịch sử git.

Các ' họ ' đề cập đến phiên bản mà giữ công việc để được rebased (thay đổi được thực hiện lại vào chi nhánh hiện hành).

Điều này có vẻ như được hoán đổi cho những người không biết rằng việc thực hiện việc nổi loạn (ví dụ git rebase) đang thực sự khiến công việc của bạn bị trì hoãn (đó là của họ ) để phát lại lịch sử chính / lịch sử là của chúng ta , bởi vì chúng ta đang chống lại chúng ta thay đổi khi công việc của bên thứ ba.

Tài liệu cho git-checkoutđã được làm rõ thêm trong Git> = 2.5.1 theo f303016cam kết :

--ours --theirs

Khi kiểm tra các đường dẫn từ chỉ mục, hãy kiểm tra giai đoạn # 2 ('của chúng tôi') hoặc # 3 ('của họ') để biết các đường dẫn không được trộn.

Lưu ý rằng trong thời gian git rebasegit pull --rebase, 'của chúng ta' và 'của họ' có thể xuất hiện hoán đổi; --ourscung cấp cho phiên bản từ chi nhánh các thay đổi được khởi động lại, trong khi --theirscung cấp phiên bản từ chi nhánh giữ công việc của bạn đang bị từ chối.

Đây là vì rebase được sử dụng trong quy trình công việc coi lịch sử ở xa là quy tắc chung được chia sẻ và coi công việc được thực hiện trên nhánh mà bạn đang phản đối là công việc của bên thứ ba được tích hợp và bạn đang tạm thời đảm nhận vai trò của người giữ lịch sử kinh điển trong cuộc nổi loạn. Là người lưu giữ lịch sử kinh điển, bạn cần xem lịch sử từ xa là ours(tức là "lịch sử kinh điển được chia sẻ của chúng tôi"), trong khi những gì bạn đã làm trên nhánh phụ của mình là theirs(tức là "một người đóng góp làm việc trên nó").

Dành cho git-merge nó giải thích theo cách sau:

của chúng tôi

Tùy chọn này buộc các nhân viên xung đột phải tự động giải quyết sạch sẽ bằng cách ưu tiên phiên bản của chúng tôi. Những thay đổi từ cây khác không xung đột với phía chúng tôi được phản ánh đến kết quả hợp nhất. Đối với một tệp nhị phân, toàn bộ nội dung được lấy từ phía chúng tôi.

Điều này không nên nhầm lẫn với chiến lược hợp nhất của chúng ta, thậm chí không nhìn vào những gì cây khác chứa. Nó loại bỏ mọi thứ mà cây kia đã làm, tuyên bố lịch sử của chúng ta chứa đựng tất cả những gì đã xảy ra trong đó.

của họ

Điều này trái ngược với chúng ta.

Hơn nữa, ở đây được giải thích làm thế nào để sử dụng chúng:

Cơ chế hợp nhất ( git mergegit pullcác lệnh) cho phép các chiến lược hợp nhất phụ trợ được chọn với -stùy chọn. Một số chiến lược cũng có thể có các tùy chọn riêng, có thể được thông qua bằng cách đưa ra các -X<option>đối số git mergevà / hoặc git pull.


Vì vậy, đôi khi nó có thể gây nhầm lẫn, ví dụ:

  • git pull origin masternơi -Xourslà địa phương của chúng tôi, -Xtheirslà của họ (từ xa) chi nhánh
  • git pull origin master -rnơi -Xourslà của họ (từ xa), -Xtheirslà của chúng ta

Vì vậy, ví dụ thứ 2 ngược lại với ví dụ thứ nhất, bởi vì chúng tôi đang phân nhánh lại chi nhánh của chúng tôi trên đỉnh của điều khiển từ xa, vì vậy điểm xuất phát của chúng tôi là từ xa và các thay đổi của chúng tôi được coi là bên ngoài.

Tương tự cho git mergecác chiến lược ( -X ours-X theirs).


2
câu trả lời này có vẻ đã lỗi thời => "git merge --ours" không phải là một lựa chọn hợp lệ
Alexander Mills

@AlexanderMills Câu trả lời không được nói đến git merge, nhưng git pullgit checkoutlà ví dụ. Nếu bạn muốn sử dụng tham số này với git merge, bạn nên sử dụng -X ours. Bạn vẫn có thể sử dụng --ourscú pháp cho git checkout. Tôi đã làm rõ câu trả lời hơn nữa.
kenorb

46

Tôi biết điều này đã được trả lời, nhưng vấn đề này đã làm tôi bối rối rất nhiều lần Tôi đã đưa lên một trang web tham khảo nhỏ để giúp tôi nhớ: https://nitaym.github.io/ourstheirs/

Dưới đây là những điều cơ bản:

Sáp nhập:

$ git checkout master 
$ git merge feature

Nếu bạn muốn chọn phiên bản trong master:

$ git checkout --ours codefile.js

Nếu bạn muốn chọn phiên bản trong feature:

$ git checkout --theirs codefile.js

Cuộc nổi loạn:

$ git checkout feature 
$ git rebase master 

Nếu bạn muốn chọn phiên bản trong master:

$ git checkout --ours codefile.js

Nếu bạn muốn chọn phiên bản trong feature:

$ git checkout --theirs codefile.js

(Tất nhiên, đây là cho các tập tin hoàn chỉnh)


1
Trang web đó là siêu hữu ích. Kiểu biểu đồ dòng chảy và các từ được mã hóa màu làm cho trang web dễ hiểu hơn nhiều so với các câu trả lời SO. Cảm ơn bạn.
Ron

10
  • Của chúng tôi : Đây là chi nhánh bạn hiện đang ở.
  • Của họ : Đây là nhánh khác được sử dụng trong hành động của bạn.

Vì vậy, nếu bạn đang phát hành nhánh / 2.5 và bạn hợp nhất tính năng nhánh / nút mới vào nó, thì nội dung như trong phiên bản / 2.5 là nội dung chúng tôi đề cập đến và nội dung như trên nút tính năng / nút mới là nội dung của chúng đề cập đến. Trong một hành động hợp nhất, điều này là khá đơn giản.

Vấn đề duy nhất mà hầu hết mọi người rơi vào là trường hợp rebase . Nếu bạn thực hiện lại cơ sở thay vì hợp nhất thông thường, các vai trò sẽ được hoán đổi. Thế nào Chà, điều đó được gây ra chỉ bởi cách nổi loạn hoạt động. Hãy nghĩ về rebase để làm việc như vậy:

  1. Tất cả các cam kết bạn đã thực hiện kể từ lần kéo cuối cùng của bạn được chuyển đến một nhánh của riêng họ, hãy đặt tên là BranchX .
  2. Bạn kiểm tra người đứng đầu chi nhánh hiện tại của bạn, loại bỏ bất kỳ thay đổi cục bộ nào bạn có nhưng cách đó lấy ra tất cả các thay đổi mà người khác đã thúc đẩy cho chi nhánh đó.
  3. Bây giờ mọi cam kết trên BranchX đều được chọn theo thứ tự cũ đến mới cho chi nhánh hiện tại của bạn.
  4. Chi nhánhX bị xóa một lần nữa và do đó sẽ không bao giờ xuất hiện trong bất kỳ lịch sử nào.

Tất nhiên, đó không thực sự là những gì đang diễn ra nhưng đó là một mô hình tâm trí tốt cho tôi. Và nếu bạn nhìn vào 2 và 3, bạn sẽ hiểu tại sao các vai trò được hoán đổi bây giờ. Kể từ 2, chi nhánh hiện tại của bạn hiện là chi nhánh từ máy chủ mà không có bất kỳ thay đổi nào của bạn, vì vậy đây là chi nhánh của chúng tôi (chi nhánh bạn đang ở). Những thay đổi bạn đã thực hiện hiện tại trên một nhánh khác không phải là thay đổi hiện tại của bạn ( BranchX ) và do đó, những thay đổi này (mặc dù là những thay đổi bạn đã thực hiện) là của chúng (nhánh khác được sử dụng trong hành động của bạn).

Điều đó có nghĩa là nếu bạn hợp nhất và bạn muốn các thay đổi của mình luôn chiến thắng, bạn sẽ bảo git luôn chọn "của chúng tôi" nhưng nếu bạn phản đối và bạn muốn tất cả các thay đổi của mình luôn thắng, bạn nói với git luôn chọn "của họ".


3

Tôi biết nó không giải thích ý nghĩa nhưng tôi đã tạo cho mình một hình ảnh nhỏ, làm tài liệu tham khảo để nhắc nhở nên sử dụng cái nào:

nhập mô tả hình ảnh ở đây

Hy vọng nó giúp!

Tái bút - Cũng kiểm tra liên kết trong câu trả lời của Nitay


3

Tôi sẽ đăng bản ghi nhớ của tôi ở đây, bởi vì tôi phải quay lại đây nhiều lần.

SCENARIO 1. Nhà phát triển bình thường: Bạn là nhà phát triển không thể hợp nhất mastervà chỉ phải chơi với featurecác chi nhánh.

Trường hợp 1: chủ là vua. Bạn muốn làm mới featurechi nhánh của mình (= rebase to master), vì masterchứa các bản cập nhật mới của các phụ thuộc và bạn muốn ghi đè lên các thay đổi khiêm tốn của mình.

git checkout master
git pull

git checkout feature
git rebase -X ours master

Trường hợp 2: bạn là một vị vua. Bạn muốn rebase featurechi nhánh của bạn đểmaster thay đổi. Nhưng bạn đã làm nhiều hơn các đồng nghiệp của mình và muốn sử dụng các thay đổi của riêng bạn trong một ưu tiên.

git checkout master
git pull

git checkout feature
git rebase -X theirs master

QUAN TRỌNG: Như bạn có thể thấy các nhà phát triển bình thường nên thích rebasevà lặp lại nó mỗi buổi sáng như các bài tập / cà phê.

SCENARIO 2. Sáp nhập-sensei: Bạn là một nhóm trưởng và muốn hợp nhất các chi nhánh khác và đẩy một kết quả hợp nhất trực tiếp đến một chủ. masterlà một nhánh bạn sẽ thay đổi.

Trường hợp 1: chủ là một vị vua Bạn muốn hợp nhất chi nhánh của bên thứ ba, nhưng masterlà một ưu tiên. featurelà một chi nhánh mà cấp cao của bạn đã làm.

git checkout feature
git pull

git checkout master
git merge -X ours master

Trường hợp 2: những thay đổi mới là một vị vua Khi nhà phát triển cấp cao của bạn phát hành một điều thú vị featurevà bạn muốn ghi đè lên s ** t cũ trong masterchi nhánh.

git checkout feature
git pull

git checkout master
git merge -X theirs master

NHỚ: Để nhớ trong một đêm mà một trong những lựa chọn: masteroursLUÔN. Và đó theirslà một featuređiều mà họ đã làm.


2

Từ git checkoutcách sử dụng:

-2, --ours            checkout our version for unmerged files
-3, --theirs          checkout their version for unmerged files
-m, --merge           perform a 3-way merge with the new branch

Khi giải quyết xung đột hợp nhất, bạn có thể làm git checkout --theirs some_filegit checkout --ours some_file để đặt lại tệp thành phiên bản hiện tại và các phiên bản đến tương ứng.

Nếu bạn đã hoàn thành git checkout --ours some_filehoặc git checkout --theirs some_filemuốn đặt lại tệp thành phiên bản hợp nhất 3 chiều của tệp, bạn có thể thực hiện git checkout --merge some_file.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.