Tạm biệt "Merge Conflict": Hướng dẫn dùng Local LLM (Llama 3) để tự động sửa lỗi xung đột Git bằng Python
Bạn đang hí hửng chuẩn bị `git merge` để về sớm thì... BÙM!
Nhìn vào màn hình đầy những dấu
Năm 2026 rồi, đừng làm thủ công nữa. Hãy để AI làm trợ lý cho bạn.
Bài viết này sẽ hướng dẫn bạn xây dựng một công cụ CLI bằng Python, sử dụng mô hình AI chạy cục bộ (Local LLM) để tự động đọc, hiểu và đề xuất phương án sửa conflict thông minh nhất.
Tạo file
Trước khi chạy script (Đầy dấu conflict):
Chạy lệnh:
Sau khi chạy script (AI đã tự động merge):
AI đã thông minh nhận ra nên ưu tiên mức thuế mới (0.10) và giữ lại cả dòng `print` log.
Bạn đang hí hửng chuẩn bị `git merge` để về sớm thì... BÙM!
CONFLICT (content): Merge conflict in src/main.pyNhìn vào màn hình đầy những dấu
<<<<<<<, =======, >>>>>>>, bạn thở dài và bắt đầu trò chơi "đoán ý đồ đồng nghiệp". Mất cả tiếng đồng hồ, và tệ hơn, có thể bạn sẽ merge sai logic.Năm 2026 rồi, đừng làm thủ công nữa. Hãy để AI làm trợ lý cho bạn.
Bài viết này sẽ hướng dẫn bạn xây dựng một công cụ CLI bằng Python, sử dụng mô hình AI chạy cục bộ (Local LLM) để tự động đọc, hiểu và đề xuất phương án sửa conflict thông minh nhất.
1. Tại sao lại là Local LLM (Ollama)?
Chúng ta không dùng ChatGPT hay Claude cho việc này. Tại sao?- Bảo mật tối thượng: Mã nguồn công ty là tuyệt mật. Gửi nó lên server của OpenAI là vi phạm quy tắc bảo mật nghiêm trọng. Local LLM chạy 100% trên máy bạn, code không bao giờ rời khỏi mạng nội bộ.
- Chi phí bằng 0: Không tốn tiền API. Chỉ cần một chút RAM và CPU/GPU của máy dev.
- Ollama & Llama 3: Ollama là công cụ giúp chạy LLM cục bộ dễ như Docker. Llama 3 (8B) của Meta hiện là model mã nguồn mở tốt nhất, đủ thông minh để hiểu logic code phức tạp.
2. Chuẩn bị môi trường
Bạn cần cài đặt Ollama và kéo model về máy.
Bash:
# 1. Cài đặt Ollama (https://ollama.com/)
# 2. Kéo model Llama 3 (phiên bản 8 tỷ tham số, cần khoảng 8GB RAM)
ollama pull llama3:8b
# 3. Cài thư viện Python
pip install requests gitpython
3. Triển khai Code (Python)
Tạo file
ai_resolve.py. Chúng ta sẽ thực hiện 3 bước: Đọc file conflict -> Tạo Prompt cho AI -> Ghi lại file đã sửa.Bước 1: Hàm gọi Local AI (Ollama)
Ollama chạy một server API tại `http://localhost:11434`.
Python:
import requests
import json
OLLAMA_API_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "llama3:8b"
def call_local_ai(prompt):
"""Gửi prompt đến Ollama và nhận câu trả lời"""
print("🤖 Đang nhờ Llama 3 suy nghĩ...")
response = requests.post(OLLAMA_API_URL, json={
"model": MODEL_NAME,
"prompt": prompt,
"stream": False, # Nhận toàn bộ câu trả lời một lần
"options": {
"temperature": 0.2 # Giữ cho AI sáng tạo ở mức thấp để code chính xác
}
})
if response.status_code == 200:
return response.json()['response']
else:
raise Exception(f"Lỗi gọi Ollama: {response.text}")
Bước 2: Đọc và phân tích file conflict
Git đánh dấu conflict bằng các block. Chúng ta cần tách ra 3 phần: Code của bạn (Current), Code đang merge vào (Incoming) và Code gốc (Base - nếu có).
Python:
import re
def parse_conflict_file(file_path):
"""Đọc file và tách các phần conflict"""
with open(file_path, 'r') as f:
content = f.read()
# Regex để tìm block conflict
# Cấu trúc: <<<<<<< HEAD\n(Code A)\n=======\n(Code B)\n>>>>>>> branch_name
pattern = re.compile(r'<<<<<<< HEAD\n(.*?)\n=======\n(.*?)\n>>>>>>> .*?\n', re.DOTALL)
conflicts = []
for match in pattern.finditer(content):
conflicts.append({
'full_block': match.group(0),
'current_code': match.group(1),
'incoming_code': match.group(2)
})
return content, conflicts
Bước 3: Tạo Prompt "thần thánh" và Sửa file
Chất lượng câu trả lời phụ thuộc vào Prompt. Hãy yêu cầu AI đóng vai một Senior Dev.
Python:
def generate_resolution_prompt(current_code, incoming_code):
"""Tạo prompt yêu cầu AI merge code"""
return f"""
Bạn là một Senior Software Engineer với kinh nghiệm dày dặn về Git và lập trình.
Nhiệm vụ của bạn là giải quyết một Git Merge Conflict.
Dưới đây là hai đoạn code đang xung đột:
--- CODE HIỆN TẠI (HEAD) ---
{current_code}
--- CODE ĐANG MERGE VÀO (INCOMING) ---
{incoming_code}
----------------------------
YÊU CẦU:
1. Phân tích logic của cả hai đoạn code.
2. Hợp nhất chúng lại thành một đoạn code duy nhất, chính xác về mặt logic và cú pháp.
3. Ưu tiên giữ lại chức năng của cả hai bên nếu có thể, hoặc chọn phiên bản hợp lý hơn nếu chúng mâu thuẫn hoàn toàn.
4. CHỈ TRẢ VỀ ĐOẠN CODE ĐÃ HỢP NHẤT. KHÔNG giải thích, KHÔNG thêm markdown ```.
"""
def resolve_file(file_path):
"""Hàm chính để xử lý một file"""
print(f"🛠️ Đang xử lý file: {file_path}")
original_content, conflicts = parse_conflict_file(file_path)
if not conflicts:
print("✅ Không tìm thấy conflict nào trong file này theo chuẩn Git.")
return
resolved_content = original_content
for i, conflict in enumerate(conflicts):
print(f"🔥 Đang giải quyết conflict #{i+1}...")
prompt = generate_resolution_prompt(conflict['current_code'], conflict['incoming_code'])
# Gọi AI để lấy code đã merge
ai_resolution = call_local_ai(prompt)
# Clean up output của AI (đôi khi nó vẫn thêm text thừa)
ai_resolution = ai_resolution.strip()
if ai_resolution.startswith("```") and ai_resolution.endswith("```"):
ai_resolution = ai_resolution[3:-3].strip()
if ai_resolution.startswith("python"): ai_resolution = ai_resolution[6:].strip()
# Thay thế block conflict bằng code của AI
resolved_content = resolved_content.replace(conflict['full_block'], ai_resolution)
# Ghi lại file
with open(file_path, 'w') as f:
f.write(resolved_content)
print(f"✨ Đã sửa xong conflict cho {file_path}! Hãy review lại.")
# --- CHẠY THỬ ---
# Giả sử bạn đang đứng ở thư mục chứa file bị conflict
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Sử dụng: python ai_resolve.py <đường_dẫn_file_conflict>")
else:
resolve_file(sys.argv[1])
4. Demo kết quả
Giả sử bạn có fileutils.py bị conflict:Trước khi chạy script (Đầy dấu conflict):
Python:
def calculate_tax(price):
<<<<<<< HEAD
# Thuế VAT 2025
tax_rate = 0.08
=======
# Thuế VAT mới cập nhật theo nghị định
tax_rate = 0.10
print(f"Áp dụng thuế suất: {tax_rate}")
>>>>>>> feature/update-tax
return price * tax_rate
Chạy lệnh:
python ai_resolve.py utils.pySau khi chạy script (AI đã tự động merge):
Python:
def calculate_tax(price):
# Thuế VAT mới cập nhật theo nghị định (AI chọn logic mới hơn từ nhánh feature)
tax_rate = 0.10
print(f"Áp dụng thuế suất: {tax_rate}")
return price * tax_rate