Làm cách nào để kiểm tra hợp nhất mà không thực sự hợp nhất trước


166

Có cách nào mô phỏng git mergegiữa hai nhánh, nhánh làm việc hiện tại và chủ, nhưng không thực hiện bất kỳ thay đổi nào không?

Tôi thường có mâu thuẫn khi phải làm a git merge. Có cách nào mô phỏng hợp nhất trước không?



Câu trả lời:


132

Tôi không nghĩ có một cách mô phỏng những gì sẽ xảy ra cho đến khi bạn thử hợp nhất. Tuy nhiên, nếu bạn chắc chắn rằng đầu ra git statustrống trước khi bạn thực hiện hợp nhất, sẽ khá an toàn nếu chỉ tiếp tục và thử nó. Nếu bạn gặp xung đột, bạn có thể ngay lập tức quay lại trạng thái trước đây:

git reset --merge

Kể từ git 1.7.4, bạn cũng có thể hủy bỏ hợp nhất bằng cách thực hiện:

git merge --abort

(Như thông báo cam kết đã thêm tùy chọn đó giải thích , điều này đã được thêm vào để thống nhất git rebase --abortvà v.v.)


4
Câu trả lời của @ Amber là trả lời chính xác những gì đang được hỏi 'làm thế nào để mô phỏng sự hợp nhất'. --no-committheo quan điểm của tôi thì việc sử dụng dễ dàng hơn nhiều
samirahmed

14
@samirahmed: @Amber trả lời câu hỏi theo nghĩa đen hơn, chắc chắn, mặc dù với việc --no-commitbạn vẫn thay đổi chỉ mục và cây làm việc, điều này không chính xác "mà không thực hiện bất kỳ thay đổi nào" :) Quan điểm của tôi là khi mọi người hỏi loại này câu hỏi, nói chung là vì họ không biết rằng cách tốt nhất để xem việc hợp nhất sẽ diễn ra như thế nào là thử kết hợp , thường là vì họ không nhận thức được việc trở lại trạng thái trước đây dễ dàng như thế nào nếu có vấn đề
Đánh dấu Longair

2
Tôi không biết nếu điều này được thêm vào trong phiên bản mới hơn của git, nhưng trong tài liệu (1.8.4), nó ghi " git merge --aborttương đương với git reset --mergekhi MERGE_HEADcó mặt", vì vậy, bất cứ điều gì dễ nhớ hơn :)
Samuel Meacham

@SamuelMeacham: cảm ơn bạn đã chỉ ra điều đó - nó đã được giới thiệu trong 1.7.4. Tôi đã cập nhật câu trả lời với điều đó. Cảm ơn!
Đánh dấu Longair

Đề xuất này không làm gì cho tôi, trên git 1.9.4.
djangofan

137

Bạn có thể sử dụng git merge --no-commitđể ngăn việc hợp nhất thực sự được cam kết và nếu bạn không thích cách hợp nhất diễn ra, chỉ cần đặt lại về đầu ban đầu.

Nếu bạn chắc chắn không muốn hoàn tất việc hợp nhất, ngay cả khi đó là một chuyển tiếp nhanh (và do đó không có xung đột, theo định nghĩa), bạn cũng có thể thêm --no-ffvào.


Tôi không nghĩ rằng nó git merge --aborttồn tại - có lẽ bạn có nghĩa là git reset --merge?
Đánh dấu Longair

Nah, tôi chỉ quên rằng không giống như rebasekhông có một --abortcho git merge.
Amber

7
Tôi cũng sẽ ném vào --no-ff. Để giữ một hợp nhất ff xảy ra.
Andy

1
@ Andy --no-fflà bắt buộc khá nhiều ở đây, vì --no-commitkhông dừng những thay đổi nhanh chóng.
jackr

1
@Anant Anand Gupta - đây là một mẹo hay nhưng nên là: git config --global alias.tm "merge --no-commit --no-ff"
pasx 17/10/19

109

Nếu tôi muốn so sánh các thay đổi trên một nhánh chủ đề với chủ, tôi thấy cách dễ nhất và an toàn nhất để thực hiện như sau:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Sau khi hoàn thành hợp nhất, dễ dàng thấy sự thay đổi hợp nhất từ ​​chủ

git diff master

Khi hoàn tất, chỉ cần xóa nhánh Trial_merge

git checkout master
git branch -D trial_merge

Bằng cách này, nhánh chủ không bao giờ thay đổi.


4
Bạn cũng có thể làm git checkout --detachvà kiểm tra bất cứ điều gì bạn muốn. Sau đó, nếu bạn muốn giữ những thay đổi của mình, hãy làm git checkout -b new_branch. Và nếu bạn muốn loại bỏ các thay đổi của mình, hãy kiểm tra bất kỳ chi nhánh nào bạn muốn ( git checkout master).
Shaya Toqraee

Nếu topic_branchlà rất lớn (có lẽ là trường hợp nếu bạn ở câu hỏi này ở vị trí đầu tiên) thì diff masterđầu ra có thể quá lớn đối với bạn để nhãn cầu nếu hợp nhất sẽ gây ra xung đột.
Lưỡi liềm tươi

Tôi chắc chắn thích điều này rất nhiều ... an toàn và đơn giản.
leo

4

Tôi sử dụng :

git merge --ff-only

theo tài liệu :

Từ chối hợp nhất và thoát với trạng thái khác không trừ khi CHÍNH hiện tại đã được cập nhật hoặc hợp nhất có thể được giải quyết dưới dạng chuyển tiếp nhanh.

Nó không thực sự là một mô phỏng vì sẽ có một sự hợp nhất nhanh chóng trong trường hợp không có xung đột giữa hai nhánh. Nhưng trong trường hợp có xung đột, bạn sẽ được thông báo và sẽ không có gì xảy ra.


4

git merge --abortGần đây tôi đã có thể sử dụng . Tuy nhiên, điều này chỉ có thể được sử dụng nếu có xung đột hợp nhất. Nếu bạn chắc chắn rằng bạn sẽ không muốn cam kết, thì hãy sử dụng các phương pháp được đề cập khác ở trên.


1
Những phương pháp khác được đề cập ở trên? Họ đều đề cập đến git merge --abort. Bạn nên chứng minh câu trả lời của mình trong tương lai bằng cách chỉ định ai đã viết câu trả lời mà bạn đang đề cập.
Michael Fulton

3

Tại sao không chỉ tạo một nhánh bỏ đi (git checkout -b) và thực hiện kiểm tra hợp nhất ở đó?


1
Những gì bạn đề xuất thực sự là câu trả lời của Ian được thể hiện một cách khó khăn :)
tzot 22/07/18

0

Tôi không biết chính xác nếu đó là trường hợp của bạn , nhưng câu hỏi của bạn nhớ tôi rằng đôi khi tôi bắt đầu một tính năng, tôi cam kết qua nhiều ngày và tôi hợp nhất sự phát triển trên đó nhiều lần.

Vào thời điểm này, tôi mất quyền kiểm soát các tệp chính xác mà tôi đã thay đổi và tôi sẽ chỉ biết điều đó khi tính năng của tôi bị đóng và mã của tôi sẽ phát triển.

Trong trường hợp này, một cách tốt để biết những sửa đổi bạn đã làm (không phải từ các hợp nhất) là sử dụng Sourcetree.

Bạn phải nhấp bằng nút bên phải trên nhánh cơ sở và chọn Diff Against Current:

Tính năng của Sourcetree để biết sự khác biệt giữa hai nhánh

Sau đó sourcetree sẽ hiển thị cho bạn tất cả các sửa đổi sẽ được hợp nhất nếu bạn hợp nhất chi nhánh của bạn thành chi nhánh cơ sở.

Các kết quả

Tất nhiên, nó sẽ không cho bạn thấy các xung đột, nhưng nó là một công cụ hữu ích trong việc hợp nhấ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.