2013-07-03 25 views
5

Giả sử Im làm việc trên một đối tượng địa lý, trong một chi nhánh có tên là foo_baz.Squash cam kết trên tổng thể nhưng tách biệt các cam kết trên chi nhánh tính năng?

Tôi cam kết nhiều lần khi tôi làm việc trên đối tượng địa lý.

Tôi định kỳ đẩy foo_baz, một chi nhánh theo dõi từ xa, đến một repo từ xa. IE origin/foo_baz.

Tôi tiến tới điểm tôi muốn hợp nhất tất cả các cam kết từ foo_baz thành master và đẩy tới origin/master. Đây là câu hỏi:

Tôi có thể hợp nhất foo_baz vào master sao cho tất cả các cam kết vẫn tách biệt trong lịch sử foo_baz, nhưng trong lịch sử của master, tất cả đều bị đè nén?

Edit:

tôi là một chút của một người mới bắt đầu git, vì vậy hãy tha thứ cho tôi nếu có điều gì đó hoàn toàn rõ ràng rằng tôi đang thiếu. Tôi khám phá trên web nhưng không thể tìm thấy câu trả lời trực tiếp cho câu hỏi của tôi.

Trả lời

5

Bạn thực sự có thể đang tìm kiếm --squash (như trong các câu trả lời khác), nhưng bạn có thể tìm kiếm --no-ff thay thế.

Đây là sự khác biệt giữa hai loại. Giả sử bạn bắt đầu với hai cam kết:

A --- B    <-- branch "master", when you start 

và sau đó làm cho hai thêm về chi nhánh mới của bạn foo_baz:

A --- B    <-- master 
     \ 
      C --- D  <-- foo_baz 

Bây giờ (một lần trở lại trên master), bạn có hai lựa chọn này (số những người khác). Bạn có thể git merge --squash foo_baz && git commit mà sẽ cung cấp cho bạn như sau:

A --- B ----------- E <-- master 
     \ 
      C --- D  <-- foo_baz 

hoặc bạn có thể git merge --no-ff:

A --- B ----------- E <-- "master" after merge --no-ff 
     \  /
      C --- D  <-- foo_baz 

Cả hai cung cấp cho bạn một mới cam kết E -in trường hợp đầu tiên, từ riêng git commit lệnh nhưng cái đầu tiên ngăn chặn hành động multi-parent-ing, do đó, cuối cùng, khi bạn nhìn lại một năm này từ bây giờ, có vẻ như bạn vừa sao chép tất cả các thay đổi từ nhánh. Cây (tất cả các tệp bạn nhận được khi bạn git checkout nhánh) sẽ giống nhau ở cả hai DE (trong trường hợp cụ thể này, khi không có thay đổi đối với B trên master trước hành động hợp nhất), nhưng chúng ' tái cam kết khác nhau.

Sự khác biệt từ một thẳng git merge là sau này sẽ thường tạo ra một "tua", trông như thế này:

A --- B 
     \ 
      C --- D  <-- foo_baz, master 

nơi dòng góc cạnh có thể thẳng ra, đem lại cho bạn một lịch sử mà cả hai các nhánh trông giống hệt nhau.

0

Tôi nghĩ rằng những gì bạn muốn là một cái gì đó như thế này:

git merge --squash foo_baz 
git commit 
0

Tôi nghĩ rằng bạn đang tìm kiếm --squash cờ.

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