'git add --patch' để bao gồm các tệp mới?


104

Khi tôi chạy git add -p, có cách nào để git chọn các tệp mới được tạo thành các tệp để chọn không ??

Vì vậy, nếu tôi tạo một tệp mới được gọi foo.java, sau đó chạy git add -p, git sẽ không cho phép tôi chọn nội dung của tệp đó để thêm vào chỉ mục.

Câu trả lời:


77

Để thực hiện việc này với mọi tệp mới, bạn có thể chạy:

git add -N .
git add -p

Nếu bạn muốn sử dụng nó thường xuyên, bạn có thể tạo một bí danh trong ~/.bashrc:

alias gapan='git add --intent-to-add . && git add --patch'

NB : Nếu bạn sử dụng nó với một tệp mới trống, git sẽ không thể vá nó và chuyển sang tệp tiếp theo.


13
Đối với bất kỳ ai đang tự hỏi điều gì git add -Nlàm được, nó chỉ thêm các tệp chưa được theo dõi đã chỉ định vào chỉ mục, nhưng không có nội dung.
Odin

112

Khi tôi thử git add -p someNewFile.txttrên một tệp mới (tệp chưa được đánh dấu), git sẽ chỉ xuất ra No changes.và dừng lại. Tôi phải nói với git rằng tôi dự định theo dõi tệp mới trước.

git add -N someNewFile.txt
git add -p

Tuy nhiên, vì tệp chưa được theo dõi, nó sẽ hiển thị dưới dạng một tập tin khổng lồ không thể tách được (vì tất cả đều mới!). Vì vậy, sau đó tôi cần chỉnh sửa phần nhỏ thành các bit nhỏ hơn. Nếu bạn không quen với điều đó, hãy xem tài liệu tham khảo này để bắt đầu.

Cập nhật - Thông tin chỉnh sửa phần nhỏ Tôi muốn cập nhật thông tin này trong trường hợp tài liệu tham khảo ở trên biến mất. Vì tệp mới chưa được theo dõi, nên git add -psẽ hiển thị mọi dòng trong tệp dưới dạng một dòng mới trong một đoạn. Sau đó, nó sẽ hỏi bạn muốn làm gì với phần mềm đó, đưa ra lời nhắc sau:

Stage this hunk [y,n,q,a,d,/,e,?]?

Giả sử rằng bạn không muốn cam kết toàn bộ tệp (và do đó, toàn bộ tệp; vì tôi không chắc tại sao bạn muốn sử dụng git add -ptrong trường hợp đó?), Bạn sẽ muốn chỉ định tùy chọne để nói với git rằng bạn muốn chỉnh sửa một con ngựa.

Khi bạn nói với git rằng bạn muốn chỉnh sửa phần nhỏ, nó sẽ đưa bạn vào trình chỉnh sửa mà bạn lựa chọn để bạn có thể thực hiện các thay đổi của mình. Tất cả các dòng phải được bắt đầu bằng a +và git có một số chú thích giải thích (bắt đầu bằng a #) ở cuối tệp. Đơn giản chỉ cần xóa bất kỳ dòng nào bạn không muốn trong cam kết ban đầu của tệp. Sau đó, lưu và thoát khỏi trình chỉnh sửa.

Giải thích của Git về các tùy chọn hunk của git:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
Xin ai đó trả lời tóm tắt điều này.
Inanc Gumus

5
Nói tóm lại, git add -N someNewFile.txttheo saugit add -p
CatShoes

7

git add -p thực sự là về việc thêm các thay đổi vào các tệp đã được theo dõi.

Lệnh tương tác chọn tệp để thêm là git add -i. Ví dụ:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(Lệnh thực có các màu mà tôi không thể cắt và dán ở đây, vì vậy nó đẹp hơn có vẻ)

Trên thực tế, lệnh p atch của git add -ilàm tương tự như git add -p, vì vậy lệnh thứ hai là một tập con của lệnh đầu tiên (mặc dù tôi thừa nhận rằng tôi yêu add -pvà ghét add -ibản thân mình!).


"Tôi thừa nhận rằng tôi yêu add -p và ghét add -i bản thân mình!" Đây là lý do tại sao git add then patch là một giải pháp mà tôi yêu thích: Nó vẫn cho phép bạn kiểm tra nội dung của các tệp mới bạn đang thêm (vì bạn so sánh chúng với các phiên bản trống của chúng) và vá các tệp bạn đã chỉnh sửa!
Ulysse BN

Vui lòng sửa cho tôi nếu tôi sai, nhưng ngay cả ở đây trong chế độ tương tác, bản vá vẫn sẽ xuất ra No changes.trên một tệp mới. OP hỏi cách thêm nhóm từ một tệp mới, không phải toàn bộ tệp. Tôi tin rằng --intent-to-addvẫn được yêu cầu ở đây.
Jeff Puckett

add -pmột mình sẽ không hoạt động, nhưng câu trả lời này gợi ý add -i, điều này sẽ làm được.
Matthieu Moy

Tôi ủng hộ vì tôi không biết về git add -i. Tuy nhiên, bạn có thể làm điều tương tự mà không tương tác với git add -N.
Mad Physicist

4

Cũng có một cách tiếp cận rất tương tự là sử dụng --cachedlá cờ ...

1) Chuyển các thay đổi chưa theo giai đoạn của bạn thành theo giai đoạn, giống như tệp bạn đã thêm.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) Nhìn vào sự khác biệt (lưu ý: bạn có thể bao gồm cả chỉnh sửa và tệp mới).

git diff --cached

3) Tạo bản vá.

git diff --cached > my_patch_file.patch

Thật không may rằng điều đó sẽ không đạt được mục đích tương tự. Điều tôi thích git add -plà nó không thêm mọi thứ, nhưng hãy để tôi chọn và chọn những gì tôi muốn thêm. Giải pháp này sẽ thêm mọi thứ một cách mù quáng.
Alexander Bird

Vâng, bạn có thể chọn những gì bạn thêm! Tôi sẽ cập nhật câu trả lời.
doublejosh 22/09/2016

1
cảm ơn bạn: allthethings: điều này hoạt động đáng kinh ngạc đối với tôi
macool
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.