Kéo cho một nhánh Git khác mà không cần chuyển đổi


53

gần đây chúng tôi đã chuyển từ SVN sang Git và đồng thời đưa các hệ thống trực tiếp của chúng tôi vào kiểm soát phiên bản (thay vì kiểm tra cục bộ và sao chép tệp để trực tiếp).

Trong dự án tôi được giao cho tất cả chúng ta truy cập vào cùng một kho lưu trữ và để có được những thay đổi trực tiếp, chúng ta chỉ git pullở đó. Điều này gây ra sự cố bởi vì các thiết kế web của chúng tôi đẩy các thay đổi vào VCS chưa được phát hành mà phải ở trong môi trường kiểm tra web.

Khi một trong những nhà phát triển bắt đầu hoạt động, anh ta nhận được tất cả (có thể chưa hoàn thành).

Tôi đã nghĩ đến việc chuyển trực tiếp sang một nhánh phụ và chỉ hợp nhất những gì đã thay đổi nhưng do thiếu kiến ​​thức git nên tôi không biết làm thế nào.

Ý tưởng của tôi là:

  • Tạo một Chi nhánh mới trong live ( git branch live).
  • Mỗi khi có chuyện gì xảy ra
    • Kéo các thay đổi trong bản gốc (như git checkout master; git pull; git checkout live:)
    • git merge master

Vấn đề là việc chuyển sang làm chủ hoặc kéo mọi thứ trực tiếp vào hệ thống trực tiếp sẽ gây ra vấn đề nên tôi muốn tránh điều này.

Có cách nào để làm điều này không hay có cách nào tốt hơn để quản lý hệ thống Live (ngoại trừ việc đào tạo các sở thích web để không đẩy những thứ còn dang dở).


git pull --alltheo mặc định sẽ không kéo master vào live, nó sẽ kéo master và hợp nhất nó với master và (nếu tồn tại trên máy chủ) kéo live để hợp nhất vào live. Bạn đã thử à?
Tobias Kienzler

Có phải vấn đề của bạn gây ra bởi một tệp không thuộc quyền kiểm soát phiên bản trước khi phân nhánh trực tiếp và thêm git sau khi sửa đổi thành chủ sau này? Đó là những gì đã xảy ra với tôi trước đây, thông thường nên tạm thời đổi tên tệp đó hoặc nếu không cần thiết trực tiếp , hãy sử dụng git checkout -fđể bỏ qua vấn đề - nhưng hãy tạo bản sao lưu!
Tobias Kienzler

Câu trả lời:


21

Bạn có thể sử dụng git stashtrước khi kiểm tra chính và kéo, và sau khi kiểm tra trực tiếp, hãy sử dụng lại git stash pop(hoặc nếu git của bạn đã cũ hơn git stash applygit stash cleargiả sử bạn chưa bỏ sót thứ gì khác)


6
git pull --allsẽ tìm nạp tất cả các điều khiển từ xa, nhưng nó vẫn sẽ cố gắng hợp nhất một nhánh (hoặc nhánh mặc định) vào nhánh hiện tại.
mipadi

@mipadi có, nhưng chỉ có chi nhánh hiện tại tự mình cố gắng kiểm tra chủ và gây ra xung đột, phải không?
Tobias Kienzler

Nó sẽ hợp nhất bất cứ nhánh nào được cấu hình để tự động được sáp nhập vào nhánh hiện tại (nếu nhánh đó được cấu hình).
mipadi

1
@Superole Nó được ghi nhận là "tìm nạp tất cả các điều khiển từ xa", bao gồm không chỉ nhiều kho lưu trữ, mà cả các chi nhánh. Mặc dù trong nhận thức muộn, git fetch --allcó thể là một câu trả lời tốt hơn
Tobias Kienzler

1
@TobiasKienzler Nó chỉ hướng dẫn git tìm nạp từ tất cả các điều khiển từ xa được cấu hình. Trường hợp phổ biến nhất là chỉ có một nguồn gốc có tên từ xa. NẾU bạn tình cờ có nhiều hơn một điều khiển từ xa có cùng chi nhánh với hiện tại của bạn và chúng không có mối quan hệ nhanh chóng với nhau, THEN sử dụng --alltùy chọn sẽ cung cấp cho bạn một sự kết hợp bạch tuộc của các phiên bản khác nhau của chi nhánh vào hiện tại ! Vì vậy, lời khuyên của tôi là tránh xa --alltrừ khi đó là những gì bạn đang theo đuổi, bởi vì trong hầu hết các trường hợp khác, nó sẽ không cho bạn gì cả.
Superole

62

Tôi đã có thể để kéo thay đổi từ origin/mastervào mastertrong khi làm việc ở chi nhánh khác bằng cách sử dụng lệnh này:

git fetch origin master:master

6
Tuyệt vời! Chính xác những gì tôi đang tìm kiếm - điều này cần được ghi lại rõ ràng hơn nhiều ...
Markus Shepherd

2
Bạn có thể tìm tài liệu về vấn đề này tại đây: git-scm.com/docs/git-fetch#_examples
c1moore

fetch! =pull
D. Kovács

5

Giải quyết vấn đề trước. Họ không nên bị đẩy đến một chi nhánh mà họ không có doanh nghiệp đẩy tới.

Những gì bạn dường như đang hỏi sẽ là một cái gì đó như

git checkout live
git pull origin master

Điều này sẽ cố gắng hợp nhất của chủ từ xa và chi nhánh trực tiếp của bạn.


Vấn đề là hiện tại chúng tôi chỉ có một chi nhánh và thực sự không thể thay đổi điều đó vì mọi người đã quá quen với SVN và không sẵn sàng tìm hiểu những lợi thế của một cái gì đó mới. Nó sẽ chỉ có thể tạo một nhánh mới trong thư mục trực tiếp. Hợp nhất chủ từ xa vào nhánh sống là điều tôi muốn tránh vì tôi không thể ngăn ai đó đẩy mã gỡ lỗi, hàm không đầy đủ, lỗi cú pháp và bất cứ điều gì khác cho chủ (rốt cuộc tôi chỉ là nhà phát triển cơ sở). Cảm ơn đề nghị của bạn mặc dù.
Morfildur

2
@dbeme: Bạn có thể sử dụng tarball và các bản vá. ;) Trừ khi họ sẵn sàng học git (và không khó để phân nhánh và hợp nhất), bạn sẽ gặp vấn đề.
Josh K

0

Tôi khuyên bạn nên tạo một thử nghiệm git repo cho mọi người cam kết. Tất cả các repos, bao gồm cả trang web trực tiếp của bạn sẽ là bản sao của repo thử nghiệm. Theo cách này, bất cứ ai cũng có thể đẩy vào thử nghiệm mà không cần chạm vào trang web trực tiếp. Khi ai đó cần cập nhật trang web trực tiếp, thì bạn có thể kéo trang web trực tiếp từ repo thử nghiệm git. Quy trình công việc này khá giống với SVN. Để linh hoạt hơn, tôi khuyên bạn nên sử dụng nhánh "sống" mà bạn mô tả.

Tóm lại, git repo của mọi người là một bản sao của repo thử nghiệm. Các trang web sản xuất trực tiếp chỉ là một bản sao của repo thử nghiệm là tốt. Ngoài ra, thử nghiệm có thể là một bản sao của sản phẩm trực tiếp để "git đẩy" luôn luôn hướng tới sản xuất.

Các tùy chọn khác bao gồm thêm nhánh "sống" vào sắp xếp này hoặc bao gồm cả repo "dàn dựng" giữa thử nghiệm và sản xuất. Để bảo mật hơn, tôi khuyên bạn nên hạn chế quyền truy cập vào repo git trực tiếp và buộc mọi người sử dụng tập lệnh được bảo mật để thực hiện sản xuất trực tiếp.

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.