Làm cách nào để tạo Git pull sử dụng rebase theo mặc định cho tất cả các kho lưu trữ của tôi?


186

Có cách nào để thiết lập kho lưu trữ Git của máy chủ sao cho mọi thao tác git pullđược thực hiện từ bản sao (cục bộ) của nó được sử dụng --rebasetheo mặc định không? Bằng cách tìm kiếm trên Stack Overflow, tôi đã tìm hiểu về branch.autosetuprebasenó, nhưng nó cần được cấu hình cho mỗi bản sao riêng lẻ.

Luồng dự án của tôi được thiết lập sao cho chúng ta pulldevelopnhánh trước khi đưa mergemột nhánh tính năng vào nó. Điều này pullgần như luôn luôn sử dụng --rebase, vì vậy tôi đang cố gắng tìm hiểu xem đây có thể là mặc định không.


6
Tại sao bạn lại muốn điều đó? Tôi nghĩ sẽ hợp lý hơn khi dạy người dùng suy nghĩ tích cực về trường hợp nào sẽ phù hợp hơn (dựa trên mức độ thay đổi mà họ đã thực hiện hoặc mong đợi từ thượng nguồn) '
Jonas Schäfer

4
@JonasWielicki Vâng, tôi đồng ý. Chỉ là một số thành viên trong nhóm của tôi chưa quen với Git, và tôi muốn biết liệu có cách nào để thực thi nó để tránh các vấn đề trong giai đoạn ban đầu (cho đến khi họ biết được nó). Nhóm cũng làm việc từ xa trong một múi giờ khác, điều đó có nghĩa là họ sẽ bị kẹt trong vài giờ nếu có sự cố. Chỉ tò mò muốn biết nếu điều này là có thể.
Người đàn ông đeo mặt nạ

1
Tôi nghĩ đặc biệt đối với các thiết lập ban đầu, tốt hơn là nên hợp nhất. Rebase làm cho nhiều điều kỳ lạ hơn nếu mã của bạn thực sự phân kỳ. Bạn phải giải quyết các xung đột tương tự lặp đi lặp lại cho đến khi bạn thúc đẩy. Vì vậy, nếu một thành viên trong nhóm muốn làm việc với một số mã, luôn sử dụng rebase và không đẩy cho đến khi anh ta hoàn thành (điều mà người mới có thể làm, thay vì tự phân nhánh), họ sẽ phải đối mặt với những xung đột tương tự mà họ đã giải quyết X lần .
Jonas Schäfer

3
@JonasWielicki Các thành viên trong nhóm thực hiện một chi nhánh mới cho mỗi tính năng mới mà họ làm việc (và điều này, họ đã hiểu khá rõ). Nhu cầu rebase xuất hiện bởi vì các nhà phát triển khác đã cam kết với nhánh phát triển "từ xa" vào thời điểm anh ta sẵn sàng thúc đẩy các thay đổi của mình. Do đó, tôi muốn anh ấy thực hiện một cuộc nổi loạn kéo từ xa trước khi thay đổi. Bản thân dự án khá trưởng thành, chỉ có nhóm là mới. :) Vì vậy, nó là một "thiết lập ban đầu" chỉ về mặt con người. Lời khuyên của bạn cho kịch bản này là gì?
Người đàn ông đeo mặt nạ

5
Trả lời nhận xét đầu tiên của bạn, trong phần lớn các trường hợp (gần như tất cả), rebase là lựa chọn đúng đắn, vì phải mất rất nhiều thời gian để kiểm tra kỹ lưỡng một tính năng mới, v.v ... Đến lúc đó, chắc chắn sẽ có nhiều cam kết từ các nhà phát triển khác.
Người đàn ông đeo mặt nạ

Câu trả lời:


205

Hiện tại có 3 cấp độ cấu hình khác nhau cho hành vi kéo mặc định. Từ phổ biến nhất đến hạt mịn nhất là:

1. pull.rebase

Đặt điều này thành truecó nghĩa git pulllà luôn luôn tương đương git pull --rebase(trừ khi branch.<branchname>.rebaseđược đặt rõ ràng thành false). Điều này cũng có thể được đặt trên mỗi kho lưu trữ hoặc trên toàn cầu.

2. branch.autosetuprebase

Đặt điều này alwayscó nghĩa là bất cứ khi nào một nhánh theo dõi được tạo, một mục cấu hình như bên dưới sẽ được tạo cho nó. Để kiểm soát tốt hơn hạt, điều này cũng có thể được thiết lập để never, localhay remotevà có thể được thiết lập cho mỗi kho hoặc trên toàn cầu. Xem git config --helpđể biết thêm chi tiết.

3. branch.<branchname>.rebase

Đặt điều này truecó nghĩa là chi nhánh cụ thể đó sẽ luôn kéo từ thượng nguồn của nó thông qua việc khởi động lại, trừ khi git pull --no-rebaseđược sử dụng rõ ràng.

Phần kết luận

Vì vậy, trong khi bạn không thể thay đổi hành vi mặc định cho tất cả các bản sao trong tương lai của kho lưu trữ, bạn có thể thay đổi mặc định cho tất cả các kho lưu trữ của người dùng hiện tại (hiện tại và tương lai) thông qua git config --global pull.rebase true.


4
Cám ơn phản hồi của bạn. Tôi đã khám phá nếu tôi có thể có một cài đặt để bất kỳ ai nhân bản kho lưu trữ đều bật nó theo mặc định. Cài đặt ở trên sẽ được lưu trữ ~/.gitconfig, có nghĩa là mỗi nhà phát triển nhân bản kho lưu trữ máy chủ sẽ cần chạy lệnh. Không phàn nàn về giải pháp của bạn. Đó là một điều tốt, tôi chỉ muốn xác nhận rằng tôi hiểu chính xác quan điểm của bạn.
Người đàn ông đeo mặt nạ

Cảm ơn câu trả lời. Nó thực sự trông như thế này là gần như người ta có thể nhận được.
Người đàn ông đeo mặt nạ

139

Làm thế nào về

git config --global pull.rebase true

Điều này sẽ nói với git để luôn luôn kéo với rebase.


3
Cảm ơn, điều này hoạt động tuyệt vời cho các chi nhánh theo dõi hiện có.
Fls'Zen

1
Vui lòng xóa --bool, không cần thiết
diralik

38

Câu trả lời là không.

Không có cách nào để thiết lập một kho lưu trữ từ xa để mọi người nhân bản nó có hành vi git pullthay đổi mặc định .

Tuy nhiên, bạn có thể thiết lập một hook phía máy chủ để kiểm tra xem không ai đẩy các cam kết hợp nhất ( có lẽ như thế này , có lẽ).

Ngoài ra còn có một số tùy chọn cấu hình mà bạn có thể quan tâm. Tất cả các nhà phát triển nhân bản từ kho lưu trữ từ xa sẽ phải tự thiết lập thủ công.

1. Tùy chọn branch.<name>.rebase

Bạn có thể định cấu hình một nhánh cục bộ để luôn sử dụng --rebase, như thế này, thay thế <name>bằng một tên nhánh:

git config branch.<name>.rebase true

Sau khi chạy nó master, masterphần trong .git/configtrông như thế này:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Tùy chọn branch.autosetuprebase

Chạy lệnh cấu hình trước đó cho mọi nhánh Git có thể gây rắc rối, vì vậy bạn có thể định cấu hình Git để tự động thiết lập nó cho mọi nhánh mới:

git config branch.autosetuprebase always

(Bạn cũng có thể chỉ định never, remotelocal, xem man git-configđể biết chi tiết.)

Không có --globaltùy chọn, cấu hình được lưu vào .git/configvà chỉ có kho lưu trữ hiện tại bị ảnh hưởng. Với --global, cấu hình được lưu vào~/.gitconfig và mọi kho lưu trữ chưa được định cấu hình đều bị ảnh hưởng.

Tùy chọn này không ảnh hưởng đến các chi nhánh hiện có.

3. Tùy chọn pull.rebase

git config --bool pull.rebase true

(Bạn cũng có thể cung cấp cho nó --global tùy chọn.)

Nếu tùy chọn này là đúng, việc chạy git pulltương đương với git pull --rebase, trừ khi branch.<name>.rebaseđã được đặt thành false.


3

Điều này làm cho --rebasetùy chọn mặc định khi ban hành mộtgit pull trên một nhánh nhất định.

@Flimm, tôi cần thêm true để làm cho tùy chọn đầu tiên của bạn hoạt động.

Vì vậy, cú pháp đúng là:

git config branch.<branch>.rebase true

Để chạy lệnh này trên developnhánh:

git config branch.develop.rebase true

Và bây giờ developphần trong .git/confignhư thế này:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

Cảm ơn, tôi đã chỉnh sửa câu trả lời của mình, trong tương lai, hãy tự mình chỉnh sửa câu trả lời.
Flimm

2
Donwvoter, dù bạn là ai, hãy giải thích lý do của bạn. Downvote mà không có một bình luận có vẻ hoàn toàn độc đoán và không có kết cấu với tôi.
Daishi

1

Hiện tại không có cách nào để đặt chính sách mặc định cho kho lưu trữ.

Nếu bạn muốn nó cho chính mình và bạn sử dụng ít nhất git 1.7.9, bạn có thể đặt pull.rebasecấu hình trên toàn cầu như sau:

git config --global pull.rebase true

Nhưng bạn sẽ phải làm trên mỗi máy. Một tùy chọn có thể là cấu hình mẫu / khung nhà người dùng mặc định với tùy chọn đó. Người dùng có thể, tuy nhiên, thay đổi tùy chọn đó.

Nếu bạn không muốn hợp nhất, bạn có thể xác định móc phía máy chủ để từ chối các lần đẩy với hợp nhất.

Để bạn tham khảo, tài liệu của anh ấy là tài liệu nguồn cho pull.rebase:

Khi đúng, rebase các nhánh trên đỉnh của nhánh được tìm nạp, thay vì hợp nhất nhánh mặc định từ điều khiển mặc định khi "git pull" được chạy. Xem "chi nhánh..rebase" để đặt mục này trên cơ sở từng chi nhánh.

Khi hợp nhất, chuyển tùy chọn --rebase-merge để git rebase để các cam kết hợp nhất cục bộ được bao gồm trong rebase (xem git-rebase để biết chi tiết).

Khi bảo toàn, cũng chuyển --preserve-sáp nhập cùng với git rebase để các cam kết hợp nhất được cam kết cục bộ sẽ không bị làm phẳng bằng cách chạy git pull.

Khi giá trị tương tác, rebase được chạy trong chế độ tương tác.

LƯU Ý: đây là một hoạt động có thể nguy hiểm; không sử dụng nó trừ khi bạn hiểu các hàm ý (xem git-rebase để biết chi tiết).

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.