2016-01-20 19 views
8

Sau khi hợp nhất từ ​​chi nhánh origin/base vào chi nhánh feature của tôi, tôi phải giải quyết một xung đột về tệp Parameter.java. Tôi đã khởi chạy công cụ hợp nhất Git và tôi đã giải quyết nó. Khi nó đã được giải quyết, tôi đã thực hiện một số git commit và mở Vim này bằng thông báo cam kết hợp nhất mặc định.Thông báo cam kết hợp nhất Git mặc định không bao gồm xung đột

Thing là, thông báo cam kết mặc định này chứa danh sách xung đột nhưng bắt đầu bằng #, do đó chúng sẽ bị bỏ qua trong thông báo cam kết.

Merge remote-tracking branch 'origin/base' into feature 

# Conflicts: 
#  Parameter.java 
# 
# It looks like you may be committing a merge. 
# If this is not correct, please remove the file 
#  .git/MERGE_HEAD 
# and try again. 

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# On branch feature 
# All conflicts fixed but you are still merging. 
# 
# Changes to be committed: 
#  modified: Parameters.java 
#  modified: SpecialParameters.java 
#  modified: Traveller.java 

Có một số cấu hình để thêm để đặt những xung đột này tự động trong thông báo cam kết không? Do đó, hãy xóa # trên các tệp xung đột trong phần Conflicts?

Trả lời

8

Bạn có thể sử dụng móc prepare-commit-msg để làm như vậy.

Sao chép .git/hooks/prepare-commit-msg.sample-.git/hooks/prepare-commit-msg

Ví dụ bên trong nó thực sự làm tăng # để phần Mâu thuẫn:

case "$2,$3" in 
    merge,) 
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; 

móc này có ý nghĩa vì các phiên bản trước đó đang làm điều này bằng cách mặc định (như trong Linux git version 1.7.10.4).

Bây giờ, điều bạn muốn làm hoàn toàn ngược lại: xóa # trên phần Xung đột. Thật vậy, git version 2.6.2.windows.1 bình luận ra theo mặc định các xung đột phần vì vậy bạn chỉ có thể cập nhật các lệnh trong prepare-commit-msg với:

/usr/bin/perl -i.bak -ne 's/^#// if /^# Conflicts/ .. /^#\R/; print' "$1" ;; 
+0

'# móc này bao gồm ba ví dụ. Nhận xét đầu tiên trong phần "Xung đột:" của cam kết hợp nhất.' được viết ở đầu tệp, vì vậy nó thực sự ngược lại. Dù sao, tôi đã thử đổi tên nó như bạn đề nghị, tôi khởi động lại Git bash nhưng nó vẫn không hoạt động, phần xung đột vẫn còn bình luận. – jeerbl

+0

Bạn nói đúng. Tôi đã chỉnh sửa câu trả lời của mình. –

+1

Đối với perl, thay thế 'sed -i.bak '/^# Xung đột: /,/^ # $/s /..//'" $ 1 "' – jthill

-1

Bạn không cần phải thêm nó vào cam kết thông báo cho mình. Một khi bạn đã thực hiện một cam kết hợp nhất, nếu có xung đột git sẽ cho bạn biết họ đang ở đâu. Chỉ cần chạy một số git show --name-only [commit sha] trên cam kết là hợp nhất chứa xung đột và bạn sẽ thấy nó là một phần của thư.

+0

Bạn có thể hiển thị ví dụ không? Tôi đã thử nghiệm nó và nó dường như không hoạt động. Theo như tôi biết, một khi cam kết được thực hiện, Git không lưu trữ bất kỳ thông tin nào về xung đột. –

+0

Bạn có thể xem ví dụ tại đây: https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/ – mohammedkhan

+0

Thú vị. Có lẽ đó là vấn đề của phiên bản git. Tôi không thấy nó khi thử nó. –

1

tôi sử dụng này trong đó sử dụng sed 's ranges by patterns (và được dựa trên jthill's answer)

Đọc trong ngôn ngữ của con người: Trong phạm vi ranh giới giữa # Conflicts:# hoặc (blank line), loại bỏ trước #(space) hoặc # (# \?).

sed -i '/start/,/stop/ s/# \?//' 

chuẩn bị cam kết-msg móc:

# prepare-commit-msg 
case "$2,$3" in 
    merge,) 
    # Uncomment Conflicts section in merge commit body 
    sed -i '/^# Conflicts:/,/^#\?$/ s/# \?//' "$1" 
    ;; 
    *) ;; 
esac 

mà kết quả trong

Conflicts: 
    GIT-VERSION-GEN 
    RelNotes 
Các vấn đề liên quan