Làm thế nào để kéo vào nhiều nhánh cùng một lúc với git?


13

Trong một repo tôi có nhiều nhánh, trong đó có "master" và "developers", được thiết lập để theo dõi các nhánh từ xa "origin / master" và "origin / developers".

Có thể xác định rằng tôi muốn cả chủ và phát triển được hợp nhất (chuyển tiếp nhanh) cùng một lúc không?

Khi tôi làm git pullbây giờ tôi nhận được một cái gì đó như thế này:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

tất cả các nhánh từ xa được tìm nạp, nhưng chỉ có nhánh tôi hiện đang được hợp nhất với nhánh từ xa tương ứng.

Vì vậy tôi phải làm git checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... Và sau đó git pullmột lần nữa, và sau đó chuyển trở lại để phát triển, để có được kết quả mong muốn.

Tôi biết tôi có thể tạo bí danh / tập lệnh thực hiện các bước này. Nhưng tôi muốn tránh điều đó nếu có thể, vì nó dễ bị lỗi và không hiệu quả lắm .
Chỉnh sửa: ok hãy để tôi viết lại đó. Mục tiêu của tôi là không làm nản lòng hay cau mày khi tùy chỉnh kịch bản / bí danh của git. Tôi chỉ muốn một giải pháp dựng sẵn nếu nó tồn tại :)


Tôi đã cố gắng git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masternhưng điều đó khiến cho chủ nhân từ xa được hợp nhất để phát triển ..
Superole

1
Tại sao nó dễ bị lỗi hoặc không hiệu quả? Git dự định sẽ được tùy chỉnh như thế này. BTW, để tránh phải kiểm tra từng chi nhánh, bạn có thể muốn chia pullthành một chi nhánh fetchtheo sau là một mergechi nhánh.
jjlin

@jjlin tốt nếu tôi có thể làm điều đó mà không cần kiểm tra từng chi nhánh có thể giúp về hiệu quả. Đây là lỗi dễ xảy ra vì ma trận của những thứ có thể sai và các hiệu ứng có thể có trên phần còn lại của tập lệnh là hơi phức tạp. Tôi không nói rằng không thể làm cho nó an toàn, nhưng nó sẽ là một sự đánh đổi. Vì vậy, tôi thích một giải pháp dựng sẵn nếu nó tồn tại :)
Superole

Câu trả lời:


11

Bạn có thể thiết lập một bí danh sử dụng git fetchvới refspec để chuyển tiếp nhanh các nhánh của bạn chỉ bằng một lệnh. Thiết lập này dưới dạng bí danh trong .gitconfigtệp người dùng của bạn :

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Cách sử dụng : git sync.

Đây là lý do tại sao nó hoạt động:

  1. git checkout --quiet HEADtrực tiếp kiểm tra cam kết hiện tại của bạn, đưa bạn vào trạng thái đầu tách ra . Bằng cách này, nếu bạn đang bật masterhoặc develop, bạn tách bản sao làm việc của mình khỏi các con trỏ nhánh đó, cho phép chúng được di chuyển (Git sẽ không cho phép bạn di chuyển các tham chiếu chi nhánh trong khi bản sao làm việc của bạn đã kiểm tra chúng).

  2. git fetch origin master:master develop:developsử dụng refspecs fetchđể chuyển tiếp nhanh masterdevelopcác nhánh trong repo cục bộ của bạn. Cú pháp về cơ bản nói với Git "ở đây là một refspec của biểu mẫu <source>:<destination>, lấy <destination>và chuyển nhanh nó đến cùng điểm với <source>". Vì vậy, các nguồn trong bí danh là các nhánh từ origin, trong khi các điểm đến là phiên bản repo cục bộ của các nhánh đó.

  3. Cuối cùng, git checkout --quiet -kiểm tra nhánh bạn đã ở trên, bất kể có hay không có lỗi trong các lệnh trước đó. Vì vậy, nếu bạn đã masterchạy khi bạn chạy git syncvà mọi thứ thành công, bạn sẽ rời khỏi trạng thái đầu tách ra và kiểm tra cập nhật mới master.

Xem thêm câu trả lời của tôi cho git: cập nhật một chi nhánh địa phương mà không kiểm tra nó? .


Tôi hoàn toàn không hiểu ma thuật tách rời ở đây, tại sao con trỏ để làm chủ không thể di chuyển khi phát triển được kiểm tra? ... dù sao tôi cũng đã thử điều này và dường như nó hoạt động trừ bây giờ tôi nhận được "Chi nhánh của bạn đi trước 'nguồn gốc / phát triển' bởi 1 cam kết."
Superole

... đã được giải quyết vào lần tới khi tôi kéo
Superole

@Superole chi nhánh nào đi trước origin/developkhi bạn sử dụng bí danh? Nó sẽ không có ý nghĩa nếu đó là developchi nhánh địa phương của bạn . Ngoài ra, con trỏ master có thể được di chuyển nếu nó developđược kiểm tra, vấn đề là nếu nó masterđược kiểm tra, thì bạn không thể chuyển tiếp nhanh mastervì điều đó sẽ ảnh hưởng đến bản sao làm việc của bạn, vì vậy đó là lý do tại sao bạn tách bản sao làm việc từ nó đầu tiên bằng cách sử dụng git checkout head. Tôi thấy một câu trả lời khác mô tả nó là "đứng trên tảng đá", bạn phải rời khỏi tảng đá trước khi bạn có thể di chuyển nó.
40XUserNotFound

đó thực sự là địa phương của tôi phát triển. Và lý do phải là tìm nạp này không cập nhật các nhánh theo dõi. Như tôi hiểu nó; một cái kéo sẽ tìm nạp vào nguồn gốc / phát triển, và sau đó hợp nhất nó vào phát triển.
Superole

Điều rất quan trọng là câu trả lời này gây ra fatal: bad config line xx in file xxx. đó là do dấu chấm phẩy. bạn phải bọc toàn bộ lệnh trong dấu ngoặc kép để tránh vấn đề này.
William Leung

1

Cài đặt git-up . Nó cung cấp cho bạn lệnh git-upsẽ kéo tất cả các nhánh cục bộ trong kho lưu trữ của bạn.


ngọt! Tôi sẽ kiểm tra xem cho chắc chắn.
Superole

2
heh: P Các tuyên bố hỗ trợ Windows có thể dự đoán là không có. một bằng chứng nghiêm ngặt vẫn chưa được đưa ra rằng nó chắc chắn sẽ không gây rối với thiết lập git của bạn, xóa dữ liệu hoặc gửi thông tin vô bổ đến Hacker News thay cho bạn. , kết hợp với nhu cầu về Ruby, đã đẩy tôi đi. Tôi thích khái niệm mặc dù.
Superole

Vui mừng vì có một phương pháp nào đó ... hơi may mắn, mặc dù mọi phương pháp đều yêu cầu một số công cụ của bên thứ ba. Chẳng hạn như cái này và những cái có lệnh "công thức" shell hoặc bí danh sử dụng shell cụ thể (cụ thể cho nền tảng).
0xC0000022L

0

Có vẻ như không có tùy chọn dựng sẵn cho git để kéo vào nhiều nhánh. Ít nhất là không trong phiên bản 1.8.0. mặc dù câu trả lời của @ Cupcake rất gần với nó.

Tuy nhiên , nhận xét của @ jjlin khiến tôi nhận ra rằng ít nhất tôi không cần phải kéo hai lần.

Vì vậy, một chuỗi hiệu quả hơn một chút sẽ là:

git pull
git checkout master
git merge origin/master
git checkout -

Chắc chắn tôi đã kết thúc việc tạo ra một bí danh, nhưng đã quyết định rời khỏi đó và tập trung vào việc chuyển tiếp nhanh một chi nhánh khác.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

Tất nhiên, không có kiểm tra, bí danh này giả định rằng tôi cung cấp tên hợp lệ của nhánh có thể là đối số thứ nhất và có hành vi không xác định khác. Nó cũng không tối ưu cho các trường hợp sử dụng có nhiều hơn hai nhánh, nhưng nó sẽ giúp tôi có được thứ tôi cần bây giờ.

git pull
git ffwd master
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.