Làm cách nào tôi có thể kết hợp hai cam kết thành một cam kết?


99

Tôi có một nhánh 'dự án đầu tiên' với 2 cam kết. Tôi muốn loại bỏ các cam kết này và làm cho chúng xuất hiện dưới dạng một cam kết duy nhất.

Lệnh git merge --squashnghe có vẻ đầy hứa hẹn, nhưng khi tôi chạy git merge --squashthiết bị đầu cuối của mình, chỉ xuất hiện các tùy chọn cho lệnh. Lệnh chính xác là gì?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

Tôi không nghĩ đó là lệnh đúng. Ngoài ra, tôi nghi ngờ rằng bạn thậm chí có thể thay đổi cam kết như vậy.
BSull

Không, bạn có thể thay đổi nhiều cam kết thành một cam kết: git-scm.com/book/en/Git-Tools-Rewriting-History Câu hỏi của tôi chỉ là về lệnh cụ thể cho nó.
Don P

@BSull Bạn hoàn toàn có thể thay đổi cam kết theo bất kỳ cách nào bạn muốn. Chúng hoàn toàn có thể chỉnh sửa theo nghĩa đen bất kỳ lúc nào. Nếu bạn đang chia sẻ mã với người khác, làm như vậy sẽ viết lại lịch sử của bạn và bạn sẽ làm việc hiệu quả với một nhánh khác với mọi người khác.
Mudgar

Điều này không bao giờ bị lừa. Trên thực tế, cái khác lẽ ra phải được đóng lại vì quá rộng. Câu hỏi khác mà câu hỏi này được đánh dấu là một bản dupe là phức tạp không cần thiết vì nó liên quan đến việc từ bỏ một cơ sở lại trước đó.
Evan Carroll

Câu trả lời:


134

Bạn muốn git rebase -ithực hiện một rebase tương tác .

Nếu bạn hiện đang sử dụng "cam kết 1" và cam kết bạn muốn hợp nhất, "cam kết 2", là cam kết trước đó, bạn có thể chạy git rebase -i HEAD~2, điều này sẽ tạo ra một trình soạn thảo liệt kê tất cả các cam kết mà rebase sẽ duyệt qua. Bạn sẽ thấy hai dòng bắt đầu bằng "pick". Để tiếp tục bóp méo, hãy thay đổi từ đầu tiên của dòng thứ hai từ "chọn" thành "bí". Sau đó, lưu tệp của bạn và thoát. Git sẽ đưa cam kết đầu tiên của bạn thành cam kết cuối cùng thứ hai.

Lưu ý rằng quá trình này viết lại lịch sử của chi nhánh của bạn. Nếu bạn đang đẩy mã của mình ở đâu đó, bạn sẽ phải git push -fvà bất kỳ ai chia sẻ mã của bạn sẽ phải nhảy qua một số vòng để kéo các thay đổi của bạn.

Lưu ý rằng nếu hai cam kết được đề cập không phải là hai cam kết cuối cùng trên nhánh, thì quá trình sẽ hơi khác một chút.


2
Làm thế nào để làm gì Then write your file, and quit? Tôi đang sử dụng Android Studio Terminal, chính bảng điều khiển git Hoặc thậm chí đã mở bảng điều khiển git bằng phần mềm SourceTree. Nhưng làm thế nào để tiết kiệm và thoát khỏi?
Dr.jacky

1
Làm thế nào để kết hợp 2 cam kết không phải là hai cam kết cuối cùng trên nhánh?
Weishi Zeng

1
@meagar Tôi nghĩ nó có ý nghĩa ... nếu bạn kiểm tra vấn đề này (một bản sao của vấn đề này), 'hướng' thu nhỏ đã tạo ra sự khác biệt lớn và là gốc rễ của toàn bộ vấn đề (xem nhận xét đầu tiên với khoảng 200 lượt ủng hộ về ' đè bẹp một cách sai lầm ') - stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWood Bạn đang đọc nhầm câu trả lời. Cách đầu tiên sai đơn giản , không khác . Bạn chỉ có thể xoay ngược trở lại, không có ý nghĩa gì khi nghĩ đến việc bóp nghẹt một cam kết cũ hơn thành một cam kết mới hơn, nhưng nếu bạn có thể thì đó cũng sẽ là thao tác tương tự.
Mudgar

1
Tôi hiểu lên để "thay đổi từ đầu tiên của dòng thứ hai" - dòng thứ hai của những gì?
Andrew Torr,

70

Phiên bản đơn giản lười biếng cho những người hay quên như tôi:

git rebase -i HEAD~3 hoặc tuy nhiên nhiều cam kết thay vì 3.

Biến cái này

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

vào cái này

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

và làm một số hành động mà bạn nhấn escsau đó enterđể lưu các thay đổi. [1]

Khi màn hình tiếp theo xuất hiện, hãy loại bỏ # dòng [2] rác đó và tạo một thông báo cam kết mới hoặc một cái gì đó và thực hiện escape enterhành động tương tự . [1]

Chà, bạn có ít cam kết hơn. Hoặc bạn vừa phá vỡ mọi thứ.


[1] - hoặc bất cứ thứ gì hoạt động với cấu hình git của bạn. Đây chỉ là một trình tự hiệu quả với thiết lập của tôi.

[2] - bạn sẽ thấy một số nội dung tương tự # this is your n'th commitmột vài lần, với các cam kết ban đầu của bạn ngay bên dưới thông báo này. Bạn muốn xóa những dòng này và tạo một thông báo cam kết để phản ánh ý định của n cam kết mà bạn đang kết hợp thành 1.


Giải pháp rất ngắn gọn - cảm ơn bạn. Có thể hữu ích để phác thảo mà sđược sử dụng ở đây là viết tắt của bí. Để sử dụng cam kết, nhưng kết hợp với cam kết trước đó
UrbanConor

Nếu bạn vừa 2cam kết vừa muốn kết hợp cùng một 2cam kết, bạn sẽ cần chạy git reset --soft HEAD~git commit --amend.
giám sát

22
  1. Kiểm tra chi nhánh của bạn và đếm số lượng tất cả các cam kết của bạn.
  2. Mở git bash và viết: git rebase -i HEAD~<quantity of your commits>(tức là git rebase -i HEAD~5)
  3. Trong txttệp đã mở, thay đổi picktừ khóa thành squashcho tất cả các cam kết, ngoại trừ cam kết đầu tiên (nằm trên cùng). Đối với đầu tiên, hãy thay đổi nó thành reword(có nghĩa là bạn sẽ cung cấp một nhận xét mới cho cam kết này trong bước tiếp theo) và nhấp vào LƯU! Nếu trong vim, nhấn escrồi lưu bằng cách nhập wq!và nhấn enter.
  4. Cung cấp Bình luận.
  5. Mở Git và thực hiện "Tìm nạp tất cả" để xem các thay đổi mới.

Làm xong


Người đầu tiên cho tôi biết cách sử dụng trong vim. Cảm ơn nhiều
Hồ Lương
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.