2010-08-24 28 views
6

Tôi đã sáp nhập một chi nhánh tổng thể từ kho của một người bạn vào thư mục làm việc của tôi vào branch_a sử dụng:Git: Cách đặt lại sau khi hợp nhất?

git pull my_friend master 

tôi đã phát hiện ra rằng phiên bản sáp nhập có lỗi. Để tiếp tục phát triển, tôi muốn hoàn nguyên về cam kết cuối cùng trước khi hợp nhất.
tôi đã cố gắng:

git reset --hard HEAD 

Nhưng điều đó mang lại cho tôi trở lại nhà nước ngay sau khi hợp nhất. (Không kéo lệnh cam kết ?!)
Tôi cũng đã cố gắng:

git revert HEAD 

nhưng nhận được lỗi sau:

fatal: Commit 2d72d8f367b987d8c16f5cb1a543a6886acdcf83 is a merge but no -m option was given.

Tôi nên làm gì?

+0

Tôi đã thay đổi 'hoàn nguyên' thành 'đặt lại' trong tiêu đề của bạn, vì đặt lại là những gì bạn đang cố gắng đạt được. –

Trả lời

23

HEAD đề cập đến cam kết hiện tại (thường là mẹo của chi nhánh hiện đã được kiểm tra). Bạn đã cam kết hợp nhất của mình, vì vậy HEAD đang trỏ đến cam kết hợp nhất. Nếu bạn muốn quay lại cam kết trước khi sử dụng, hãy sử dụng:

git reset --hard HEAD^ 

^ có nghĩa là "cha mẹ đầu tiên của"; cho một cam kết thường xuyên đó là cha mẹ duy nhất, và cho một hợp nhất cam kết đó là cam kết bạn đã kiểm tra khi bạn sáp nhập (tức là các tip trước của chi nhánh bạn sáp nhập vào). Và tất nhiên, nếu bạn thực sự bị mất, chỉ cần mở gitk và sao chép/dán SHA1 của cam kết bạn muốn đặt lại thành (git reset --hard SHA1) hoặc chỉ cần nhấp chuột phải vào nó và đặt lại trong gitk.

Bằng cách này, revert không có nghĩa là bạn nghĩ gì (có vẻ như bạn đang sử dụng nó theo cách svn, có thể? Nhưng tôi chưa từng sử dụng svn). git revert được sử dụng để tạo ra một cam kết hủy bỏ (reverts) một cam kết trước đó, bằng cách áp dụng các đảo ngược khác. Bạn sử dụng nó khi bạn muốn hoàn tác một cam kết trước đó đã được xuất bản.

+0

Đối với những người không muốn thiết lập lại cứng, như @ Jefromi nói, sử dụng 'git revert' để" hoàn tác "commit cuối cùng, để lại một lịch sử của cả hai sự kiện. Để biết thêm thông tin về 'git revert', hãy xem: [câu trả lời này] (http://stackoverflow.com/a/5971281/1185053) –

2

Sau khi kéo, HEAD đã được chuyển sang cam kết mới nhất, đó là cam kết hợp nhất đưa hai nhánh lại với nhau, chứ không phải cam kết mà bạn đã làm việc lần cuối. Vì vậy, đây là lý do tại sao reset HEAD sẽ không thay đổi bất cứ điều gì.

revert HEAD không phải là những gì bạn muốn làm, vì đó là cố gắng tạo một cam kết mới hoàn nguyên các thay đổi của cam kết hợp nhất. (Đây là lý do tại sao bạn thấy một lỗi, bạn không thể trở lại một hợp nhất cam kết mà không nói cho git nào trong hai cha mẹ cam kết mà bạn muốn quay trở lại.)

Tôi nghĩ rằng những gì bạn muốn là:

git reset [--hard] HEAD^ 

sẽ đặt lại thành cam kết trước cam kết hợp nhất.

2

does pull command commit?

Vâng, đúng vậy. Pull là một trình bao bọc trên fetchmerge.Nếu bạn muốn xem các thay đổi của người khác trước khi hợp nhất, bạn chỉ có thể fetch

Các vấn đề liên quan