Magit chia hunk thành hai hunk


34

Có một câu hỏi về SO về việc tách những con chó săn bằng magit, và hai giải pháp được đưa ra là hoặc là giai đoạn khu vực (đánh dấu một khu vực, giai đoạn nhấn) hoặc để thu nhỏ / phát triển tất cả những con chó săn bằng cách sử dụng +& -. Đó không phải là những gì tôi theo đuổi.

Trong bộ đệm trạng thái của pháp sư, tôi muốn chia một khối thành hai khối, tại điểm hoặc ít nhất là tại các đường xung quanh điểm.

Biến cái này (xin lỗi định dạng khác biệt xấu của tôi)

@@ blah blah blah
- foo
+ bar
+ baz
+

Vào

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Khi điểm là trên thanh.

Động lực:

  • bazlà một tuyên bố gỡ lỗi, vì vậy tôi muốn loại bỏ nó khỏi cam kết của foo& barkhông loại bỏ nó.

  • barbazchỉ liên quan một phần, có nghĩa là những thay đổi của họ không nên trong cùng một cam kết.

  • barlà lớn và baznhỏ, làm cho việc phân chia hunk dễ dàng hơn nhiều so với chọnbar

  • Tương tự như điểm cuối cùng, giả sử một cam kết 20 dòng chứa một dòng duy nhất ở giữa không nên được dàn dựng. Sẽ dễ dàng hơn để phân chia & giai đoạn hai người trên và dưới bỏ qua người đứng giữa hơn là sử dụng khu vực.

  • Đôi khi ở trên có thể phát sinh khi trình bày khác biệt sẽ phân tách trước và sau của một cái gì đó đã được sửa đổi, và có một cái gì đó không có ích ở giữa. ví dụ

@@ line
- old_foo
+ random stuff
+ new foo

Không có gì trong pháp sư có thể làm điều này. Nó thậm chí còn hơn thế: Thiết kế của pháp sư làm cho điều này có thể không thể mã hóa mà không cần thiết kế lại trạng thái phép thuật rộng lớn.
Rémi

4
Cảm ơn, có ý nghĩa. Thật không may, điều tốt nhất tôi có thể nghĩ đến sẽ là một số tự động hóa xung quanh việc chọn tiến hoặc lùi từ điểm và sau đó dàn dựng. Cũng đáng chú ý (đối với những người chưa sử dụng tính năng này trước đây) rằng bạn có thể sử dụng khu vực này cho cả giai đoạn và giai đoạn. Ví dụ, bạn có thể tạo một đoạn lớn, sau đó chuyển sang phần được dàn dựng và bỏ qua một dòng ở giữa. Nhưng đã đồng ý với @MrBones rằng tùy chọn chia nhỏ sẽ dễ dàng hơn so với lựa chọn.
glucas

Thú vị, chọn 2 phân biệt khu vực không phụ thuộc. +1
Nsukami _

1
Cá nhân tôi sẽ tạo ra toàn bộ hunk, và sau đó bỏ qua tuyên bố gỡ lỗi. (Móc nối trước cam kết của tôi bắt được các tuyên bố gỡ lỗi được dàn dựng, vì vậy không có nguy cơ tôi phạm phải một.)
phils

1
Tôi không biết đủ về Magit để giúp đỡ, nhưng tôi chỉ muốn chỉ ra rằng chế độ khác biệt của Emacs có lệnh diff-split-hunkthực hiện điều đó. IOW yêu cầu của bạn là một cách để sử dụng diff-split-hunk(hoặc một cái gì đó tương đương) từ bộ đệm trạng thái magit.
Stefan

Câu trả lời:


17

Như đã đề cập trong các ý kiến ​​trên, Magit không hỗ trợ chia một khối thành nhiều khối ngoài những gì có thể bằng cách sử dụng git diff -U<n>. Đó là bởi vì Magit dựa vào lệnh Git đó để tạo ra các khác biệt. Điều đó sẽ không thay đổi, Magit sẽ luôn sử dụng các khác biệt mà nó nhận được từ Git.

. (Trên thực tế Magit không tước một số tiêu đề mà không phải là thực sự liên quan đến con người, nhưng không khôi phục chúng khi áp dụng thay đổi Nhưng tách một hunk hơn nữa so với những gì -U<n>hỗ trợ là một câu chuyện hoàn toàn khác nhau, nó sẽ dẫn xuống một cái hố thỏ - có một lý do tại sao Git không cho phép "những người nhỏ hơn", nó sẽ không thể áp dụng chúng).

Mặc dù Magit không hỗ trợ hiển thị các khối nhỏ hơn như được yêu cầu ở đây, nhưng nó hỗ trợ chỉ áp dụng các phần của một khối. Khi khu vực được kích hoạt trong khi dàn dựng, thì chỉ một phần của hunk được áp dụng.

Điều đó không giúp được gì nhiều khi phần không nên dàn dựng ở ngay giữa văn bản nên được dàn dựng. Như những người khác đã đề xuất, những gì bạn nên làm trong trường hợp này là giai đoạn toàn bộ hunk, và sau đó bỏ qua dòng mà bạn không muốn cam kết trong bước thứ hai.

Điều đó tất nhiên có thể được tự động. Cách duy nhất tôi có thể thấy trong đó điều này có thể được tự động hóa là "tạo ra hunk hiện tại ngoại trừ khu vực. Nhưng tôi có một số nghi ngờ về mức độ thường xuyên sẽ hữu ích và sợ rằng sẽ không dễ dàng thực hiện điều đó một cách mạnh mẽ Và vì vậy tôi hiện không có ý định thực hiện điều này.


47

Bạn có thể chia hunk với Magit.

Thay vì chỉ để con trỏ bên trong hunk, hãy chọn các dòng bạn muốn tạo từ hunk và nhấn s . Chỉ phần được chọn của hunk sẽ được dàn dựng, trong khi phần còn lại của hunk vẫn nằm trong khu vực không có sân khấu.

Bằng cách đó bạn chia nó thành hai. Tôi nghĩ rằng bạn có thể sử dụng cùng một cơ chế để di chuyển các bộ phận của chó săn vào thùng rác. Khi sử dụng k bạn sẽ chỉ thanh lọc một phần của hunk.


3
IMO, đây phải là câu trả lời được chấp nhận, vì nó đáp ứng yêu cầu (và tôi đã tìm thấy câu trả lời này một vài lần khi cố gắng nhớ cách thực hiện việc này).
chaseadamsio

2
Vâng, điều này nên được chấp nhận là câu trả lời!
copyninja

3

Nếu bạn muốn loại bỏ các phần của một hunk, hãy chọn các dòng trong hunk bạn muốn loại bỏ và nhấn x .

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.