2011-12-27 41 views
234

Có thể thực hiện "hợp nhất git", nhưng không có cam kết?git hợp nhất mà không cần cam kết tự động

"người đàn ông git merge" nói này:

With --no-commit perform the merge but pretend the merge failed and do not autocommit, 
to give the user a chance to inspect and further tweak the merge result before 
committing. 

Nhưng khi tôi cố gắng sử dụng git hợp nhất với --no-cam kết nó vẫn tự động cam kết. Dưới đây là những gì tôi đã làm:

$> ~/git/testrepo$ git checkout master 
Switched to branch 'master' 

$> ~/git/testrepo$ git branch 
* master 
    v1.0 

$> ~/git/testrepo$ git merge --no-commit v1.0 
Updating c0c9fd2..18fa02c 
Fast-forward 
file1 | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

$> ~/git/testrepo$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

"git log" tiếp theo cho thấy tất cả các cam kết từ nhánh v1.0 được hợp nhất thành chính.

Trả lời

385

Note đầu ra trong khi làm việc hợp nhất - đó là nói Fast Forward

Trong những tình huống như vậy, bạn muốn làm:

git merge v1.0 --no-commit --no-ff 
+3

nếu có một sự nhầm lẫn. – Michelle

+14

@PineappleUndertheSea Tiền đạo nhanh không bao giờ gây xung đột. Trong trường hợp hợp nhất "thực" mà không có chuyển tiếp nhanh thì công tắc '--no-commit' chỉ có hiệu lực nếu không có xung đột xảy ra, trong trường hợp xung đột git sẽ không bao giờ tự động cam kết. – gronostaj

+17

FYI: Nếu bạn muốn hợp nhất các thay đổi và sau đó cam kết _as nếu bạn đã nhập thủ công tất cả các thay đổi bạn đã hợp nhất in_ (trái ngược với kết hợp truyền thống), bạn cần chạy 'rm.git/MERGE_HEAD' sau đó, sẽ buộc git quên rằng hợp nhất đã xảy ra. – Jonn

32

bạn hiểu sai ý nghĩa của việc hợp nhất tại đây, --không cam kết ngăn không cho COMMGE COMMIT xảy ra và điều đó chỉ xảy ra khi bạn hợp nhất hai lịch sử nhánh khác nhau; trong ví dụ của bạn không phải là trường hợp vì git chỉ ra rằng đó là một sự hợp nhất "chuyển tiếp nhanh" và sau đó git chỉ áp dụng các cam kết đã có trên nhánh liên tiếp.

+10

Điều đó sẽ không (imo) nhất thiết phải làm sáng tỏ sự nhầm lẫn; Tôi nghĩ rằng đây là một (tương đối hiếm) thời gian các tài liệu thực sự rõ ràng: 'git help merge' =>" Với '--no-commit' thực hiện hợp nhất nhưng giả vờ hợp nhất không thành công và không tự động, để cung cấp cho người dùng cơ hội kiểm tra và tinh chỉnh thêm kết quả hợp nhất trước khi cam kết. " Chìa khóa của khóa học là sử dụng nó kết hợp với '--no-ff' – michael

+3

... có thể sẽ ít khó hiểu hơn để phá vỡ từ thuật ngữ nghiêm ngặt và mô tả nó theo cách này:" git merge "mà không tiến nhanh không có cam kết hợp nhất vì thực sự không có sự hợp nhất nào cả. Đây là thực tế, tình huống lý tưởng: tiền đạo nhanh là một điều tốt, và không có thêm "cam kết hợp nhất" làm cho Sense. Đây là hành vi mặc định tốt và không nên bị tắt. (Theo cách thích hợp, một chuyển tiếp nhanh là một loại hợp nhất, nhưng nó không phải là một "hợp nhất đúng".) – michael

+3

nó liên quan đến các chính sách của dự án, trong một số trường hợp rất hữu ích để có/ép buộc thêm "hợp nhất cam kết "ngay cả khi đó là một ff vì bạn cần đánh dấu sự bao gồm của đối tượng địa lý vào nhánh chính. –

12

Nếu bạn chỉ muốn cam kết tất cả các thay đổi trong một cam kết như thể bạn đã nhập chính mình, --squash cũng sẽ làm như vậy

$ git merge --squash v1.0 
$ git commit 
+0

Đây có phải là hiệu ứng tương tự như 'git merge v1.0 --no-commit --no-ff' – jpierson

+0

Không, hiệu ứng khác nhau. Squash tạo một cam kết mới với một băm mới. Nó kết hợp tất cả các cam kết trong một chi nhánh thành một cam kết cho việc hợp nhất. –

7

Tôi thích cách này vì vậy tôi không cần phải nhớ bất kỳ thông số hiếm nào.

git merge branch_name 

Sau đó nó sẽ nói chi nhánh của bạn đang ở phía trước bởi # cam kết, bây giờ bạn có thể bật những cam kết tắt và đặt chúng vào những thay đổi làm việc với những điều sau:

git reset @~# 

Ví dụ, nếu sau khi hợp nhất nó là 1 cam kết trước, sử dụng:

git reset @~1 
Các vấn đề liên quan