Làm thế nào để tôi chỉ cam kết một số tập tin?


259

Tôi có hai dự án. Một là dự án "chính thức" và thứ hai là sửa đổi nhẹ (một số tệp được thêm vào). Tôi đã tạo chi nhánh mới và tôi đặt các tệp mới cho chúng. Nhưng trong quá trình phát triển, một số tệp chung cho cả hai nhánh bị thay đổi.

Làm thế nào để tôi chỉ cam kết những tập tin này?


Là hai dự án kết nối với cùng một kho git?
Oleksandr

Vâng, đó là cùng một kho lưu trữ, nhưng tôi không muốn đặt chi nhánh của mình lên máy chủ
Nips

Vậy tại sao bạn không hợp nhất chi nhánh mới của mình thành chủ (hoặc chi nhánh chính thức khác)
Oleksandr

1
Câu trả lời cho những câu hỏi này sẽ giúp bạn: stackoverflow.com/questions/7161860/... stackoverflow.com/questions/7175869/...
eckes

Câu trả lời:


261

Tôi cho rằng bạn muốn thực hiện các thay đổi cho một nhánh và sau đó làm cho những thay đổi đó hiển thị trong nhánh khác. Trong git, bạn sẽ không có thay đổi nào trên đầu trang khi thay đổi chi nhánh.

Bạn chỉ cam kết các tệp đã thay đổi bằng cách:

git commit [some files]

Hoặc nếu bạn chắc chắn rằng bạn có một khu vực tổ chức sạch, bạn có thể

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

Nếu bạn muốn làm cho cam kết đó có sẵn trên cả hai chi nhánh bạn làm

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again

22
Để chỉ cam kết các tệp đó, ngay cả khi các thay đổi khác đã được tổ chức, ví dụ thứ hai ( git commit [some files], ngụ ý công --onlytắc) nên được sử dụng. Ví dụ đầu tiên ( git add [some files]tiếp theo git commit) cũng sẽ cam kết bất kỳ thay đổi nào khác đã được tổ chức.
Lexikos

4
Tôi sẽ hữu ích để cung cấp các ví dụ cho git commit [một số tệp]. Làm thế nào bạn nên thay thế [một số tệp], dấu phẩy, khoảng trắng?
Claudiu Creanga

2
@claudiu thường vỏ công cụ là không gian giới hạn. Và nếu bạn lặn đủ sâu Bạn có thể thay đổi điều đó thành bất cứ điều gì
Alex

Nếu bạn có thể thêm một số ví dụ, câu trả lời này sẽ rất tuyệt.
Yamur

154

Nhận danh sách các tệp bạn muốn cam kết

$ git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   file1
modified:   file2
modified:   file3
modified:   file4

Thêm các tập tin để dàn dựng

$ git add file1 file2

Kiểm tra để xem những gì bạn đang cam kết

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file3
    modified:   file4

Cam kết các tệp với một thông điệp cam kết

$ git commit -m "Fixed files 1 and 2"

Nếu bạn vô tình phạm phải các tập tin sai

$ git reset --soft HEAD~1

Nếu bạn muốn hủy tập tin và bắt đầu lại

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4

92

Bạn có thể cam kết một số tệp được cập nhật, như thế này:

git commit file1 file2 file5 -m "commit message"

30

Một số điều này có vẻ "không đầy đủ"

Các nhóm người sẽ KHÔNG biết liệu họ có nên sử dụng dấu ngoặc kép không ..

Thêm 1 tệp cụ thể hiển thị đường dẫn vị trí là tốt

git add JobManager/Controllers/APIs/ProfileApiController.cs

Cam kết (hãy nhớ, cam kết chỉ mang tính cục bộ, nó không ảnh hưởng đến bất kỳ hệ thống nào khác)

git commit -m "your message"  

Đẩy đến repo từ xa

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

Các câu trả lời khác hiển thị stash, vv mà đôi khi bạn sẽ muốn làm


11

Nếu bạn đã sắp xếp các tập tin, chỉ cần bỏ qua chúng:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

Sau đó thêm chúng từng chút một vào lại.


11

Giả sử bạn đã thay đổi nhiều tệp, như:

  • Tệp1
  • Tệp2
  • Tệp 3
  • Tệp 4
  • Tệp 5

Nhưng bạn muốn cam kết chỉ thay đổi File1 và File3.

Có hai cách để làm điều này:

1. Chỉ thực hiện hai tệp này, sử dụng:

git add file1 file2

sau đó, cam kết

git commit -m "your message"

rồi đẩy,

git push

2. Cam kết trực tiếp

git commit file1 file3 -m "my message"

rồi đẩy,

git push

Thực tế phương pháp đầu tiên rất hữu ích trong trường hợp nếu chúng ta sửa đổi các tệp thường xuyên và dàn dựng chúng -> Các dự án lớn, thường là các dự án trực tiếp.
Nhưng nếu chúng tôi sửa đổi các tệp và không dàn dựng chúng thì chúng tôi có thể thực hiện cam kết trực tiếp -> Các dự án nhỏ


Khi không chỉ định tên tệp như ví dụ thứ hai của bạn gợi ý, git giả sử cờ lệnh cho các đối số này là --only. Sau đó, nó sẽ là lệnh tương tự git commit --only file1 --only file3 -m "my message"hoặc sử dụng phím tắt như git commit -o file1 -o file3 -m "my message"Tham chiếu: git-scm.com/docs/git-commit
người dùng

0

Đây là một cách tiếp cận đơn giản nếu bạn không có nhiều thay đổi mã:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

Sau đó, nếu bạn muốn mã bạn đã xóa (các bit bạn không cam kết) trong một cam kết riêng hoặc một nhánh khác, thì trong khi vẫn ở nhánh này, hãy thực hiện:

5. git stash apply
6. git stash

Với bước 5 như bạn đã áp dụng stash và cam kết mã bạn muốn ở bước 4, khác biệt và không bị theo dõi trong stash mới được áp dụng chỉ là mã bạn đã xóa trong bước 3 trước khi bạn cam kết ở bước 4.

Vì bước 6 như vậy là một đoạn mã mà bạn không [muốn] cam kết, vì có lẽ bạn không thực sự muốn mất những thay đổi đó phải không? Vì vậy, stash mới từ bước 6 bây giờ có thể được cam kết cho nhánh này hoặc bất kỳ nhánh nào khác bằng cách thực hiện git stash trên nhánh chính xác và cam kết.

Rõ ràng điều này giả định rằng bạn thực hiện các bước trong một luồng, nếu bạn bỏ vào bất kỳ điểm nào khác trong các bước này, bạn sẽ cần lưu ý giới thiệu stash cho mỗi bước ở trên (thay vì chỉ là stash cơ bản và áp dụng stash gần đây nhất).

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.