2012-06-21 28 views
149

Khi có collison trong git merge, tôi mở một mergetool gọi là Meld. Nó mở ra ba tệp LOCAL, BASE và REMOTE. Như tôi đã đọc LOCAL là nhánh địa phương của tôi, BASE là tổ tiên chung và REMOTE là nhánh được sáp nhập.Phiên bản nào của tệp git cuối cùng sẽ được sử dụng: LOCAL, BASE hoặc REMOTE?

Bây giờ cho câu hỏi của tôi: phiên bản nào của tệp sẽ được sử dụng cuối cùng? Nó là REMOTE? Nếu vậy, tôi có thể chỉnh sửa nó như tôi muốn, bất kể những gì trong chi nhánh BASE chẳng hạn?

Trả lời

123

Đó là cái ở giữa: BASE.

Trên thực tế, BASE không phải là tổ tiên chung, nhưng hợp nhất nửa đã hoàn thành nơi xung đột được đánh dấu bằng >>>><<<<.

Bạn có thể xem tên tệp ở trên cùng của cửa sổ chỉnh sửa meld.

See the screenshot here

meld base

Bạn có thể chỉnh sửa các tập tin BASE như bạn muốn có hoặc không sử dụng lệnh meld.
Bạn cũng có thể loại bỏ meld và chỉ chỉnh sửa tệp bằng trình chỉnh sửa văn bản yêu thích của mình.

  • Mã giữa <<<< HEAD===== đánh dấu là một trong những tập tin địa phương 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 tệp ich không thể tự động hợp nhất nếu chúng có tùy chọn cấu hình 'merge.conflictstyle' được đặt thành' diff3' thay vì 'merge' mặc định. – kostix

+3

Tôi thực sự không thấy các bài hát HEAD, <<< 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

+0

Nếu bạn không thấy các dấu hiệu 'HEAD',' <<<<< 'và' ===== ', điều đó 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 "đỏ" –

103

Meld có merge tính năng ẩn 3 chiều kích hoạt bằng cách đi qua trong tham số thứ 4:

meld $LOCAL $BASE $REMOTE $MERGED 

Quyền và trái panes được mở trong chế độ read-only, vì vậy bạn không thể vô tình kết hợp sai đường xung quanh. Khung giữa cho thấy kết quả hợp nhất. Đối với các xung đột nó cho thấy 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à các 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.

Các ~/file .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 

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

Hiện tại, lý do tính năng bị ẩn là chưa được đánh bóng đủ. Nó rất hữu ích như bây giờ, nhưng Kai Willadsen, tác giả meld, chỉ ra vài nếp nhăn cần ủi. Ví dụ, không có GUI để bắt đầu chế độ kết hợp 3 chiều, cú pháp dòng lệnh là một chút phức tạp và như vậy. Nếu bạn nói python và có một số thời gian trên tay của bạn - 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, đồng bộ đã thay đổi một chút. Đây là trong các ý kiến, nhưng nó thuộc về câu trả lời.

Lệnh meld bây giờ sử dụng tùy chọn --output, vì vậy dòng cuối cùng từ đoạn trên nên là:

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

@ Jesse Điều này dường như làm việc với Meld 1.6.0, nhưng không phải với Meld 1.7.0. – lumbric

+7

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

+0

@Johann Hm có bạn nói đúng, nhưng điều đó không giải quyết vấn đề. Kịch bản khởi chạy bạn đã liên kết, không cung cấp chức năng nâng cao như được mô tả trong giải pháp của Tomek Bury. – lumbric

11

tôi thấy rằng không ai trong số các tập tin mặc định hiển thị đã được lưu. meld hiển thị $LOCAL, $REMOTE$BASE theo mặc định. Để làm cho nó hoạt động, tôi cần phải thực hiện meld hiển thị $MERGED thay vì $BASE. Đưa này trong ~/.gitconfig của tôi cố đị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 
+0

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

46

Có 4 file liên quan đến:

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

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

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

  4. $MERGED Các tập tin phần sáp nhập, với những xung đột; đây là tập tin chỉ xúc động bởi sự quá trình hợp nhất và, trên thực tế, không bao giờ hiển thị cho bạn trong meld


File $MERGED là một trong đó chứa các <<<<<<, >>>>>>, ===== (và, có lẽ , ||||||) điểm đánh dấu (để phân định xung đột). là tệp bạn chỉnh sửa theo cách thủ công để sửa các 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ả meld), các tập tin được nhìn thấy trong đó là: $LOCAL, $BASE, $REMOTE. Lưu ý rằng bạn không thấy tệp $MERGED, mặc dù điều này được chuyển thành một tham số ẩn thành meld để ghi kết quả của bản chỉnh sửa ở đó.

Nói cách khác, trong meld, bạn đang chỉnh sửa các tập tin ở giữa, các tập tin $BASE, và bạn chọn tất cả các thay đổi từ trái hoặc từ bên phải tay.Nó là một tập tin sạch sẽ, không được xúc động bởi quá trình hợp nhất. Nhược điểm duy nhất là, khi bạn lưu, bạn không lưu vào tệp $BASE, nhưng trong tham số ẩn thứ tư của meld, đó là tệp $MERGED (mà bạn thậm chí không thấy). Tệp $BASE không không chứa bất kỳ xung đột hoặc hợp nhất thành công nào do không phải là tệp $MERGED.

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

Điểm mấu chốt là trong sổ tay và hình ảnh xung đột kết hợp bạn không nhìn vào các tập tin giống nhau, nhưng kết quả cuối cùng được viết trong cùng một tệp (có nghĩa là các tập tin $MERGED).

Đợt điều chỉnh thủ công của các cuộc xung đột được thực hiện trên $MERGEDgitkhô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) ở chỗ $MERGED tậ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ọ chỉ cho bạn những $LOCAL, $BASE, $REMOTE tập tin. Bạn đang chọn thay đổi từ các tệp $LOCAL$REMOTE và bạn sẽ đưa những tệp đó vào tệp $BASE, hoàn toàn xây dựng lại và thậm chí ghi đè nỗ lực sáp nhập không thành công đó là tệp $MERGED.

+0

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

+0

@yoniYalovitsky: có hoặc p4merge – user1284631

+0

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

2

Đối với một số lý do phiên bản mới nhất của meld không hiển thị dòng đánh dấu thêm vào cho 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 đó.

+0

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

2

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

Với meld 1.8.1 trên Ubuntu tôi đã nhận được

sai số đối số cung cấp cho --diff

và thêm các --output trước $ sáp nhập cố định nó cho tôi:

[mergetool "mymeld"] 
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED 
15

giải pháp Cosmin của công trình, nhưng $ CƠ SỞ sơ được cập nhật - không $ sáp nhập. Điều này sẽ cập nhật các $ sáp nhập file:

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 
+0

Tôi có thể xác nhận điều này.Saad của giải pháp làm việc cho tôi trên Ubuntu. Theo như câu hỏi ban đầu thì đây là câu trả lời chính xác hiện tại. – 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

+0

tại sao bạn cần' --diff $ BASE $ LOCAL - diff $ BASE $ REMOTE' ở cuối? cho tôi trên 1.8.4, điều này làm việc tốt (như xa như tôi có thể nhìn thấy): 'cmd = meld - tự động hợp nhất - đầu ra $ MERGED $ LOCAL $ BASE $ REMOTE' – farmir

13

Với Meld 1.7 Giải pháp của Tomek Bury không hoạt động nữa.

Các thiết lập mặc định đã không đáp ứng tôi:

Default settings

Thay vì cho Meld> = 1,7 Tôi đề nghị một trong hai giải pháp khác.

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

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

first solution

giải pháp thứ hai:

meld $LOCAL $MERGED $REMOTE 

second solution

.gitconfig

Sao chép & dán này trong .gitconfig tập tin của bạn để có được những giải pháp như 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 & dán này trong một file .gitconfig.local thiết meld17 hoặc meld16 chỉ dành cho máy tính 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 
+5

Giải pháp "đầu tiên" và "thứ hai" của bạn có cùng lệnh. – pcworld

+0

Đ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 mà thực sự được sử dụng làm đầu ra của độ phân giải xung đột. – farmir

+0

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

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