Xóa tệp khỏi cam kết Git


1613

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?


2
Liên kết này là hoàn hảo cho câu hỏi của bạn: stackoverflow.com/questions/307828/ từ
b3h3m0th

@CharlesB: vâng, đây là cam kết cuối cùng của tôi
Lolly

8
Bạn đã đẩy cam kết đến máy chủ chưa?
Paritosh Singh

4
Tôi chỉ làm điều đó bằng cách sử dụng:git reset filepath
felipekm

Câu trả lời:


3089

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  

86
Cám ơn vì cái này. Điều đáng nói thêm là nếu bạn đã thực hiện cam kết (sai) trước đó của mình và bây giờ hãy cố gắng git pushkhắ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 -ftù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)
andy magoon

57
git reset --soft HEAD^là hoạt động hoàn tác phổ biến nhất của tôi
funroll

2
@PabloFernandez, trước hết, câu trả lời được chấp nhận có thể là những gì OP đang tìm kiếm (Ngoài ra, nó đã được đăng trước đó vài tháng). Thứ hai, câu trả lời được chấp nhận luôn luôn đứng đầu bất kể số lượng phiếu bầu tăng lên.
MITjanitor

4
@PabloFernandez ở đầu tất cả các câu trả lời là ba tab cho phép bạn kiểm soát thứ tự câu trả lời: hoạt động , cũ nhấtphiếu bầu . Tôi đoán là của bạn được thiết lập để cũ nhất . Chuyển nó thành phiếu bầu mặc dù câu trả lời được chấp nhận vẫn sẽ đứng đầu, câu trả lời này sẽ là thứ hai.
ahsteele

15
Tôi biết điều này rất nhiều git resetnhư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].
metamatt

323

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ể:

  1. xóa tập tin git rm <file>
  2. cam kết với cờ sửa đổi: 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 rmchính lệnh đó!


120
bạn cũng có thể sử dụng git rm --cachedđể giữ các tệp trên đĩa
Arkadiy Kukarkin

14
Cảnh báo cho những người duyệt câu trả lời này: đảm bảo bạn muốn XÓA tệp (như đã biến mất!), Không chỉ xóa nó khỏi danh sách Cam kết.
Scott Biggie

8
Để thêm vào những gì người khác nói (và để làm cho nó dễ dàng hơn để nhớ không để làm điều này trừ khi bạn thực sự muốn): Các rmtrong gitlệnh được làm những gì rmmình làm!
yo '

@CharlesB Bạn có thể vui lòng thêm ghi chú từ nhận xét của Arkadiy Kukarkin vào câu trả lời của bạn để cho nó rõ hơn không?
mopo922

2
Lưu ý rằng các tệp vẫn có thể được khôi phục, trong trường hợp bạn thay đổi quyết định, cam kết trước 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ị.
Steohan

165

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 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.


2
Làm điều này với nano là tuyệt vời! Ctrl + K, Ctrl + U, đặt 'f', Ctrl + X, đặt 'y' và voila!
sequielo

6
Nếu bạn thực sự muốn xóa các tệp khỏi repo (không phải hệ thống tệp), thay vì chỉ hoàn nguyên chúng về phiên bản trước, thì thay vì bước 1 làm git rm --cached <file(s)>.
waldyrious

2
Chờ đã, bạn có thể di chuyển các cam kết xung quanh tệp rebase tương tác theo ý muốn không?
Dan Rosenstark

2
Bạn hoàn toàn có thể, nhưng bạn có thể (hoặc có thể không) bị xung đột.
Brian

6
Quá trình này có thể được thực hiện dễ dàng hơn một chút bằng cách thêm --fixup=35c23c2vào git commitlệ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 --autosquashvào git rebaselệ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 -igắ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).
Guss

144

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 resetsẽ 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ả.


5
Đây là một câu trả lời tốt hơn nhiều cho việc chỉ xóa một tệp duy nhất mà không cần đại tu toàn bộ cam kết.
nhanh nhẹn

Điều này hoàn toàn giống với câu trả lời này: D stackoverflow.com/a/27340569/1623984
ThatsAMorais

@ThatsAMorais thực sự :-). Tôi tự hỏi nếu câu hỏi này được hợp nhất với câu hỏi khác, và đó là lý do tại sao tôi không nhìn thấy nó. Hoặc có lẽ tôi chỉ bị mù. Dù thế nào đi nữa, tôi nghĩ tôi có xu hướng rời bỏ nó dựa trên số phiếu mà nó dường như phổ biến hơn (có thể mọi người thích câu trả lời ngắn và trực tiếp).
Patrick

Bằng mọi cách bỏ nó! :) Chúng tôi rõ ràng đã có ý tưởng đúng, và mục đích là để giúp đỡ. Tôi nghĩ rằng sáp nhập là một lý thuyết tốt.
ThatsAMorais

Làm thế nào để bạn làm điều này nếu bạn đã được đẩy đến một chi nhánh trên github? Tôi đã cố gắng đẩy sau khi thực hiện sửa lỗi này và nhận được thông báo "Cập nhật bị từ chối vì tiền boa của chi nhánh hiện tại của bạn đứng sau gợi ý: đối tác từ xa của nó."
Ollie Williams

41

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


2
Thiết lập lại -1 git sẽ xóa các thay đổi tệp đã xảy ra khỏi khu vực tổ chức, ở đây thay đổi đã được cam kết
CharlesB

OK, nhưng tôi sẽ giữ downvote của mình vì đó không phải là điều OP muốn :) xin lỗi
CharlesB

ok nó tốt cho tôi, nhưng tại sao đối thủ không muốn điều này. Vấn đề là gì?
Paritosh Singh

không phải là một vấn đề lớn, nhưng vì OP muốn xóa tệp không mong muốn khỏi lần xác nhận cuối cùng và nó chỉ đặt lại trạng thái trước khi cam kết. vẫn là bạn phải làm lại cam kết.
CharlesB

3
@Aris sử dụng <git diff --cached> để xem các thay đổi
Paritosh Singh

37

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!)


36
git checkout HEAD~ path/to/file
git commit --amend

1
Đây là cách tốt nhất để sửa đổi cam kết cuối cùng, cam kết chưa được đẩy. Điều này sẽ thiết lập lại các thay đổi trong một tệp, loại bỏ hiệu quả tệp đó khỏi lần xác nhận cuối cùng.
Alex Bravo

Điều này cũng thay đổi tập tin. Làm thế nào để bảo tồn những thay đổi cục bộ trong tập tin?
theonlygusti

29

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

  • "Thay đổi được cam kết" là phiên bản trước của tệp trước khi cam kết. Điều này sẽ trông giống như xóa nếu tập tin không bao giờ tồn tại. Nếu bạn cam kết thay đổi này, sẽ có một bản sửa đổi hoàn nguyên thay đổi cho tệp trong chi nhánh của bạn.
  • "Thay đổi không được phân loại cho cam kết" là thay đổi bạn đã cam kết và trạng thái hiện tại của tệp

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

3
Câu trả lời của juzzlin là tuyệt vời, nhưng nó quá mức để làm sáng tỏ toàn bộ cam kết khi bạn chỉ muốn bỏ qua một. Unstaging toàn bộ cam kết có thể gây ra vấn đề nếu bạn hiện tại không có thay đổi trên các tệp trong cam kết mà bạn không muốn mất.
ThatsAMorais

27

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>    

Nếu tệp cụ thể không nằm trong cam kết cuối cùng hoặc trước đó, đây là cách thanh lịch nhất. Tôi thậm chí nói rằng đó là cách thanh lịch nhất nói chung. Tôi thích nổi loạn tương tác.
bvgheluwe

Đối với một cam kết duy nhất, thay đổi noopthành edit [A_commit_ID]hoặce [A_commit_ID]
TamusJRoyce

23

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.


1
Và chỉ cần lưu ý: sau này, bạn sẽ làm gì 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
sdbbs

13
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.


Điều này làm việc cho tôi. Tôi giả sử nếu bạn muốn thêm các tệp trở lại vào hỗn hợp, chỉ cần sử dụng git add -A hoặc git add. và họ đã trở lại.
Alexander Mills

11

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".

nhập mô tả hình ảnh ở đây

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).


2
Trên Ubuntu, bạn có thể cài đặt git gui vớisudo apt-get install git-gui
JDiMatteo

Cảm ơn bạn! Tôi đã bị mắc kẹt với một vấn đề (lỗi?) Trong đó một thư mục chứa repo .git đã được thêm vào và tất cả các lệnh xóa thông thường không hoạt động. Điều này tuy nhiên đã giúp. Đó là một vài cam kết trở lại, lần đầu tiên tôi sử dụng git rebase -i HEAD~4và 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".
Johny Skovdal

Giải pháp đơn giản nhất trong tất cả. Đơn giản nhất để nhớ. Và ít bị lỗi hơn nhiều so với việc sử dụng 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ứ).
Brent Faust

9

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

6

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'

Tôi đã thử thực hiện các bước này và tôi thấy lỗi này: không thể đẩy một số giới thiệu thành 'git ....' Để ngăn bạn khỏi mất lịch sử, các cập nhật không chuyển tiếp nhanh đã bị từ chối Hợp nhất các thay đổi từ xa (ví dụ: 'Git kéo') trước khi đẩy lại. Xem phần 'Lưu ý về chuyển tiếp nhanh' của 'git đẩy - trợ giúp' để biết chi tiết. (sau khi git pull tôi có những thay đổi tương tự)
Dezigo

Nó có nghĩa là trạng thái của repo từ xa của bạn đã thay đổi trong khi bạn đang làm công việc địa phương của bạn. Và sau khi 'git pull', các thay đổi cục bộ của bạn sẽ được hợp nhất với các thay đổi từ xa, đó là nó. Tất nhiên, những thay đổi của bạn phải được duy trì.
Serge Onishchenko

Nói cách khác, nếu bạn gặp lỗi đó @Dezigo, hãy thêm cờ -f để buộc cập nhật.
jungledev

5

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!


Chào mừng bạn Câu trả lời này sẽ tốt hơn nếu bạn giải thích những gì các lệnh thực sự làm.
Mark Chorley

3

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

3

git reset --soft HEAD^quay trở lại cam kết của bạn và khi bạn gõ git status, nó sẽ cho bạn biết phải làm gì:

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

2

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.


video dài 10 phút và không hữu ích lắm
MolbOrg

2

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 đó)

  1. 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

  2. Đã 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

  3. Đã 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.)

  4. Unstaged tập tin mà tôi đã kiểm tra trước đó với những thay đổi không cần thiết

  5. Đã 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

  6. Đã 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


1

Nếu bạn không cần tập tin đó nữa, bạn có thể làm

git rm file
git commit --amend
git push origin branch

1

Nếu bạn đang sử dụng GitHub và chưa thực hiện cam kết, GitHub Desktop sẽ giải quyết vấn đề này một cách dễ dàng:

  1. Chọn Kho lưu trữ -> Hoàn tác Cam kết gần đây nhất
  2. Bỏ chọn tệp mà bạn đã thêm nhầm. Thông báo cam kết trước đó của bạn sẽ nằm trong hộp thoại.
  3. Nhấn nút Cam kết!

1

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

1

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  

giống như trên nhưng thậm chí thực sự đã giúp kiểm tra chéo
Reshma

0

Đ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

0

Tôi đã sao chép các tệp hiện tại trong một thư mục khác, sau đó loại bỏ tất cả các thay đổi chưa được xử lý bằng cách:

git reset --hard @{u}

Sau đó sao chép lại mọi thứ. Cam kết, đẩy.


0

Bạn chỉ có thể sử dụng lệnh này:

git restore --staged <file>

0
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)

-1

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.

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.