Làm cách nào để hủy tương tác một đoạn mã cụ thể trong git?


106

Trong git, nếu tôi có một vài nhóm từ cùng một tệp được sắp xếp trong chỉ mục của mình, làm cách nào để tôi có thể bỏ phân loại một cách tương tác một trong số chúng?

Có cách nào thay thế cho việc hủy sắp xếp toàn bộ tệp rồi sắp xếp lại các phần mà tôi muốn giữ lại hoặc hoàn tác theo cách thủ công các thay đổi đối với bản sao đang hoạt động rồi thêm tương tác các thay đổi đã hoàn tác đó không?

Câu trả lời:


135

Cố gắng git reset --patch filename; điều này sẽ làm ngược lại git add --patch, theo tài liệu . Dạng ngắn -pcũng hoạt động cho cả hai lệnh.


Tôi không nghĩ rằng phiên bản của tôi có nó (đó là 1.6.3.3), nhưng đây có vẻ như là câu trả lời chính xác.
Andrew Grimm

2
Trong trường hợp đó (và giả sử rằng bạn không thể nâng cấp vì lý do nào đó), tôi khuyên bạn nên sử dụng git stash save --keep-indexđể lưu và đặt lại các thay đổi bản sao làm việc hiện tại của mình. Sau đó, bạn có thể đặt lại tệp của mình và hoàn tác các thay đổi bạn không muốn. Nếu bạn sao chép tệp vào một vị trí tạm thời nào đó trước tiên, bạn có thể sử dụng diffđể lưu các thay đổi mà bạn hoàn tác. Sau đó, bạn có thể thêm lại tệp (không cần thêm tương tác vì bạn đã loại bỏ các thay đổi khác mà bạn không quan tâm). Sử dụng git stash popđể lấy lại các thay đổi cũ và diffáp dụng các thay đổi bạn đã hoàn tác. Khá cồng kềnh ... :-(
Aasmund Eldhuset

The short form -p also works for both commands... Ý bạn là git reset -p filename?
Nawaz

1
@Nawaz: Đúng vậy - git add -p filenamecác giai đoạn thay đổi có chọn lọc từ tệp đó và git reset -p filenameloại bỏ các thay đổi có chọn lọc. Ngoài ra còn có git checkout -p -- filename, cho phép bạn loại bỏ các thay đổi có chọn lọc khỏi một tệp. Cảnh báo: mỗi cái addresetcó thể được sử dụng để hoàn tác cái kia trong số hai cái kia, nhưng nếu bạn sử dụng biểu mẫu này checkoutđể hủy một thay đổi, bạn không thể lấy lại nó.
Aasmund Eldhuset

2

git guicó giao diện người dùng phù hợp để phân chia giai đoạn tương tác hoặc loại bỏ các khối hoặc dòng. Có những ứng dụng khách GUI đẹp hơn / tốt hơn, nhưng git guinhẹ, tích hợp sẵn và đa nền tảng (lin, win, mac).

https://git-scm.com/docs/git-gui

Đơn giản chỉ cần nhấp chuột phải vào một phần nhỏ để chuyển giai đoạn / loại bỏ. Đối với đường thẳng, trước tiên hãy đánh dấu các đường đó, sau đó nhấp chuột phải.


-1

GitX có một giao diện người dùng đẹp để loại bỏ các phần của tệp: nhập mô tả hình ảnh ở đây

Ứng dụng khách chính thức đã không được duy trì trong một thời gian, nhưng một sự thay đổi tại GitHub với nhiều tính năng hơn đã phổ biến trong một số vòng kết nối. ( bài blog về nó )


1
Đối với người dùng Windows ngoài kia, Git Extensions có giao diện người dùng đẹp mắt tương tự.
Aasmund Eldhuset

4
Vì vậy, không được xây dựng trong git gui, ngoại trừ tôi không chắc chắn tôi muốn sử dụng từ "đẹp";)
MatrixFrog

1
SourceTree (Windows + Mac) cũng có giao diện người dùng đẹp cho việc này.
chrnola

Tôi nên đề cập đến các ứng dụng khách Git đồ họa gần đây hơn - GitKraken rất đẹp và hỗ trợ điều này (mặc dù bây giờ nó đi kèm với một khoản phí khổng lồ cho việc sử dụng thương mại). GitHub's GitHub Desktop miễn phí, đẹp mắt và hỗ trợ dễ dàng sắp xếp và loại bỏ các nhóm. GitKraken và GitHub Desktop đều là nền tảng đa nền tảng, nhưng không phải là mã nguồn mở.
jdgregson
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.