2011-09-07 32 views
8

Khi tôi viết mã bằng cục bộ, đôi khi tôi cam kết mã chưa sạch, hoặc, với thông báo xấu là bản sửa đổi tạm thời.Có lệnh Git nào để kết hợp tất cả các cam kết xấu xí của chúng ta với nhau không?

Tuy nhiên, khi tôi muốn mã của tôi để hợp nhất với những người khác, tôi muốn chỉ ảnh chụp cuối cùng mà người kia có thể thấy, (ẩn các phiên bản mà trông xấu xí)

Ex. tôi ngã ba từ 0 đến kho lưu trữ địa phương của tôi, tôi thực hiện thay đổi và thử nghiệm và cam kết với mã ô uế

0-> 1-> 2-> 3> 4> 5> 6 (Final code)

khi những người khác kéo mã, liệu có thể làm cho người khác chỉ thấy trạng thái cuối cùng không? và không nhìn thấy cây từ 1..5

tôi muốn người dùng sẽ thấy như

0 -------------------> 6

Một cách tôi có thể nghĩ đến, là tạo một tệp vá, nhưng nó không đủ tốt nếu có một số tệp phải được xóa hoặc tạo.

+0

http://stackoverflow.com/questions/5308816/how-to-use-git-merge-squash – Gerry

Trả lời

-1

tôi sử dụng câu trả lời từ @ đánh dấu longair và @ charles-Baily để thực hiện công việc của tôi

Hãy nói tôi có chi nhánh ...

master : A --> B --> C 
feature : \-->D --> E --> F 

Cách thứ nhất, làm việc thư mục là chi nhánh 'tính năng'

git reset --soft <A-hash> 
git commit -m 

Chúng tôi sẽ không thấy bất kỳ cam kết nào trước đó tại tất cả, phải viết thông điệp mới cam kết

Cách thứ hai, thư mục làm việc là 'tính năng' chi nhánh

git rebase -i 

từ Editor, thay đổi từ chọn để (hoặc s cho ngắn) cho tất cả các cam kết ngoại trừ số tiền đầu tiên

pick 00bb6f9 D 
s 4a251d9 E 
s 6047df8 F 

Xong. Với cách này, nó sẽ hiển thị thông báo cam kết trước đó mà chúng ta có thể chỉnh sửa làm cam kết cuối cùng.

2

Có, sử dụng git rebase -i và bíp các cam kết. Kiểm tra this để biết thêm thông tin và một số ví dụ.

4

Bạn có thể sử dụng reset --soft để nén nhiều lần commit thành một cam kết sạch mới. Với chi nhánh tại các mã cuối cùng không có tổ chức thay đổi mà bạn có thể làm:

git reset --soft <sha1-of-0> 
git commit 

Khi git commit nhắc nhở, đưa ra một thông điệp rõ ràng cam kết mô tả những thay đổi hoàn toàn được giới thiệu.

2

Giả sử bạn chưa đẩy các cam kết của mình vào điều khiển từ xa thì có một số cách để thực hiện việc này.

Một lựa chọn là sử dụng

git rebase -i 

mang đến cho bạn những biên tập viên rebase tương tác. Sau đó, bạn có thể đánh dấu tất cả các cam kết ngoại trừ phần cuối cùng là 'squash'

3

Cách linh hoạt nhất để thực hiện việc này là thực hiện một lần rebase tương tác để cùng nhau sửa đổi hoặc sửa đổi các cam kết của bạn. Bạn cần phải cẩn thận không viết lại bất kỳ lịch sử nào đã được công khai, tuy nhiên. Ví dụ: nếu bạn đang làm việc trên chi nhánh master và bạn muốn viết lại và tuyến tính tất cả các cam kết không có trong origin/master (thường có nghĩa là công việc bạn chưa đẩy), bạn có thể làm:

git rebase -i origin/master 

Điều đó sẽ khởi chạy trình chỉnh sửa văn bản trong đó mỗi cam kết bạn có không có trong nguồn gốc/chính được hiển thị, từ cũ nhất đến mới nhất. Nếu bạn muốn kết hợp bất kỳ cam kết nào với lần commit trước, bạn chỉ có thể thay đổi phần đầu của dòng từ pick thành squash. Hoặc, nếu bạn muốn sửa đổi cam kết đó bằng cách nào đó, bạn có thể thay đổi pick thành edit.

Sử dụng tính năng rebase tương tác là cách linh hoạt nhất để thực hiện những gì bạn yêu cầu và đó là một công cụ hữu ích để bạn biết, nhưng trong trường hợp chính xác bạn mô tả, có thể là quá mức cần thiết. Trước tiên, hãy kiểm tra xem đầu ra của git status có sạch không, do đó bạn chắc chắn rằng khu vực dàn dựng của bạn đại diện cho cùng một trạng thái là HEAD.Sau đó, bạn có thể thực hiện "khôi phục cài đặt mềm" trở lại 0, đặt lại HEAD thành cam kết đó nhưng để nguyên cây và chỉ mục hoạt động của bạn (tức là khu vực dàn dựng) còn nguyên vẹn. Nếu sau đó bạn thực hiện cam kết, chỉ mục của bạn sẽ được sử dụng để tạo một cam kết mới có cùng trạng thái là 6, nhưng với 0 làm cha mẹ. tức là

git status # Check that your status is clean 
git reset --soft 0 
git commit -m 'Work that is totally flawless' 
Các vấn đề liên quan