Я використовую Git, і я створив декілька файлів, використовуючи
git commit -a
Пізніше я виявив, що файл був помилково доданий до комітету.
Як я можу видалити файл з останньої фіксації?
git reset filepath
Я використовую Git, і я створив декілька файлів, використовуючи
git commit -a
Пізніше я виявив, що файл був помилково доданий до комітету.
Як я можу видалити файл з останньої фіксації?
git reset filepath
Відповіді:
Я думаю, що інші відповіді тут невірні, оскільки це питання про переміщення помилково прийнятих файлів назад в область постановки з попереднього комітету, не скасовуючи внесення змін до них. Це можна зробити так, як запропонував Парітош Сінгх:
git reset --soft HEAD^
або
git reset --soft HEAD~1
Потім скиньте небажані файли, щоб не вилучити їх:
git reset HEAD path/to/unwanted_file
Тепер знову покладіть команду, навіть можете повторно використовувати те саме повідомлення про фіксацію:
git commit -c ORIG_HEAD
git push
виправити її до репо, вона поскаржиться Updates were rejected because the tip of your current branch is behind its remote counterpart.
. Якщо ви впевнені, що хочете натиснути на них (наприклад, це ваша виделка), тоді ви можете скористатися -f
опцією для натискання, наприклад git push origin master -f
. (Не робіть цього до репо за течією, з якої
git reset --soft HEAD^
це моя найпоширеніша операція скасування
git reset
але хотів, якби вплинути на існуючий комітет "на місці". Я щойно дізнався про це git commit -C
. Тож для мене те, що я хочу, - це ваш точний рецепт з ще одним кроком, прописаний як «новий вчинок знову» git commit -C [hash of original HEAD commit from first step]
.
УВАГА ! Якщо ви хочете лише видалити файл із попереднього комітету та зберегти його на диску , прочитайте відповідь juzzlin трохи вище.
Якщо це ваше останнє зобов’язання і ви хочете повністю видалити файл з вашого локального та віддаленого сховища , ви можете:
git rm <file>
git commit --amend
Прапор поправки говорить git знову здійснити, але "об'єднати" (не в сенсі злиття двох гілок) цю команду з останньою командою.
Як зазначено в коментарях, використання git rm
тут - це як використання самої rm
команди!
git rm --cached
для збереження файлів на диску
rm
git
rm
git commit --amend
все ще існує і може бути знайдена, наприклад, з git reflog
. Тож це не так вже й погано, як підказують інші коментарі.
Існуючі відповіді говорять про видалення непотрібних файлів з останнього фіксації.
Якщо ви хочете видалити непотрібні файли зі старої фіксації (навіть натиснутої) та не хочете створювати нову фіксацію, що є зайвим через дії:
1.
Знайдіть комітку, якій ви хочете, щоб файл відповідав.
git checkout <commit_id> <path_to_file>
це можна зробити кілька разів, якщо ви хочете видалити багато файлів.
2.
git commit -am "remove unwanted files"
3.
Знайдіть commit_id комісії, на якій файли були додані помилково , скажімо, тут "35c23c2"
git rebase 35c23c2~1 -i // notice: "~1" is necessary
Ця команда відкриває редактор відповідно до ваших налаштувань. Типовим є vim.
Перемістіть останню команду, яка має бути "видалити непотрібні файли", до наступного рядка неправильної фіксації ("35c23c2" у нашому випадку) та встановіть команду як fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Ви повинні бути гарними після збереження файлу.
Закінчувати :
git push -f
Якщо у вас, на жаль, виникають конфлікти, вам доведеться їх вирішувати вручну.
git rm --cached <file(s)>
.
--fixup=35c23c2
до git commit
команди. Це дозволить автоматично встановити фіксацію як фіксацію необхідної фіксації, і тому вам не потрібно буде вказувати її в ребазі. Крім того, якщо ви додасте --autosquash
до git rebase
команди, git автоматично перемістить ваш комітет у потрібне місце, тому вам не потрібно нічого робити в інтерактивній базі даних - просто збережіть результат (це означає, що вам навіть не потрібно -i
позначити прапор, хоча я люблю використовувати його так чи інакше, щоб переконатися, що все виглядає так, як я очікую)
Як вказує прийнята відповідь, ви можете це зробити, скинувши всю комісію. Але це досить важкий підхід.
Більш чистим способом зробити це було б зберегти фіксацію та просто видалити змінені файли з неї.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
Буде приймати файл , як це було в попередній фіксації і стадії його в індексі. Файл у робочому каталозі недоторканий.
Тоді git commit
заповіт буде скоєно та розбити індекс на поточний.
Це по суті займає версію файлу, яка була в попередньому фіксації, і додає її до поточної фіксації. Це не призводить до чистих змін, і таким чином файл ефективно видаляється з фіксації.
Якщо ви не натиснули зміни на сервері, ви можете використовувати
git reset --soft HEAD~1
Він скине всі зміни та повернеться до одного повернення
Якщо ви змінили свої зміни, виконайте дії, відповіді на @CharlesB
Видалення файлу за допомогою rm видалить його!
Ви завжди додаєте команду в git, а не видаляєте, тому в цьому випадку поверніть файл у стан, у якому він був до першої фіксації (це може бути дія "rm", якщо файл новий), а потім повторно введіть і файл піде.
Щоб повернути файл у попередній стан:
git checkout <commit_id> <path_to_file>
або повернути його в стан у віддаленій ГОЛОВІ:
git checkout origin/master <path_to_file>
потім внесіть зміни до комісії, і ви повинні виявити, що файл зник із списку (а не видалений зі свого диска!)
git checkout HEAD~ path/to/file
git commit --amend
Далі буде нестабільним лише той файл, який ви задумали, про що запитав ОП.
git reset HEAD^ /path/to/file
Ви побачите щось таке:
Зміни, які слід вчинити: (використовуйте "git reset HEAD ..." до нестабільності)
змінено: / шлях / до / файл
Зміни, не встановлені для фіксації: (використовуйте "git add ..." для оновлення того, що буде здійснено) (використовуйте "git checkout - ...", щоб відмовити зміни в робочому каталозі)
змінено: / шлях / до / файл
У цей момент ви можете робити все, що завгодно до файлу, наприклад, перезавантаження на іншу версію.
Коли ви готові взяти на себе зобов’язання:
git commit --amend -a
або (якщо у вас відбуваються якісь інші зміни, які ви не хочете здійснювати)
git commit add /path/to/file
git commit --amend
Я поясню вам на прикладі.
Нехай A, B, C - 3 послідовних передачі. Комісія B містить файл, який не повинен був бути скоєний.
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
в edit [A_commit_ID]
абоe [A_commit_ID]
Можна просто спробувати.
git reset --soft HEAD~1
і створити новий комітет.
Однак є дивовижне програмне забезпечення "gitkraken". що полегшує роботу з git.
git commit --amend
буде оновити видалення файлу в останньому фіксації; а згодом ви можете перевірити, чи дійсно його видаленоgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
залишить вам локальний файл все одно. Якщо файл також не потрібно локально, ви можете пропустити параметр --cached.
Якщо вся робота ведеться у вашій місцевій гілці, вам потрібно зберегти файл у подальшому фіксації, і, якби мати чисту історію, я думаю, що більш простим способом зробити це може бути:
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>^
і тоді ви можете легко закінчити базу даних, не запам'ятовуючи більш складні команди або виконуючи повідомлення або вводити стільки.
Використання графічного інтерфейсу git може спростити видалення файлу з попередньої фіксації.
Якщо припустити, що це не спільна гілка, і ви не проти переписувати історію , то запустіть:
git gui citool --amend
Ви можете скасувати перевірку файлу, який був помилково скоєний, і натисніть кнопку "Ввести".
Файл видаляється з фіксації, але зберігається на диску . Тож якщо ви скасували файл після помилкового додавання його, він відобразиться у вашому списку нерозкритих файлів (а якщо ви скасували цей файл після його помилкової модифікації, він відобразиться у ваших змінах, не встановлених для списку комісій).
sudo apt-get install git-gui
git rebase -i HEAD~4
а потім запустив вашу команду, щоб відкрити редактор. Ще одна примітка: "Зняття налаштувань" можна знайти в меню "Зняти".
git reset --soft HEAD^
(пам’ятаючи аргумент --soft Software), за яким слідує git commit -c ORIG_HEAD
(а не --amend, який все накручує).
Якщо ви хочете зберегти свою комісію (можливо, ви вже витратили деякий час на написання детального повідомлення про фіксацію, і не хочете його втрачати), і ви хочете лише видалити файл з комісії, але не повністю з сховища:
git checkout origin/<remote-branch> <filename>
git commit --amend
Виконайте послідовність з наступних команд:
//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'
Просто хотів доповнити верхню відповідь, оскільки мені довелося виконати додаткову команду:
git reset --soft HEAD^
git checkout origin/master <filepath>
Ура!
Щось, що працювало для мене, але все-таки думаю, що має бути краще рішення:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Просто залиште зміну, яку ви хочете скасувати в іншій комісії, перевірте інші
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Насправді, я думаю, що більш швидкий і простий спосіб - це використовувати інтерактивний режим git rebase.
git rebase -i head~1
(або голова ~ 4, як завжди ви хочете піти)
а потім замість "вибору" використовуйте "редагувати". Я не усвідомлював, наскільки потужна «редакція».
https://www.youtube.com/watch?v=2dQosJaLN18
Сподіваюся, вам це стане в нагоді.
Була така сама проблема, коли я маю зміни в місцевій гілці, де я хотів відновити лише один файл. Що для мене працювало -
( функція / target_branch нижче - це те, де я змінив усі зміни, включаючи ті, які хотів скасувати для конкретного файлу)
( походження / особливість / target_branch - це віддалена гілка, куди я хочу натиснути свої зміни)
( функція / постановка - це моя тимчасова гілка постановки, де я буду натискати на всі потрібні зміни, виключаючи зміни до цього одного файлу)
Створіть локальну гілку з мого походження / особливості / target_branch - її називають функцією / інсценізацією
Об'єднаної мій робочий місцеве відділення функції / target_branch до функції / постановка філії
Перевірено функцію / постановку, а потім скинути git --soft ORIG_HEAD (Тепер усі зміни функції / інсценізації 'будуть інсценізовані, але не виконані.)
Незазначений файл, який я раніше зареєстрував, із зайвими змінами
Змінено гілку вгору за течією для функції / постановки на початок / особливість / target_branch
Решту поетапних змін здійснив і перемістив уверх по потоку до мого віддаленого походження / функції / target_branch
Якщо ви використовуєте GitHub і ще не натиснули на зобов'язання, GitHub Desktop вирішує цю проблему легко:
Якщо ви хочете видалити файли з попередніх комісій, використовуйте фільтри
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
Якщо ви бачите цю помилку:
Неможливо створити нову резервну копію. Попередня резервна копія вже існує у refs / original / Force, що перезаписує резервну копію на -f
Просто видаліть резервні копії оновлень на локальному репо
$ rm -rf .git/refs/original/refs
якщо ви ще не натискаєте свої зміни на git
git reset --soft HEAD~1
Він скине всі зміни та повернеться до одного повернення
Якщо це останнє зобов’язання, яке ви здійснили, і ви хочете видалити файл з локального та віддаленого сховища, спробуйте це:
git rm <file>
git commit --amend
а ще краще:
скинути спочатку
git reset --soft HEAD~1
скинути непотрібний файл
git reset HEAD path/to/unwanted_file
здійснити знову
git commit -c ORIG_HEAD
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)
Наразі жодна з відповідей не є розумною. Здається, що достатньо попиту запропонувати реальне рішення: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git - uncommit <ім'я файлу>
було б непогано. Я розумію, що ми не хочемо змінювати історію, але якщо я локальний і випадково додав локальний файл "хак" і хочу видалити його з фіксації, це було б дуже корисно.