2010-01-29 29 views
5

Tôi vừa mới bắt đầu sử dụng git và ấn tượng với sự khác biệt về quy trình làm việc của SVN, nhưng tôi đã gặp phải một câu hỏi về cấu trúc/thiết lập mà tài liệu dường như không trực quan giải thích cách thiết lập và tôi tự hỏi nếu nó thậm chí có thể. Thiết lập của tôi là tôi có một số máy tính tôi phát triển từ (máy tính để bàn và máy tính xách tay), vì vậy, để dễ dàng đồng bộ và cung cấp sao lưu cho kho git, tôi thiết lập kho lưu trữ "công khai" trên trang chủ của mình Linux máy chủ mà tôi có thể ssh vào từ cả máy tính để bàn và máy tính xách tay. Nó không thực sự công khai, vì nó yêu cầu quyền truy cập SSH vào hộp để truy cập.Thiết lập kho Git để phát triển từ hai máy?

Sự cố của tôi xuất hiện khi tôi thực hiện thay đổi trên máy tính để bàn, tôi có thể dễ dàng đẩy các thay đổi vào kho lưu trữ máy chủ (tôi có cờ mirror được đặt cho điều khiển từ xa origin) và sử dụng gitx. các trạng thái từ xa trông giống hệt nhau và mỗi cam kết cá nhân của tôi đã được đăng nhập vào máy chủ.

Câu hỏi đặt ra là khi tôi chuyển sang máy tính xách tay mà tôi thường sử dụng, kho lưu trữ git có thể có một số cam kết đằng sau phiên bản máy chủ và cần được cập nhật. Tôi bắt đầu sử dụng git pull để có được những thay đổi cục bộ, nhưng thay vì sao chép tất cả các cam kết riêng lẻ trên máy chủ vào kho lưu trữ cục bộ, nó thêm một cam kết 'hợp nhất' mới vào kho lưu trữ cục bộ và gitx hiển thị hợp nhất trong nhánh kho từ xa tại đó điểm.

Có lệnh/quy trình làm việc nào để tôi cập nhật kho lưu trữ cục bộ về trạng thái chính xác của kho lưu trữ từ xa (chẳng hạn nếu tôi làm git push --mirror không có dữ liệu nào bị mất)? Tôi có phải xóa kho lưu trữ cục bộ của mình mỗi lần và git clone lại một lần nữa không?

Hiện tại không có ai khác cần quyền truy cập vào kho lưu trữ này, mặc dù trong tương lai nó có thể trở thành kho lưu trữ công cộng để mọi người rút khỏi, vì vậy các câu trả lời không phá hủy khả năng đó sẽ được đánh giá cao.

Chỉnh sửa: Cam kết của tôi bao gồm việc xóa các nhánh khỏi nhánh chính; đó có thể là những gì kích hoạt lệnh git pull để hiển thị dưới dạng hợp nhất không? Có phải cờ --rebase là những gì tôi cần không?

Giải pháp Giải thích: Hóa ra tôi đã làm những điều sau đây để thiết lập các kho của tôi:

  • Sử dụng máy tính xách tay để khởi tạo một kho git
  • kho Đẩy máy tính xách tay đến máy chủ (cam kết Một)
  • Thực hiện thay đổi và cam kết trên máy tính xách tay (máy tính xách tay tại cam kết B)
  • Desktop kho nhái máy chủ (cam kết Một)
  • Thực hiện thay đổi trên máy tính để bàn và cam kết (cam kết C, D, E, bao gồm cả chi nhánh rebasing)
  • Desktop đẩy đến máy chủ (server Fast- về phía trước để E)
  • Khi máy tính xách tay kéo từ máy chủ, kết quả trong một hợp nhất (vì B không thể nhanh chóng chuyển tiếp đến E).
  • Máy tính xách tay hợp nhất và đẩy các thay đổi đối với máy chủ
  • Máy tính để bàn giờ đây cũng phải hợp nhất.

Do đó thêm một cam kết đó là một lỗi mới không chủ định, nó khiến tôi nghĩ rằng nó sẽ luôn là một sự hợp nhất. Theo gợi ý của Xentac, tôi quay trở lại và tìm thấy trên máy tính xách tay mà tôi đã thực hiện một hợp nhất không được đẩy tới máy chủ, đó là thủ phạm, và một khi tôi có cả ba thực sự đồng bộ, git pull --ff (chỉ cần hợp nhất nhanh về phía trước)) hoạt động tốt và cảnh báo tôi nếu có điều gì đó không đồng bộ trước khi thực hiện hợp nhất.

Trả lời

4

Vì bạn có cam kết trong nhánh chính của máy tính xách tay không nằm trong nhánh chính của máy chủ, mỗi khi máy chủ thay đổi, máy tính xách tay không thể cập nhật con trỏ nhánh chính. Đó là lý do tại sao bạn đang tạo các cam kết hợp nhất.

Nếu bạn muốn tiếp tục có các thay đổi không được lưu trữ trên máy chủ nhưng chỉ được lưu trữ trên máy tính xách tay, bạn sẽ muốn git fetch và sau đó git rebase origin/master. Việc tìm nạp sẽ tải xuống các cam kết từ máy chủ nhưng không thay đổi các nhánh địa phương của bạn và việc rebase sẽ tạo lại các thay đổi nhánh chính của máy tính xách tay của bạn trên nhánh master của máy chủ (origin/master).

Có lẽ sẽ tốt hơn nếu bạn không có những cam kết đó. Họ không thể được tích hợp vào toàn bộ codebase để chỉ có một lịch sử chung?

1

Tôi sẽ đề xuất sử dụng cờ --ff, nhưng trang người đàn ông cho biết đó là hành vi mặc định. Bạn có thể thử git pull --ff và xem nó có tạo sự khác biệt hay không.

Nếu bạn đang nhận được một cam kết hợp nhất, nó sẽ cho thấy rằng bạn đã có cam kết trên máy tính xách tay của bạn mà không phải trên máy chủ.

Máy tính xách tay của bạn có được thiết lập làm gương của máy chủ không, như máy tính để bàn của bạn?

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