Tôi đang sử dụng Git và tôi đã cam kết một vài tệp bằng cách sử dụng
git commit -a
Sau đó, tôi thấy rằng một tập tin đã bị thêm nhầm vào cam kết.
Làm thế nào tôi có thể xóa một tập tin từ cam kết cuối cùng?
git reset filepath
Tôi đang sử dụng Git và tôi đã cam kết một vài tệp bằng cách sử dụng
git commit -a
Sau đó, tôi thấy rằng một tập tin đã bị thêm nhầm vào cam kết.
Làm thế nào tôi có thể xóa một tập tin từ cam kết cuối cùng?
git reset filepath
Câu trả lời:
Tôi nghĩ rằng các câu trả lời khác ở đây là sai, bởi vì đây là câu hỏi về việc di chuyển các tệp được cam kết nhầm trở lại khu vực tổ chức từ cam kết trước đó, mà không hủy bỏ các thay đổi được thực hiện đối với chúng. Điều này có thể được thực hiện như Paritosh Singh đề xuất:
git reset --soft HEAD^
hoặc là
git reset --soft HEAD~1
Sau đó đặt lại các tệp không mong muốn để loại bỏ chúng khỏi cam kết:
git reset HEAD path/to/unwanted_file
Bây giờ cam kết một lần nữa, bạn thậm chí có thể sử dụng lại cùng một thông điệp cam kết:
git commit -c ORIG_HEAD
git push
khắc phục lỗi repo của bạn, nó sẽ khiếu nại Updates were rejected because the tip of your current branch is behind its remote counterpart.
. Nếu bạn chắc chắn rằng bạn muốn đẩy chúng (ví dụ: đó là ngã ba của bạn) thì bạn có thể sử dụng -f
tùy chọn để buộc đẩy, ví dụ git push origin master -f
. (Đừng làm điều này với một repo ngược dòng mà những người khác đang tìm nạp)
git reset --soft HEAD^
là hoạt động hoàn tác phổ biến nhất của tôi
git reset
nhưng muốn có một cách để ảnh hưởng đến cam kết hiện tại "tại chỗ". Tôi chỉ học về git commit -C
. Vì vậy, đối với tôi, những gì tôi muốn là công thức chính xác của bạn với một bước nữa, "cam kết mới một lần nữa" được đánh vần là git commit -C [hash of original HEAD commit from first step]
.
CHÚ Ý ! Nếu bạn chỉ muốn xóa một tệp khỏi cam kết trước đó và giữ nó trên đĩa , hãy đọc câu trả lời của juzzlin ngay phía trên.
Nếu đây là cam kết cuối cùng của bạn và bạn muốn xóa hoàn toàn tệp khỏi kho lưu trữ cục bộ và từ xa , bạn có thể:
git rm <file>
git commit --amend
Cờ sửa đổi cho git cam kết một lần nữa, nhưng "hợp nhất" (không phải theo nghĩa là hợp nhất hai nhánh) cam kết này với cam kết cuối cùng.
Như đã nêu trong các ý kiến, sử dụng git rm
ở đây giống như sử dụng rm
chính lệnh đó!
git rm --cached
để giữ các tệp trên đĩa
rm
trong git
lệnh được làm những gì rm
mình làm!
git commit --amend
đó vẫn còn đó và có thể được tìm thấy ví dụ với git reflog
. Vì vậy, nó không phải là xấu như các ý kiến khác đề nghị.
Tất cả các câu trả lời hiện tại đều nói về việc loại bỏ các tệp không mong muốn từ cuối cùng .
Nếu bạn muốn xóa các tập tin không mong muốn từ một cái cũ cam kết (thậm chí bị đẩy) và không muốn tạo một cam kết mới, điều này là không cần thiết, vì hành động:
1.
Tìm cam kết mà bạn muốn tập tin tuân thủ.
git checkout <commit_id> <path_to_file>
bạn có thể làm điều này nhiều lần nếu bạn muốn xóa nhiều tệp.
2.
git commit -am "remove unwanted files"
3.
Tìm commit_id của cam kết mà các tệp được thêm nhầm , hãy nói "35c23c2" tại đây
git rebase 35c23c2~1 -i // notice: "~1" is necessary
Lệnh này mở trình chỉnh sửa theo cài đặt của bạn. Cái mặc định là vim.
Di chuyển cam kết cuối cùng, đó là "xóa các tệp không mong muốn", sang dòng tiếp theo của cam kết không chính xác ("35c23c2" trong trường hợp của chúng tôi) và đặt lệnh là fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Bạn nên tốt sau khi lưu tập tin.
Kêt thuc :
git push -f
Nếu bạn không may gặp xung đột, bạn phải giải quyết chúng bằng tay.
git rm --cached <file(s)>
.
--fixup=35c23c2
vào git commit
lệnh. Điều này sẽ tự động thiết lập cam kết dưới dạng bản sửa lỗi của cam kết được yêu cầu và do đó bạn sẽ không cần chỉ định nó trong rebase. Ngoài ra, nếu bạn thêm --autosquash
vào git rebase
lệnh, git sẽ tự động di chuyển cam kết của bạn đến đúng vị trí, do đó bạn không cần phải làm gì trong rebase tương tác - chỉ cần lưu kết quả (có nghĩa là bạn thậm chí không cần -i
gắn cờ, mặc dù tôi thích sử dụng nó để đảm bảo mọi thứ trông như tôi mong đợi).
Như câu trả lời được chấp nhận cho biết, bạn có thể làm điều này bằng cách đặt lại toàn bộ cam kết. Nhưng đây là một cách tiếp cận khá nặng tay.
Một cách sạch hơn để làm điều này sẽ là giữ cam kết và chỉ cần xóa các tệp đã thay đổi khỏi nó.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
Các git reset
sẽ mất các tập tin như nó đã được trong trước cam kết, và giai đoạn đó trong chỉ mục. Các tập tin trong thư mục làm việc là không bị ảnh hưởng.
Sau git commit
đó sẽ cam kết và nén chỉ số vào cam kết hiện tại.
Điều này về cơ bản lấy phiên bản của tệp trong cam kết trước đó và thêm nó vào cam kết hiện tại. Điều này dẫn đến không có thay đổi thuần, và do đó, tệp được xóa khỏi cam kết một cách hiệu quả.
Nếu bạn chưa đẩy các thay đổi trên máy chủ, bạn có thể sử dụng
git reset --soft HEAD~1
Nó sẽ thiết lập lại tất cả các thay đổi và trở lại một lần cam kết
Nếu bạn đã đẩy các thay đổi của mình thì hãy làm theo các bước như được trả lời bởi @CharlesB
Xóa tập tin bằng rm sẽ xóa nó!
Bạn luôn luôn thêm vào một cam kết trong git thay vì xóa, vì vậy trong trường hợp này, trả lại tệp về trạng thái trước cam kết đầu tiên (đây có thể là hành động xóa 'rm' nếu tệp mới) và sau đó tái cam kết và các tập tin sẽ đi.
Để trả lại tệp về một số trạng thái trước đó:
git checkout <commit_id> <path_to_file>
hoặc để trả nó về trạng thái ở đầu từ xa:
git checkout origin/master <path_to_file>
sau đó sửa đổi cam kết và bạn sẽ thấy tệp đã biến mất khỏi danh sách (và không bị xóa khỏi đĩa của bạn!)
git checkout HEAD~ path/to/file
git commit --amend
Phần sau đây sẽ chỉ hiển thị tệp bạn dự định, đó là những gì OP yêu cầu.
git reset HEAD^ /path/to/file
Bạn sẽ thấy một cái gì đó như sau ...
Các thay đổi được cam kết: (sử dụng "git reset HEAD ..." để hủy bỏ)
đã sửa đổi: / path / to / file
Các thay đổi không được tổ chức cho cam kết: (sử dụng "git add ..." để cập nhật những gì sẽ được cam kết) (sử dụng "kiểm tra git - ..." để loại bỏ các thay đổi trong thư mục làm việc)
đã sửa đổi: / path / to / file
Tại thời điểm này, bạn có thể làm bất cứ điều gì bạn muốn với tệp, chẳng hạn như đặt lại thành một phiên bản khác.
Khi bạn sẵn sàng cam kết:
git commit --amend -a
hoặc (nếu bạn có một số thay đổi khác đang diễn ra mà bạn chưa muốn cam kết)
git commit add /path/to/file
git commit --amend
Tôi sẽ giải thích cho bạn với ví dụ.
Đặt A, B, C là 3 lần cam kết liên tiếp. Cam kết B chứa một tệp không nên được cam kết.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
thành edit [A_commit_ID]
hoặce [A_commit_ID]
Bạn chỉ có thể thử.
git reset --soft HEAD~1
và tạo một cam kết mới.
Tuy nhiên, có một phần mềm "gitkraken" tuyệt vời. mà làm cho nó dễ dàng để làm việc với git.
git commit --amend
để xóa tệp được cập nhật trong lần xác nhận cuối cùng của bạn; và sau đó, bạn có thể kiểm tra xem nó thực sự đã bị xóa bằnggit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
sẽ để lại cho bạn các tập tin địa phương vẫn còn. Nếu bạn không muốn tệp cục bộ, bạn có thể bỏ qua tùy chọn --cached.
Nếu tất cả công việc thuộc về chi nhánh địa phương của bạn, bạn cần giữ tệp trong một cam kết sau này và giống như có một lịch sử rõ ràng, tôi nghĩ một cách đơn giản hơn để làm điều này có thể là:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
và sau đó bạn có thể hoàn thành việc rebase một cách dễ dàng mà không cần phải nhớ các lệnh phức tạp hơn hoặc thông báo cam kết hoặc nhập nhiều.
Sử dụng git GUI có thể đơn giản hóa việc xóa một tệp khỏi cam kết trước đó.
Giả sử rằng đây không phải là một nhánh được chia sẻ và bạn không ngại viết lại lịch sử , sau đó chạy:
git gui citool --amend
Bạn có thể bỏ chọn tệp đã cam kết sai và sau đó nhấp vào "Cam kết".
Tệp được xóa khỏi cam kết, nhưng sẽ được lưu trên đĩa . Vì vậy, nếu bạn đã không kiểm tra tệp sau khi thêm nhầm, nó sẽ hiển thị trong danh sách tệp chưa được theo dõi của bạn (và nếu bạn không kiểm tra tệp sau khi sửa đổi sai, nó sẽ hiển thị trong các thay đổi của bạn không được phân loại cho danh sách cam kết).
sudo apt-get install git-gui
git rebase -i HEAD~4
và sau đó chạy lệnh của bạn để mở trình soạn thảo. Một lưu ý khác: "Unstaging" có thể được tìm thấy trong menu "Cam kết".
git reset --soft HEAD^
(ghi nhớ --soft arg), theo sau là git commit -c ORIG_HEAD
(chứ không phải --amend, làm hỏng mọi thứ).
Nếu bạn muốn duy trì cam kết của mình (có thể bạn đã dành một chút thời gian để viết một thông điệp cam kết chi tiết và không muốn mất nó) và bạn chỉ muốn xóa tệp khỏi cam kết chứ không phải hoàn toàn khỏi kho lưu trữ:
git checkout origin/<remote-branch> <filename>
git commit --amend
Thực hiện một chuỗi các lệnh sau:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
Chỉ muốn bổ sung cho câu trả lời hàng đầu vì tôi phải chạy thêm một lệnh:
git reset --soft HEAD^
git checkout origin/master <filepath>
Chúc mừng!
Một cái gì đó làm việc cho tôi, nhưng vẫn nghĩ nên có một giải pháp tốt hơn:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Chỉ cần để lại thay đổi bạn muốn loại bỏ trong cam kết khác, kiểm tra những người khác
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Trên thực tế, tôi nghĩ một cách nhanh hơn và dễ dàng hơn là sử dụng chế độ tương tác git rebase.
git rebase -i head~1
(hoặc đầu ~ 4, bạn muốn đi bao xa)
và sau đó, thay vì 'chọn', hãy sử dụng 'chỉnh sửa'. Tôi đã không nhận ra "chỉnh sửa" mạnh mẽ như thế nào.
https://www.youtube.com/watch?v=2dQosJaLN18
Hy vọng bạn sẽ tìm thấy nó hữu ích.
Có cùng một vấn đề khi tôi có các thay đổi trong một nhánh cục bộ nơi tôi muốn hoàn nguyên chỉ một tệp. Những gì làm việc cho tôi là -
( tính năng / target_branch bên dưới là nơi tôi có tất cả các thay đổi của mình, kể cả những thay đổi tôi muốn hoàn tác cho một tệp cụ thể)
( origin / Feature / target_branch là nhánh từ xa nơi tôi muốn đẩy các thay đổi của mình sang)
( tính năng / dàn là nhánh dàn dựng tạm thời của tôi, nơi tôi sẽ đẩy từ tất cả các thay đổi mong muốn của mình, ngoại trừ thay đổi sang một tệp đó)
Tạo một nhánh cục bộ từ nguồn gốc / tính năng / target_branch của tôi - được gọi là tính năng / dàn dựng
Đã hợp nhất tính năng chi nhánh địa phương / target_branch của tôi với tính năng / phân nhánh
Đã kiểm tra tính năng / dàn dựng sau đó git reset --soft ORIG_HEAD (Bây giờ tất cả các thay đổi từ tính năng / dàn dựng 'sẽ được tổ chức nhưng không được cam kết.)
Unstaged tập tin mà tôi đã kiểm tra trước đó với những thay đổi không cần thiết
Đã thay đổi nhánh ngược dòng cho tính năng / dàn thành nguồn gốc / tính năng / target_branch
Đã cam kết phần còn lại của các thay đổi theo giai đoạn và đẩy ngược dòng lên nguồn gốc / tính năng / target_branch từ xa của tôi
Nếu bạn muốn xóa tệp khỏi các xác nhận trước đó, hãy sử dụng các bộ lọc
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
Nếu bạn thấy lỗi này:
Không thể tạo bản sao lưu mới. Một bản sao lưu trước đó đã tồn tại trong refs / gốc / Buộc ghi đè lên bản sao lưu bằng -f
Chỉ cần xóa bản sao lưu ref trên repo cục bộ của bạn
$ rm -rf .git/refs/original/refs
nếu bạn chưa đẩy những thay đổi của mình lên git
git reset --soft HEAD~1
Nó sẽ thiết lập lại tất cả các thay đổi và trở lại một lần cam kết
Nếu đây là lần cam kết cuối cùng bạn thực hiện và bạn muốn xóa tệp khỏi kho lưu trữ cục bộ và từ xa, hãy thử điều này:
git rm <file>
git commit --amend
hoặc thậm chí tốt hơn:
đặt lại trước
git reset --soft HEAD~1
đặt lại tệp không mong muốn
git reset HEAD path/to/unwanted_file
cam kết một lần nữa
git commit -c ORIG_HEAD
Điều này được thực hiện cho tôi để loại bỏ tệp khỏi repo bit bit mà tôi đã đẩy tệp sang nhánh ban đầu.
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
Không có câu trả lời tại thời điểm này là hợp lý. Âm thanh như có đủ nhu cầu mà một giải pháp thực sự nên được đề xuất: https://github.com/git/git/blob/master/Documentation/SubmmitPatches
git --uncommit <tên tệp>
sẽ tốt. Tôi nhận được rằng chúng tôi không muốn sửa đổi lịch sử, nhưng nếu tôi là người địa phương và vô tình thêm tệp "hack" cục bộ và muốn xóa nó khỏi cam kết thì điều này sẽ rất hữu ích.