Phiên bản nào của tệp git cuối cùng sẽ được sử dụng: ĐỊA PHƯƠNG, BASE hoặc XÓA?


174

Khi có một va chạm trong khi git merge, tôi mở một sáp nhập có tên là Meld . Nó mở ba tập tin ĐỊA PHƯƠNG, CƠ SỞ và XÓA. Như tôi đã đọc ĐỊA PHƯƠNG là chi nhánh địa phương của tôi, BASE là tổ tiên chung và XÓA là chi nhánh được sáp nhập.

Bây giờ với câu hỏi của tôi: phiên bản nào của tập tin cuối cùng sẽ được sử dụng? Có phải là TỪ XA? Nếu vậy, tôi có thể chỉnh sửa nó theo ý muốn hay không, bất kể những gì trong nhánh BASE chẳng hạn?

Câu trả lời:


142

Đó là một trong những ở giữa : BASE.

Trong thực tế, BASEkhông phải là tổ tiên chung, mà là sự hợp nhất nửa hoàn thành nơi xung đột được đánh dấu >>>><<<<.

Bạn có thể thấy tên tệp trên đầu cửa sổ chỉnh sửa meld.

Xem ảnh chụp màn hình tại đây

cơ sở meld

Bạn có thể chỉnh sửa BASEtệp theo ý muốn có hoặc không sử dụng lệnh meld.
Bạn cũng có thể thoát khỏi meld và chỉ cần chỉnh sửa tệp bằng trình soạn thảo văn bản yêu thích của bạn.

  • Mã giữa <<<< HEAD=====điểm đánh dấu là một trong các tệp cục bộ của bạn trước khi hợp nhất.
  • Mã giữa ====>>>> <branch name>là một trong các tệp từ xa.

3
Một số người hiểu rõ hơn về các khối xung đột trong một tệp không hợp nhất tự động nếu chúng có merge.conflictstyletùy chọn cấu hình được đặt thành diff3thay vì mặc định merge.
kostix

3
Tôi thực sự không thấy các bài hát ĐẦU, <<< và ===. Trong trường hợp bạn cung cấp, cửa sổ giữa sẽ trống. Nhưng đó chỉ là một lưu ý cho những người khác, thx cho câu trả lời của bạn.
tsusanka

Nếu bạn không nhìn thấy HEAD, <<<<<=====dấu hiệu, nó có nghĩa là không có xung đột gì cả. Trong trường hợp này, cửa sổ ở giữa sẽ không trống, nó sẽ hiển thị kết quả hợp nhất, nhưng sẽ không có phần "đỏ"
Fabien Quatravaux

10
Khi tôi đang làm hòa trộn với Meld, tôi không thấy bất kỳ <<<<<<, ======cũng không >>>>>>đánh dấu trong phần panel ở giữa (tức là phiên bản BASE) hoặc; và đôi khi, khung giữa sẽ trống, như aGr đã báo cáo. Có thể sự khác biệt này là do cài đặt khác nhau. Khi tôi bắt đầu công cụ Meld, các tập tin sau đây sẽ tồn tại, giả định rằng tên của tập tin trong kho là X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, nơi #một số số. Gọi kết quả hợp nhất phiên bản BASE là khó hiểu; NĂNG LƯỢNG sẽ tốt hơn.
Teemu Leisti

3
BASE trong thực tế là tổ tiên chung, MERGED là tên của tệp có thông tin hợp nhất một phần trong đó. Vui lòng xem câu hỏi và câu trả lời của tôi Thiết lập và sử dụng Meld làm git Difftool và mergetool của bạn để giải thích chính xác cách thức hoạt động của nó. HTH.
mattst

107

Meld có tính năng hợp nhất 3 chiều ẩn được kích hoạt bằng cách chuyển vào tham số thứ 4:

meld $LOCAL $BASE $REMOTE $MERGED

Các ô bên phải và bên trái được mở ở chế độ chỉ đọc, do đó bạn không thể vô tình hợp nhất sai cách. Cửa sổ giữa hiển thị kết quả hợp nhất. Đối với các xung đột, nó hiển thị phiên bản cơ sở để bạn có thể thấy tất cả các bit quan trọng: văn bản gốc ở giữa và sửa đổi xung đột ở cả hai bên. Cuối cùng, khi bạn nhấn nút "Lưu", tệp $ MERGED được viết - chính xác như mong đợi của git.

Tệp ~ / .gitconfig tôi sử dụng chứa các cài đặt sau:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

điều này mở ra meld với 3 tab, tab thứ 1 và thứ 2 chứa các khác biệt đơn giản mà tôi đang cố gắng hợp nhất và tab thứ 3, mở theo mặc định, hiển thị chế độ xem hợp nhất 3 chiều.

Bây giờ, lý do tính năng bị ẩn là vì nó chưa được đánh bóng đủ. Nó rất hữu ích như bây giờ, nhưng Kai Willadsen, tác giả của meld, đã chỉ ra một vài nếp nhăn cần ủi. Ví dụ: không có GUI để bắt đầu chế độ hợp nhất 3 chiều, cú pháp dòng lệnh là một bit phức tạp, và như vậy. Nếu bạn nói tiếng trăn và có chút thời gian trên tay - bạn biết phải làm gì.

Chỉnh sửa: Trong các phiên bản mới hơn của Meld, synax đã thay đổi một chút. Điều này là trong các ý kiến, nhưng nó thuộc về câu trả lời.

Lệnh meld hiện sử dụng tùy chọn --output, vì vậy dòng cuối cùng từ đoạn trích ở trên phải là:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jlie, @lumbric, có vẻ như các phiên bản mới hơn của meld sử dụng cờ --outputcho kết quả $ MERGED. Tôi đã phát hiện ra điều này trong khi xem kịch bản khởi chạy meld đi kèm với phiên bản git của tôi: github.com/git/git/blob/master/mergetools/meld
Johann

1
@lumbric Tôi tin là có, với Meld 1.7.x + với --output option. Xem dòng này trong kịch bản khởi chạy:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
Trong meld mới nhất (phiên bản> 1.8.4), chúng ta phải sử dụng tùy chọn --auto-merge. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE --output $ MERGED
RoboAlex

7
Tôi gặp vấn đề tương tự như @pingpongboss khi sử dụng Meld 1.8.4: Meld đang mở mọi thứ trong một khung riêng, thay vì mở tab thứ 3. Lệnh cuối cùng đã hoạt động tốt là : cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED. Vì vậy, điều này sẽ mở 3 tab (cách cũ tốt), tự động hợp nhất các kết hợp không xung đột vào giữa, trong đó ở giữa là $ MERGED và sẽ được sử dụng làm đầu ra giải quyết xung đột.
nông dân

2
Cú pháp cho đầu ra có thể là --output=<file>hoặc -o <file>, xemmeld --help
levsa

57

Có 4 tệp liên quan:

  1. $LOCALCác tập tin trên chi nhánh nơi bạn đang hợp nhất; không bị ảnh hưởng bởi quá trình hợp nhất khi hiển thị cho bạn

  2. $REMOTECác tập tin trên chi nhánh từ nơi bạn đang hợp nhất; không bị ảnh hưởng bởi quá trình hợp nhất khi hiển thị cho bạn

  3. $BASETổ tiên chung của $ LOCAL và $ REMOTE, nghĩa là. điểm mà hai nhánh bắt đầu chuyển hướng tệp được xem xét; không bị ảnh hưởng bởi quá trình hợp nhất khi hiển thị cho bạn

  4. $MERGEDCác tập tin sáp nhập một phần, với xung đột; đây là tệp duy nhất được chạm vào bởi quá trình hợp nhất và trên thực tế, không bao giờ hiển thị cho bạn trongmeld


Các $MERGEDtập tin là một trong đó chứa <<<<<<, >>>>>>, =====(và, có lẽ, ||||||) đánh dấu (mà mâu thuẫn phân định). Đây là tập tin mà bạn chỉnh sửa thủ công để sửa xung đột.

Chỉnh sửa xung đột thủ công và chỉnh sửa xung đột trực quan được thực hiện trên các tệp khác nhau và trình bày các thông tin khác nhau.

Khi sử dụng mergetool (giả định meld), các tập tin được nhìn thấy trong đó là: $LOCAL, $BASE, $REMOTE. Lưu ý rằng bạn không nhìn thấy $MERGEDtệp, mặc dù điều này được truyền dưới dạng tham số ẩn meldđể ghi kết quả chỉnh sửa ở đó.

Nói cách khác, trong meld, bạn đang chỉnh sửa tệp ở giữa, $BASEtệp và bạn chọn tất cả các thay đổi từ bên trái hoặc từ bên phải theo cách thủ công . Nó là một tập tin sạch, không bị ảnh hưởng bởi quá trình hợp nhất. Vấn đề duy nhất là, khi bạn lưu, bạn không lưu vào $BASEtệp, nhưng trong tham số ẩn thứ tư của meld, đó là $MERGEDtệp (mà bạn thậm chí không nhìn thấy). Các $BASEtập tin nào không chứa bất kỳ xung đột hay hòa trộn thành công một phần vì nó không phải là $MERGEDtập tin .

Trong chỉnh sửa trực quan, khi trình bày cho bạn $BASEtệp (thay vì $MERGEDtệp) gitvề cơ bản sẽ loại bỏ tất cả các nỗ lực của nó để thực hiện việc hợp nhất (những nỗ lực đó có thể nhìn thấy, nếu bạn muốn, trong tệp $ MERGED) và cho phép bạn thực hiện việc hợp nhất hoàn toàn từ đầu .

Điểm mấu chốt là trong xung đột hợp nhất thủ công và trực quan, bạn không nhìn vào cùng một tệp, nhưng kết quả cuối cùng được ghi trong cùng một tệp (đó là $MERGEDtệp).

Đợt điều chỉnh thủ công của các cuộc xung đột được thực hiện trên $MERGEDgit không có nghĩa là để giới thiệu bạn ba tác phẩm, vì vậy nó squashes thông tin từ ba file ( $LOCAL, $BASE, $REMOTE) trong đó $MERGEDtập tin.

Nhưng những công cụ trực quan có phương tiện để hiển thị cho bạn ba tập tin: họ cho bạn thấy $LOCAL, $BASE, $REMOTEtập tin. Bạn đang chọn các thay đổi từ $LOCAL$REMOTEcác tệp và bạn đang đưa các thay đổi đó vào $BASEtệp, xây dựng lại hoàn toàn và thậm chí ghi đè lên nỗ lực sáp nhập thất bại đó là $MERGEDtệp.


Tôi chỉ muốn có những công cụ (ví dụ ngoài so sánh) hiển thị cả 4 tệp
yoniLavi

@yoniYalovitsky: có, hoặc p4merge
dùng1284631

Tôi đã từng sử dụng công cụ hợp nhất từ ​​gói ClearCase
mishmashru

@yoniLavi - cũng những công cụ này hiển thị 4 panes , nhưng không nhất thiết tất cả bốn tập tin như mô tả trong câu trả lời này. Đặc biệt, bạn có thể thiết lập các công cụ 4-cửa sổ để cho bạn thấy $LOCAL, $REMOTE, $BASEvà sản lượng ban đầu bằng để $BASE, nhưng đó là khác biệt so với $MERGEDở chỗ nó không có nỗ lực git để sáp nhập các tập tin và cán bộ chấm xung đột và vân vân. Trên thực tế, đó sẽ là cách để sử dụng các công cụ này tương tự như cách tiếp cận 3 khung của LOCAL / REMOTE / BASE + OUTPUT, không hiển thị được hợp nhất. Cửa sổ thứ 4 chỉ cho phép bạn tách cơ sở khỏi đầu ra.
BeeOnRope

16

Giải pháp của Cosmin hoạt động, nhưng tệp $ BASE được cập nhật - không phải $ MERGED . Điều này sẽ cập nhật tệp $ MERGED :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

Tôi có thể xác nhận điều này. Giải pháp của tôi hoạt động với tôi trên Ubuntu. Theo như câu hỏi ban đầu thì đây là câu trả lời đúng.
cosmin

3
Trong phiên bản meld của tôi - 3.11, lệnh này hoạt động rất tốt:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

Tại sao bạn cần --diff $BASE $LOCAL --diff $BASE $REMOTEcuối cùng? đối với tôi vào ngày 1.8.4, điều này hoạt động tốt (theo như tôi có thể thấy):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@farmir: Không cần thiết. Nó mở ra hai tab nữa trong meld để bạn có thể thấy ĐỊA PHƯƠNG và XÓA so với BASE riêng lẻ.
Sam Kauffman

1
Bất kể tôi cố gắng theo thứ tự nào với các đối số đó, tab ba chiều luôn là tab thứ ba, trong khi tab đầu tiên luôn được chọn theo mặc định. Có cách nào để tạo tab ba chiều theo mặc định không?
Sam Kauffman

13

Với Meld 1.7 , Solution của Tomek Bury không hoạt động nữa.

Các cài đặt mặc định không làm tôi hài lòng:

Thiết lập mặc định

Thay vào đó cho Meld> = 1.7 tôi đề xuất một trong hai giải pháp khác.

Giải pháp đầu tiên :

 meld $LOCAL $BASE $REMOTE --auto-merge

giải pháp đầu tiên

Giải pháp thứ hai :

 meld $LOCAL $MERGED $REMOTE

giải pháp thứ hai

.gitconfig

Sao chép và dán .gitconfigtệp này vào tệp của bạn để nhận các giải pháp như được mô tả ở trên:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Sao chép và dán .gitconfig.localtệp này vào một tệp để đặt meld17 hoặc meld16 chỉ cho máy này trong trường hợp bạn sử dụng .gitconfig trên nhiều máy:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

Điều này không hoạt động trên Meld 1.8.4. Nếu bạn chạy cmd = meld $LOCAL $BASE $REMOTE --auto-merge, khung ở giữa sẽ là $ BASE chứ không phải $ MERGE thực sự được sử dụng làm đầu ra của giải quyết xung đột.
nông dân

1
@farmir Bạn đã chọn $ BASE làm tab thứ hai.
Alex78191

11

Tôi thấy rằng không có tập tin mặc định nào được hiển thị đang được lưu. meld đã được hiển thị $LOCAL, $REMOTE$BASEtheo mặc định. Để làm cho nó hoạt động, tôi cần phải thực hiện chương trình meld $MERGEDthay vì $BASE. Đặt nó trong ~/.gitconfigcố định nó cho tôi:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Tôi đang sử dụng Arch, với:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

Xin lỗi, cấu hình này có tương thích không?
MadMad666

2

Vì một số lý do, các phiên bản mới nhất của meld không hiển thị các dòng đánh dấu được thêm vào cho các xung đột (<<<<<<<, =======, >>>>>>>). Nếu bạn muốn xem những dòng này, bạn nên cài đặt meld v 1.3.3 hoặc trước đó.


Tôi thấy câu trả lời hữu ích của @lumbric stackoverflow.com/a/22911793/641892
wnasich

2

Xin vui lòng xem câu trả lời của Saad cho câu trả lời chính xác.

Với phiên bản 1.8.1 trên Ubuntu, tôi đã nhận được

sai số lượng đối số được cung cấp cho --diff

và thêm --output trước khi $ MERGED đã sửa nó cho tôi:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
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.