Tôi có thể tắt chuyển tiếp nhanh theo mặc định trong git không?


263

Tôi thực sự không bao giờ nghĩ đến một thời điểm mà tôi sẽ sử dụng git mergehơn là git rebasekhông muốn có một cam kết xuất hiện. Có cách nào để cấu hình git để chuyển tiếp nhanh theo mặc định không? Thực tế là có một --fflựa chọn dường như ngụ ý rằng có một cách, nhưng tôi dường như không thể tìm thấy nó trong tài liệu.


3
Tôi sử dụng mergetất cả thời gian cho các chi nhánh khi chưa thực hiện bất kỳ cam kết nào từ xa để chuyển tiếp chúng nhanh chóng. Có vẻ như cách đơn giản và an toàn nhất để làm điều này. Tôi tò mò, rõ ràng bạn có một trường hợp sử dụng. Tại sao bạn muốn tạo một cam kết hợp nhất khi không có cam kết ở một bên của chi nhánh?
CB Bailey

12
Tôi sử dụng các nhánh để tạo ra một nhóm các cam kết hợp lý. Vì vậy, nếu tôi thực hiện hợp nhất, về cơ bản, đó là một cách để nói "những cam kết này đi cùng nhau". Bạn gần như có thể nghĩ về nó như một cuộc nổi loạn và bóng quần tương tác của một người nghèo. :-)
Jason Baker

13
Tắt chuyển tiếp nhanh là vô cùng hữu ích, đặc biệt khi theo mô hình như Mô hình phân nhánh Git thành công
steinybot

2
Vui lòng thay đổi câu trả lời được chấp nhận cho câu trả lời này thành stackoverflow.com của Eric Platon.com/a/6810687/3408 - Tôi đã thực hiện các bước trong câu trả lời được chấp nhận, sau đó nhận ra rằng nó chỉ dành cho nhánh chính trong kho lưu trữ hiện tại, điều này thật ngớ ngẩn.
rjmunro

3
@ jpmc26 Mỗi người tôi đoán. Tôi xảy ra không đồng ý với bài báo đó. Tìm hai cha mẹ của một cam kết hợp nhất không khó và cho bạn biết chính xác những thay đổi là gì. Sau đó, bạn có thể thực hiện những thay đổi đó và thực hiện "rebase lên" một số nhánh khác. Với mô hình phẳng, bạn phải tự tìm và chọn cherry. Chúng tôi chọn để nắm lấy nhánh. Chắc chắn nó rất phức tạp khi nhìn vào toàn bộ cây nhưng đó là thực tế, nhiều thay đổi xảy ra song song. Làm phẳng mọi thứ chỉ che giấu những gì thực sự xảy ra.
steinybot

Câu trả lời:


282

Vâng, có --no-ff. Bạn có thể định cấu hình tùy chọn hợp nhất cho mỗi chi nhánh, ví dụ:

git config branch.master.mergeoptions  "--no-ff"

thêm phần sau vào $(REPO)/.git/configtập tin của bạn :

[branch "master"]
    mergeoptions = --no-ff

Chú thích: nói về kinh nghiệm của tôi, cuối cùng tôi thấy việc chuyển đổi nhanh sang tắt hầu như hữu ích cho người mới chơi git - tuy nhiên một khi cảm giác về quy trình làm việc và khái niệm bắt đầu chìm trong bạn chắc chắn muốn tránh làm mờ biểu đồ nhật ký của bạn với hàng tấn vô nghĩa 'được hợp nhất điều khiển từ xa ..blarf '.

Chú thích 2, một thập kỷ sau: các câu trả lời khác bên dưới cung cấp các tùy chọn cấu hình hiện đại hơn, nhưng thực sự, bạn có thể KHÔNG muốn ở lại với các mặc định (tức là chuyển tiếp nhanh bất cứ khi nào có thể) trong thời đại ngày nay, bởi vì hợp nhất trống thực sự chỉ làm cho lịch sử khó khăn hơn nhiều để lý do về.


142
Học git hơi giống leo núi; nhưng thay vì bắt đầu với những vách đá nhỏ và tiến dần đến những nơi khó khăn hơn, git khiến bạn leo lên cùng một ngọn núi, chỉ để rơi ở độ cao khác nhau mỗi lần, mỗi khi ngạc nhiên rằng dây cứu sinh không được gắn vào.
Conny

12
@Thomas: Vâng; git pullgit fetch+ git merge.
Michelle Tilley

9
Điều này có vẻ tốt, nhưng có cách nào để làm điều đó trên toàn cầu, cho tất cả các chi nhánh, thay vì phải thiết lập nó cho mọi chi nhánh không?
bwinton

33
Cẩn thận với những con rồng. Tùy chọn này nguy hiểm giống như @Thomas đã nói ... Mỗi lần kéo git tạo ra cam kết hợp nhất. git pull --ff không ghi đè hợp nhất = no-ff trong git config.
Dalibor Filus

15
Nếu tôi mệt mỏi với việc gõ git merge --no-ff (branchname)thì sao? Và tôi muốn git pullhoạt động như nó luôn luôn có?
Dogweather 4/2/2015

341

Dường như vẫn còn một câu hỏi đang chờ xử lý trong chuỗi: Làm thế nào để thực hiện nó trên toàn cầu (tức là cho tất cả các chi nhánh)? Đối với các hồ sơ, chúng tôi có thể sử dụng như sau:

git config --add merge.ff false

... Để làm cho nó áp dụng cho tất cả các chi nhánh trong kho lưu trữ hiện tại. Để làm cho nó áp dụng cho tất cả các chi nhánh trong tất cả các kho lưu trữ nơi ai đó không chạy nó mà không có --globaltùy chọn (cài đặt cục bộ ghi đè toàn cục) chạy này:

git config --global --add merge.ff false

Từ tài liệu :

merge.ff
Theo mặc định, git không tạo ra một cam kết hợp nhất bổ sung khi hợp nhất một cam kết là hậu duệ của cam kết hiện tại. Thay vào đó, đầu của chi nhánh hiện tại được chuyển tiếp nhanh. Khi được đặt thành false, biến này báo cho git tạo một cam kết hợp nhất bổ sung trong trường hợp đó (tương đương với việc đưa ra --no-fftùy chọn từ dòng lệnh). Khi được đặt thành chỉ, chỉ những phép hợp nhất chuyển tiếp nhanh như vậy mới được phép (tương đương với việc đưa ra --ff-onlytùy chọn từ dòng lệnh).


18
Lưu ý: merge.ffđã được giới thiệu trong Git 1.7.6. Nó không hiệu quả trong các phiên bản cũ hơn.
Chris Johnsen

2
Đối với những người sử dụng Git 1.7.6, đây là giải pháp tốt nhất và đơn giản nhất.
Ryan Lundy

22
Tôi đang sử dụng cái này cùng với một bí danhpuff = "pull --ff --ff-only"
stigi

11
Theres cũng (bây giờ, xem git-scm.com/docs/git-config ) tùy chọn pull.ff có thể được đặt thành chỉ , sẽ làm tương tự như bí danh.
jotomo

1
Cảm ơn bạn, @jotomo. Tính năng này có sẵn từ Git v2.0.0 (từ cam kết b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Eric Platon

14

Đọc chuỗi câu trả lời tôi đã kết thúc bằng hai tùy chọn sau

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Chỉ liên quan một cách lỏng lẻo tôi cũng thấy cài đặt này tránh được sự cố trong quá trình kéo

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config --global pull.rebase true # thông báo 'true' ở cuối dòng
zowers 5/12/19

Cảm ơn @zowers Tôi đã sửa lỗi này
bastian
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.