2013-06-27 31 views
19

Một quy trình phát triển chung cho chúng tôi là thanh toán chi nhánh b, cam kết một bó với nó, sau đó squash tất cả những cam kết thành một (vẫn còn trên b).Git squash tất cả các cam kết trong chi nhánh mà không xung đột

Tuy nhiên, trong quá trình rebase -i để đè bẹp tất cả các cam kết, thường có xung đột ở nhiều bước.

tôi về cơ bản muốn thay đổi các chi nhánh vào một cam kết rằng đại diện cho tình trạng của kho tại thời điểm trận chung kết cam kết trên b

tôi đã thực hiện một số tìm kiếm nhưng tôi đã không tìm thấy chính xác những gì Tôi đang tìm kiếm. Tôi không muốn merge --squash vì chúng tôi muốn kiểm tra chi nhánh tính năng bị đè bẹp trước khi hợp nhất.

+0

thể trùng lặp của [Trong git, sự khác biệt giữa hợp nhất --squash và rebase là gì?] (http://stackoverflow.com/questions/2427238/in-git-what-is-the-difference-between-merge-squash- and-reba se) –

+0

Từ câu hỏi đó - Tôi không muốn 'G' ở trong' ổn định', tôi muốn nó vẫn ở trên nhánh tính năng. Không chắc chắn nếu tôi đang thiếu một cái gì đó –

+0

Bạn có thể không chỉ anh đào chọn 'G' sau đó? –

Trả lời

40

Nếu bạn không cần thông tin cam kết, thì bạn có thể thực hiện cài đặt lại mềm. Sau đó, các tệp vẫn giữ nguyên và khi bạn cam kết, cam kết này sẽ nằm trên đầu trang của cam kết mà bạn đã đặt lại.

Để tìm cam kết thiết lập lại:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM 

Sau đó

git reset --soft COMMIT_HASH 

Sau đó lại thủ các cam kết, có lẽ:

git commit -am 'This is the new re-created one commit' 
+0

thông minh! Tôi thích nó –

+0

Điều này thật tuyệt vời. –

5

Đây là simlar để câu trả lời từ Rasmus nhưng được chia nhỏ thành ba bước nên luôn hoạt động:

$ git merge feature1 
$ git reset --soft [email protected]{1} 
$ git commit -c feature1 

Giải thích:

  1. hợp nhất và giải quyết xung đột
  2. giữ các thay đổi dàn dựng nhưng thiết lập lại để đầu cũ
  3. cam kết tất cả thay đổi sử dụng cam kết thông báo và tác giả từ chi nhánh tính năng mới nhất cam kết
Các vấn đề liên quan