2014-09-20 19 views
6

Tôi hiểu rằng cách sửa đổi cam kết GIT cũ là sử dụng rebase --interactive, nhưng để hiểu rõ khái niệm, tôi muốn hiểu điều gì xảy ra khi tôi làmGIT commit --amend trong trạng thái HEAD tách rời

  • git checkout <commit>
  • thay đổi một cái gì đó trong một file
  • thêm các tập tin đã thay đổi chỉ số
  • và sau đó git commit . --amend

Khi tôi làm điều này, thay vì sửa đổi cam kết, nó phân nhánh một cam kết mới của PARENT của cùng một cam kết đó.

Đây có phải chỉ là cách GIT nói với tôi rằng tôi không thể sửa đổi cam kết đã có cam kết của trẻ em không?

Trả lời

15

Trong Git, khi cam kết được tạo, nó được đặt trong đá; bạn không thể thay đổi nó. Tất cả những gì bạn có thể làm là tạo một cam kết mới "giống như" nó (bằng cách sửa đổi nó, anh đào chọn nó, vv)

Tôi hiểu nhầm lẫn của bạn: "sửa đổi" là một chút nhầm lẫn và có phần gây hiểu lầm, vì nó gợi ý sửa đổi một cái gì đó tại chỗ. Trong Git, sửa đổi cam kết thực sự liên quan đến việc tạo một cam kết mới cam kết có cùng (các) phụ huynh làm cam kết ban đầu.

Như một ví dụ, chúng ta hãy giả định rằng, sau khi chạy git checkout B, bạn đang ở trong tình huống sau đây:

enter image description here

(. Bạn HEAD được tách ra, nhưng đó là bên cạnh điểm) hay không bạn thực hiện và thay đổi sân khấu, chạy git commit --amend sẽ đưa bạn vào tình trạng này:

enter image description here

Commit D có thể rất, rất giống với B; đặc biệt, nó có thể có chính xác cùng một bản vá, chính xác cùng một thông điệp cam kết như B, v.v. Tuy nhiên, (cam kết, tác giả) dấu thời gian thường sẽ khác nhau (unless you can amend a commit under a second!), có nghĩa là SHA-1 của D sẽ khác với B; và nếu hai cam kết không có cùng SHA, chúng không phải là cam kết tương tự.

Khi chúng ta nói B là một phụ huynh cam kết của C, chúng ta muốn nói cam kết tài liệu tham khảo C cam B bởi SHA nó. Tuy nhiên, cam kết C không có cách nào để biết bất cứ điều gì về SHA cam kết D, vì cam kết D đã được tạo sauC. Do đó, D không thể là phụ huynh của C. Đó là lý do tại sao cam kết D đi trên một ốp và không có bất kỳ hậu duệ.


Nếu bạn muốn hạ cánh trong tình trạng sau,

enter image description here

nơi B' thậm chí còn chỉ hơi khác nhau từ B, bạn nên sử dụng git rebase -i, không git commit --amend.

+1

Câu trả lời thú vị. Cảm ơn! Tôi hoàn toàn bỏ lỡ một thực tế rằng --amend sẽ luôn luôn chi nhánh của cha mẹ của HEAD. Bây giờ tôi nghĩ về nó nó có ý nghĩa hoàn hảo. – Chris

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