git add --interactive "Thư mục đã chỉnh sửa của bạn không áp dụng"


86

Tôi đang cố gắng sử dụng git add --interactiveđể thêm có chọn lọc một số thay đổi vào chỉ mục của mình, nhưng tôi liên tục nhận được thông báo "Thư mục đã chỉnh sửa của bạn không áp dụng. Chỉnh sửa lại ...". Tôi nhận được thông báo này ngay cả khi tôi chọn tùy chọn e và ngay lập tức lưu / đóng trình chỉnh sửa của tôi. Nói cách khác, không chỉnh sửa chút nào, bản vá sẽ không áp dụng.

Đây là ví dụ chính xác mà tôi đang sử dụng (Tôi đang cố gắng tập hợp một bản demo nhỏ):

Tệp gốc:

first change
second change off branch
third change off branch
second change
third change
fourth change

Tập tin mới:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

Tôi đang cố gắng chỉ ra cách sử dụng git add --interactiveđể chỉ thêm dòng "sửa lỗi 1" vào chỉ mục. Chạy add tương tác trên tệp, tôi chọn chế độ vá. Nó giới thiệu cho tôi

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

Tôi trả lời bằng phân tách, theo sau là "không" để áp dụng phần đầu tiên. Khúc thứ hai, tôi cố gắng chỉnh sửa. Ban đầu tôi đã thử xóa dòng dưới cùng - điều đó không hoạt động. Để yên hoàn toàn cũng không có tác dụng gì, và tôi không biết tại sao.


Một điều tốt cần đảm bảo ở đây là bạn không thêm -'s ở đầu các dòng không tồn tại trong tệp để bắt đầu; nó là một khác biệt và nó không thể xóa các dòng chưa có ở đó. Vì vậy, nếu một dòng trong khác biệt bắt đầu bằng +và bạn thay đổi nó thành -git thì WTF? bởi vì bây giờ dòng được đánh dấu để xóa không tồn tại để bắt đầu (thay vào đó dòng đó được đánh dấu để thêm vào và khi một dòng được đánh dấu để thêm được đánh dấu để loại bỏ, git không thể xóa một dòng chưa có trong tệp) .
leeand00

1
Cũng kiểm tra phần cuối dòng (LF, CRLF) trong trường hợp của tôi, nó không áp dụng cho một LF thay vì CRLF!
Alberto Rivelli

Câu trả lời:


37

Đối với ví dụ cụ thể này, bạn cần điều chỉnh số dòng trong phần nhỏ. Thay đổi dòng:

@@ -1,6 +2,8 @@

để thay vào đó nó đọc:

@@ -2,7 +2,8 @@

16
Sau khi tìm hiểu kỹ, tôi thấy rằng những dòng đó đang hiển thị "phạm vi từ tệp" và "phạm vi đến tệp". Tôi không thực sự hiểu logic đằng sau việc thay đổi từ 1 thành 2. Tôi đã thử và nó hoạt động, nhưng tôi không hiểu tại sao "phạm vi từ tệp" lại thay đổi. Tệp gốc giống nhau, cho dù tôi đang áp dụng toàn bộ bản vá hay chỉ là một phần đã chỉnh sửa. Bạn có thể làm rõ thêm không, hoặc chỉ cho tôi một tài liệu tham khảo gốc về định dạng khác biệt thống nhất. Tôi đã không thành công trong việc tìm một cái.
Josh

9
@Josh: stackoverflow.com/questions/2529441/… có thể trợ giúp, ngay cả khi tôi không nhận được hoàn toàn các định dạng hợp nhất. @William +1
VonC

5
@Josh: Khi xem xét nó, có vẻ như nó có thể là một lỗi. Sau khi bạn chỉnh sửa phần mềm, git cố gắng xác minh bản vá bằng cách kiểm tra xem tất cả các phần tử sẽ áp dụng (điều này có thể quá mức). Thật không may, trong trường hợp này, điều đó có nghĩa là tệp tin trước đó (mà bạn không áp dụng) đang được kiểm tra và có một số chồng chéo khiến git áp dụng - kiểm tra không thành công. Tôi không biết một giải pháp thanh lịch; git có thể đang làm điều đúng đắn bằng cách quá thận trọng ở đây.
William Pursell,

22
Vui lòng biết thêm thông tin về việc thay đổi số dòng? Tại sao chúng ta phải làm như vậy? Và làm thế nào? Mỗi số có ý nghĩa gì?
Bill

4
@WilliamCho biết phiên bản git nào? Tôi đã chuyển sang một máy tính mới và chạy git v2.17.0 và đột nhiên, các chỉnh sửa vá lỗi của tôi không còn hợp lệ nữa.
Dennis

105

Có giống như trong bài viết git-add này không?

Chỉnh sửa thủ công phần nhỏ là vô cùng mạnh mẽ, nhưng cũng hơi phức tạp nếu bạn chưa từng làm trước đây.
Điều quan trọng nhất cần ghi nhớ: Khác biệt luôn được thụt lề bằng một ký tự ngoài bất kỳ ký tự thụt lề nào khác ở đó.
Ký tự có thể là:

  • một khoảng trắng (cho biết một dòng không thay đổi),
  • một -chỉ ra rằng dòng đã được gỡ bỏ,
  • hoặc +cho biết rằng dòng đã được thêm vào.

Không có gì khác. Nó phải là dấu cách, dấu - hoặc dấu +. Bất cứ điều gì khác, và bạn sẽ gặp lỗi
(không có ký tự nào cho một dòng đã thay đổi, vì chúng được xử lý bằng cách xóa dòng cũ và thêm dòng đã thay đổi làm dòng mới).

Vì bạn đã mở khác biệt trong trình soạn thảo văn bản yêu thích của mình (bạn đã định cấu hình Git để sử dụng trình soạn thảo văn bản yêu thích của mình, phải không?), Bạn có thể làm bất cứ điều gì bạn muốn - miễn là bạn đảm bảo rằng khác biệt kết quả áp dụng rõ ràng.

Và trong đó lừa dối. Nếu bạn chưa bao giờ làm điều này trước đây, Git sẽ cho bạn biết "Thư mục đã chỉnh sửa của bạn không áp dụng. Chỉnh sửa lại?" thường xuyên, bạn sẽ bắt đầu ghét bản thân vì không thể tìm ra điều này , mặc dù nó có vẻ quá dễ dàng (hoặc Git vì nó không thể tìm ra những gì bạn muốn).

Một điều khiến tôi khá thường xuyên vấp phải là tôi quên một ký tự thụt lề.
Tôi sẽ đánh dấu một dòng với dấu - sẽ bị xóa, nhưng trong hầu hết các trình soạn thảo văn bản có chèn a -, nó không ghi đè lên khoảng trống đã có trước đó. Điều này có nghĩa là bạn đang thêm một khoảng trống cho toàn bộ dòng, điều này có nghĩa là thuật toán khác biệt không thể tìm / khớp với dòng trong tệp gốc, điều này có nghĩa là Git sẽ hét vào mặt bạn .

Điều khác là sự khác biệt vẫn phải có ý nghĩa. "Sense" có nghĩa là nó có thể được áp dụng một cách sạch sẽ. Chính xác thì cách bạn tạo ra một khác biệt hợp lý có vẻ là một nghệ thuật đen tối (ít nhất là với tôi lúc này), nhưng bạn nên luôn ghi nhớ tệp gốc trông như thế nào và sau đó lập kế hoạch -s và + của bạn cho phù hợp. Nếu bạn chỉnh sửa nội dung của mình đủ thường xuyên, cuối cùng bạn sẽ hiểu được nó.

Xem thêm cam kết này trên git add -p .

Câu trả lời của Ortomala Lokni đề cập đến bài đăng trên blog Joaquín Windmüller " Lựa chọn có chọn lọc các thay đổi để cam kết với git (hoặc Imma chỉnh sửa phần của bạn) "

Thay vì đếm các dòng, những gì Git muốn làm là kết hợp các phần chồng chéo (khi một phần được chỉnh sửa) trước khi áp dụng các phần đã chỉnh sửa nói trên.
Điều đó đã được thảo luận vào giữa năm 2018 và sẽ tránh được các kịch bản như:

nếu bạn tách một phần nhỏ, hãy chỉnh sửa phần phụ đầu tiên, chuyển một dòng ngữ cảnh theo sau thành một đoạn xóa, sau đó nếu bạn cố gắng phân đoạn phần phụ thứ hai, nó sẽ thất bại.


5
Cảm ơn vì liên kết, nhưng tôi đã thấy điều này. Tôi đã không thêm / để lại một dòng bổ sung. Vấn đề là ở số dòng, nhưng tôi vẫn chưa hiểu cách khắc phục.
Josh

9
Tôi đã không thay thế một dấu '-' đã xóa bằng một khoảng trống - do đó làm vặn thụt đầu dòng. Cám ơn!!
pedorro

Chỉ cần đảm bảo rằng bạn không hiểu nhầm phần không gian trống. Tôi nghĩ tất cả các dòng không thay đổi nên chỉ là một phù hợp với một màu đen - thay vì chỉ đơn thuần là nhân vật thụt lề ... Đã một giờ "hunk đã chỉnh sửa không áp dụng" cho đến khi tôi đã hiểu tại sao: - /
oligofren

@oligofren Tôi không chắc mình hiểu bạn: bạn đã phải làm gì để áp dụng bài viết đã chỉnh sửa của mình?
VonC

1
@VonC: Đầu tiên tôi nghĩ mình nên đổi - foo thành `` (chỉ là khoảng trống, không phải "khoảng trắng toàn bộ dòng"). Tôi phải mất một lúc để hiểu nó đáng lẽ phải là `foo`.
oligofren

48

Tất nhiên là tôi muộn với điều này nhưng tuy nhiên tôi muốn đề cập đến hồ sơ rằng vấn đề này đã được thảo luận vào năm ngoái trên danh sách gửi thư git và có vẻ như không có nhiều thay đổi kể từ đó.

Vấn đề cụ thể này bắt nguồn từ việc chia nhỏ cố gắng chỉnh sửa cùng một đoạn. Phân tích, như ban đầu được đăng bởi Jeff King, về vấn đề cơ bản về cơ bản là:

Hừm. OK, tôi hiểu. Kiểm tra "có áp dụng khác biệt này không" cấp dữ liệu cả hai phần của bản vá phân tách thành git-áp dụng. Nhưng tất nhiên phần thứ hai sẽ không bao giờ áp dụng chính xác, vì bối cảnh của nó trùng lặp với phần đầu tiên, nhưng không tính đến nó.

Thực hiện kiểm tra chỉ với bản vá đã chỉnh sửa sẽ hoạt động. Nhưng điều đó không tính đến việc bản vá đã chỉnh sửa của bạn có khả năng không thể áp dụng trong thời gian dài, tùy thuộc vào việc bạn có chấp nhận nửa còn lại của bản vá chia nhỏ hay không. Và chúng tôi chưa thể biết điều đó, bởi vì người dùng có thể đã không nói với chúng tôi (họ có thể đã bỏ qua nửa đầu và sau đó quay lại sau bước chỉnh sửa).

Jeff kết thúc bài đăng của mình với một cách giải quyết rất thực dụng luôn thành công và do đó rất được khuyến khích:

Vì vậy, nói chung, tôi nghĩ việc tách và chỉnh sửa cùng một đoạn vốn dĩ rất nguy hiểm và sẽ dẫn đến những loại vấn đề này. Và bởi vì chỉnh sửa cung cấp một tập hợp lớn của chức năng, tôi nghĩ bạn chỉ nên chỉnh sửa và cho phép áp dụng phần đầu tiên của phần thô hoặc không tùy thuộc vào sở thích của bạn.

Bằng cách chỉ chọn chỉnh sửa một đoạn nhỏ chưa được chia trước đó, bạn sẽ không phải đối phó với số dòng.


6
Cảm ơn, điều này thực sự dễ dàng hơn so với việc tìm kiếm số dòng.
michiakig

3
Đây là vấn đề của tôi. Cần tôi nhỏ hơn. Thực hiện chia tách trong tương tác. Sự phân chia không như tôi muốn nên tôi quyết định thử và chỉnh sửa thủ công. Đã nhận được lỗi. Bắt đầu lại, làm việc thử lần đầu tiên.
Kyle s

Đây là câu trả lời tốt nhất trong chủ đề này. Không chia nhỏ và chỉnh sửa. Chỉ cần chỉnh sửa.
Dr_Zaszuś

Trong trường hợp của tôi, một vấn đề khác đến từ phần cuối dòng Windows được hiển thị như ^Mtrong tệp khác biệt. Sau khi tôi lưu tệp với phần cuối CR, bản vá chỉnh sửa tương tác đã được thực hiện!
Dr_Zaszuś

Cảm ơn, điều này đã thực hiện thủ thuật cho tôi. Tôi phải làm việc trên một mảng lớn, vì vậy tôi đã chia nhỏ nó ra, và mọi thứ đã vỡ lở. Giữ nó không bị cắt khiến mọi thứ hoạt động tốt.
Matthias Fischer

16

Khi bạn muốn không xóa một dòng được sắp xếp để xóa, như trong

 first line
-second line
 third line

nơi bạn muốn giữ dòng thứ hai, hãy đảm bảo rằng bạn thay thế -bằng một khoảng trắng, thay vì xóa toàn bộ dòng (như bạn muốn loại bỏ một dòng đã thêm). Git sẽ sử dụng dòng cho ngữ cảnh.


1
Điều này không rõ ràng đối với tôi, tôi nghĩ Git đang nói với tôi rằng hãy tạo một khoảng trống duy nhất cho dòng.
JackHasaKeyboard

15

Điều quan trọng là cũng phải sửa đổi chính xác tiêu đề phần mềm (ví dụ @@ -1,6 +1,9 @@). Joaquin Windmuller tiết lộ bí mật của việc chỉnh sửa tiêu đề hunk trong một bài đăng trên blog của mình .

Bí mật của việc chỉnh sửa hunks

Việc chỉnh sửa các đoạn mã có thể gây nhầm lẫn lúc đầu, các hướng dẫn mà git cung cấp cho bạn nhưng không đủ để bắt đầu.

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

Nước sốt bí mật là… đếm dòng:

  • Nếu bạn xóa một dòng bắt đầu bằng + thì hãy trừ một dòng vào số dòng mới (chữ số cuối cùng của tiêu đề chú chó con) .
  • Nếu bạn xóa một dòng bắt đầu bằng - thì hãy thêm một dòng vào số dòng mới (chữ số cuối cùng của tiêu đề chú chó con) .
  • Không xóa các dòng khác (dòng tham chiếu).

Điều này sẽ cho phép bạn nhanh chóng sửa đổi các phần để chọn các phần bạn muốn.


1
Có cách nào để tự động chỉnh sửa tiêu đề phần mềm hoặc định cấu hình git để xác định số dòng thích hợp không?
Dennis

Bạn có thể viết kịch bản cho trình soạn thảo yêu thích của mình để tự động hóa việc này. Có thể đã có một số plugin cho việc này, nhưng điều này phụ thuộc vào trình chỉnh sửa.
Ortomala Lokni

13

Gần đây tôi đã tìm ra từ việc đọc chủ đề này cách thực hiện chỉnh sửa thủ công.

Mẹo tôi đã sử dụng là nếu tôi có một khác biệt như:

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

Mẹo là loại bỏ hoàn toàn hai dòng tôi không muốn, làm cho sự khác biệt kết quả trông giống như:

+ Line to add
+ Line to add

Mặc dù điều này rất có thể là hiển nhiên đối với hầu hết mọi người, nhưng nó không phải dành cho tôi cho đến ngày hôm nay và tôi nghĩ tôi chỉ nên chia sẻ kinh nghiệm của mình. Xin cho biết phương pháp này có nguy hiểm gì không?


2
Tôi không thể cảm ơn đủ! Tôi đã cố gắng thay đổi +thành ' 'trong ít nhất một giờ.
soumer

Bạn biết đấy, điên cuồng là làm điều tương tự và mong đợi một kết quả khác. Tôi đã nói rằng để bản thân mình trong vòng 20 phút trước khi tôi phát hiện ra rằng tôi chỉ cần thiết để xóa :)
solidak

7

Bạn có thể chỉnh sửa thủ công số dòng, điều đó chắc chắn hữu ích trong một số trường hợp. Tuy nhiên, có lẽ bạn đã có thể tránh được vấn đề cụ thể này bằng cách KHÔNG chia đoạn đầu tiên.

Nếu bạn thấy rằng có thể bạn sẽ cần chỉnh sửa thứ gì đó sau đó trong phần nhỏ mà Git đã tự động chọn, thì tốt nhất bạn chỉ nên chỉnh sửa toàn bộ phần nhỏ hơn là chia nhỏ, phân đoạn một nửa rồi chỉnh sửa nửa còn lại. Git sẽ làm tốt hơn khi tìm ra điều đó.


6

Tôi đến với câu hỏi này để tìm kiếm giải pháp cho cùng một vấn đề và không thể tìm ra cách thay đổi số dòng (như được đề xuất ở trên) trong phần nhỏ để git chấp nhận nó trong trường hợp của tôi. Tôi đã tìm thấy một cách tốt hơn nhiều để làm điều đó bằng cách sử dụng git gui. Ở đó, bạn có thể chọn các dòng trong khác biệt mà bạn muốn hiển thị, sau đó nhấp chuột phải và chọn "Dòng giai đoạn từ cam kết". Tôi nhớ git-cola cũng có chức năng tương tự.


Đây thực sự phải là câu trả lời. git-coladường như hoạt động trên Linux, Windows và MacOS.
leeand00

5

Một vấn đề khác mà tôi gặp phải khi gặp lỗi này là phần cuối dòng đã thay đổi khi tôi lưu tệp chỉnh sửa.

Tôi đang sử dụng Windows và sử dụng Notepad cho các chỉnh sửa của mình (chỉ lưu với phần cuối dòng Windows). Mã của tôi được viết bằng Notepad ++ và tôi đã thiết lập nó để có phần cuối dòng kiểu Unix / Linux.

Khi tôi thay đổi cài đặt của mình để có Notepad ++ làm trình chỉnh sửa git mặc định, tôi có thể thực hiện các chỉnh sửa của mình cho phần nhỏ.

git config --global core.editor "notepad++"

1
Điều này đã làm việc cho tôi. Nhưng tôi cần đường dẫn đầy đủ đến notepad ++ và phải mất một lúc để làm đúng: git config --global core.editor '"C:/Program\ Files\ \(x86\)/Notepad++/notepad++.exe"' (điều chỉnh điều này theo vị trí cài đặt notepad ++ trên PC của bạn)
Annabel

1
Chính xác vấn đề tương tự cho tôi. Đó là Notepad đã gây ra sự cố. Sau khi tôi chuyển trình soạn thảo mặc định của mình sang Notepad ++, mọi thứ bắt đầu hoạt động trở lại.
Johnny Oshika,

4

Một lý do kỳ lạ cho các thông báo "Phần mềm đã chỉnh sửa của bạn không áp dụng" (có thể đi kèm với một cái gì đó như "lỗi: đoạn vá lỗi không có tiêu đề ở dòng ...") có thể là trình chỉnh sửa của bạn nếu nó được định cấu hình để loại bỏ khoảng trắng ở cuối. Điều này rõ ràng sẽ gây ra các vấn đề lớn vì các bản vá mã hóa các dòng trống vì các dòng có một khoảng trắng, bất kỳ đoạn nào chứa các dòng trống sẽ không áp dụng được nếu được lưu bằng trình chỉnh sửa như vậy. Vì vậy, trên thực tế, bất kỳ phần nào chứa bất kỳ dòng trống nào không thay đổi sẽ không áp dụng được sau khi chỉnh sửa nếu bật khoảng trắng ở cuối.


0

FYI, tôi đã gặp một lỗi nhỏ liên quan đến nhau ... khi tôi thêm bản vá theo hướng dẫn được đề xuất ở trên ... Tuy nhiên, nó không hiển thị lỗi. Tôi liên tục nhận được nó yêu cầu tôi phân đoạn cùng một đoạn ... Tôi nhận thấy rằng tôi đang chạy phiên bản cũ hơn của Vim 7.4 ... Tôi đã nâng cấp vim và nó đang hoạt động như mong đợi. Hy vọng rằng điều này sẽ giúp ai đó ..

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.