Git kullanıyorum ve birkaç dosya kullandım
git commit -a
Daha sonra, bir dosyanın yanlışlıkla işleme eklendiğini gördüm.
Bir dosyayı son işlemden nasıl kaldırabilirim?
git reset filepath
Git kullanıyorum ve birkaç dosya kullandım
git commit -a
Daha sonra, bir dosyanın yanlışlıkla işleme eklendiğini gördüm.
Bir dosyayı son işlemden nasıl kaldırabilirim?
git reset filepath
Yanıtlar:
Buradaki diğer cevapların yanlış olduğunu düşünüyorum, çünkü bu, yanlışlıkla yapılan dosyaları, önceki değişiklikleri izleyen bir aşamadan önceki aşamaya geri taşıma sorusudur. Bu Paritosh Singh'in önerdiği gibi yapılabilir:
git reset --soft HEAD^
veya
git reset --soft HEAD~1
Ardından, istenmeyen dosyaları taahhütten uzak tutmak için sıfırlayın:
git reset HEAD path/to/unwanted_file
Şimdi tekrar taahhüt edin, aynı taahhüt mesajını tekrar kullanabilirsiniz:
git commit -c ORIG_HEAD
git push
repolarınıza kadar düzeltmeye çalışıyorsanız, şikayet edeceğinizi eklemeye değer Updates were rejected because the tip of your current branch is behind its remote counterpart.
. Onları itmek istediğinizden eminseniz (örneğin, çatalınız) -f
, itmeyi zorlamak için seçeneği kullanabilirsiniz , örn git push origin master -f
. (Bunu başkalarının getirdiği yukarı
git reset --soft HEAD^
en yaygın geri alma
git reset
ama mevcut "mevcut" taahhüdü etkilemenin bir yolunu istedim. Az önce öğrendim git commit -C
. Yani benim için istediğim, bir adım daha attığın tarifin "tekrar yeni taahhüt" olduğunu söyledi git commit -C [hash of original HEAD commit from first step]
.
DİKKAT ! Bir dosyayı yalnızca önceki işleminizden kaldırmak ve diskte tutmak istiyorsanız, hemen yukarıdaki juzzlin'in cevabını okuyun .
Bu son işleminizse ve dosyayı yerel ve uzak depodan tamamen silmek istiyorsanız , şunları yapabilirsiniz:
git rm <file>
git commit --amend
Değişiklik bayrağı git'e tekrar taahhütte bulunmasını söyler, fakat bu son taahhüdüyle "birleştirmeyi" (iki şubeyi birleştirmek anlamında değil).
Yorumlarda belirtildiği git rm
gibi , burada kullanmak rm
komutun kendisini kullanmak gibidir !
git rm --cached
dosyaları diskte tutmak için de kullanabilirsiniz
rm
git
edilmektedir yapıyor rm
kendisi yapar!
git commit --amend
işlem hala oradadır ve örneğin ile bulunabilir git reflog
. Yani diğer yorumların önerdiği kadar kötü değil.
Mevcut cevaplar, istenmeyen dosyaları son işlemden kaldırmaktan bahsediyor .
İstenmeyen dosyaları eski bir işlemden (hatta zorla) kaldırmak istiyorsanız ve eylem nedeniyle gereksiz olan yeni bir işlem oluşturmak istemiyorsanız:
1.
Dosyanın uyumlu olmasını istediğiniz taahhüdü bulun.
git checkout <commit_id> <path_to_file>
çok sayıda dosyayı kaldırmak istiyorsanız bunu birkaç kez yapabilirsiniz.
2.
git commit -am "remove unwanted files"
3.
Dosyaların yanlışlıkla eklendiği taahhüdün command_id değerini bulun, burada "35c23c2" diyelim
git rebase 35c23c2~1 -i // notice: "~1" is necessary
Bu komut düzenleyiciyi ayarlarınıza göre açar. Varsayılan değer vim'dir.
"İstenmeyen dosyaları kaldır" olması gereken son komutu, yanlış taahhüdün (bizim durumumuzda "35c23c2") sonraki satırına taşıyın ve komutu şu şekilde ayarlayın fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Dosyayı kaydettikten sonra iyi olmalısınız.
Bitirmek için :
git push -f
Maalesef çatışma yaşarsanız, bunları manuel olarak çözmeniz gerekir.
git rm --cached <file(s)>
.
--fixup=35c23c2
için git commit
komuta. Bu işlem, taahhüdü otomatik olarak gerekli işlemin bir düzeltmesi olarak ayarlayacaktır ve bu nedenle yeniden dağıtımda belirtmeniz gerekmez. Eklerseniz Ayrıca, --autosquash
karşı git rebase
komuta, git otomatik interaktif rebase içinde bir şey yapmanıza gerek kalmaz senin, doğru konuma taahhüt hareket edecek - sadece sonucu tasarrufu (hatta gerekmez anlamına gelen -i
bayrak, Yine de her şeyi beklediğimden emin olmak için kullanmak istiyorum).
Kabul edilen yanıtın belirttiği gibi, bunu tüm taahhüdü sıfırlayarak yapabilirsiniz. Ancak bu oldukça ağır bir yaklaşımdır.
Bunu yapmanın daha temiz bir yolu, taahhüdü korumak ve değiştirilen dosyaları ondan kaldırmak olacaktır.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
Önceki olduğu gibi dosyayı koymak, kendini ve endeksinde bunu sahnelenecek. Çalışma dizinindeki dosyaya dokunulmaz. Daha sonra işlemek ve akıma endeksi taahhüt kabak olacaktır.git commit
Bu, esasen önceki işlemde olan dosyanın sürümünü alır ve geçerli işleme ekler. Bu net bir değişiklik ile sonuçlanır ve böylece dosya kesin olarak etkili bir şekilde kaldırılır.
Sunucudaki değişiklikleri itmediyseniz,
git reset --soft HEAD~1
Tüm değişiklikleri sıfırlayacak ve bir geri dönüşe geri dönecek
Değişikliklerinizi ittiyseniz, @CharlesB tarafından yanıtlanan adımları izleyin
Rm kullanarak dosyayı kaldırmak dosyayı silecektir!
Her zaman git yerine bir taahhüdüne ekleme yapıyorsunuz, bu nedenle dosyayı ilk işlemden önceki durumuna geri döndürün (dosya yeni ise bu bir 'rm' silme işlemi olabilir) ve sonra yeniden taahhüt ve dosya gidecek.
Dosyayı önceki bir duruma geri döndürmek için:
git checkout <commit_id> <path_to_file>
veya uzak KAFA'daki duruma geri döndürmek için:
git checkout origin/master <path_to_file>
sonra taahhüdü değiştirin ve dosyanın listeden kaybolduğunu görmelisiniz (ve diskinizden silinmez!)
git checkout HEAD~ path/to/file
git commit --amend
Aşağıdakiler yalnızca OP'nin istediği dosyayı bozar.
git reset HEAD^ /path/to/file
Aşağıdaki gibi bir şey göreceksiniz ...
Taahhüt edilecek değişiklikler: (değişmeden "git reset HEAD ..." kullanın)
değiştirildi: / path / to / file
Taahhüt için değiştirilmeyen değişiklikler: (taahhüt edilenleri güncellemek için "git add ..." kullanın) (çalışma dizinindeki değişiklikleri atmak için "git checkout - ..." kullanın)
değiştirildi: / path / to / file
Bu noktada, farklı bir sürüme sıfırlama gibi dosyayı istediğiniz her şeyi yapabilirsiniz.
Taahhüt etmeye hazır olduğunuzda:
git commit --amend -a
veya (henüz taahhüt etmek istemediğiniz başka değişiklikler varsa)
git commit add /path/to/file
git commit --amend
Size örnekle anlatacağım.
A, B, C 3 ardışık taahhüt olsun. Taahhüt B, işlenmemiş olması gereken bir dosya içerir.
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
için edit [A_commit_ID]
veya olarak değiştirine [A_commit_ID]
Sadece deneyebilirsiniz.
git reset --soft HEAD~1
ve yeni bir taahhüt oluşturun.
Ancak, harika bir yazılım "gitkraken" var. git ile çalışmayı kolaylaştırır.
git commit --amend
, dosya kaldırma işleminin son işleminizde güncellenmesini sağlamanız gerekir; ve daha sonra, gerçekten kaldırıldığını kontrol edebilirsinizgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
size yerel dosyayı hala bırakacaktır. Dosyayı yerel olarak da istemiyorsanız, --cached seçeneğini atlayabilirsiniz.
Tüm işler yerel şubenizde ise, dosyayı daha sonraki bir taahhütte tutmanız gerekir ve temiz bir geçmişe sahip olmak gibi, bunu yapmanın daha basit bir yolu olabilir:
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>^
ve daha karmaşık komutları hatırlamak veya mesaj veya yazı yazmak zorunda kalmadan rebase'i kolayca bitirebilirsiniz.
Git GUI'yi kullanmak, bir dosyayı önceki işlemden kaldırmayı basitleştirebilir.
Bunun paylaşılan bir şube olmadığını ve geçmişi yeniden yazmanın sakıncası olmadığını varsayarak çalıştırın:
git gui citool --amend
Yanlışlıkla taahhüt edilen dosyanın işaretini kaldırabilir ve ardından "Tamamla" yı tıklayabilirsiniz.
Dosya, işlemden kaldırılır, ancak diskte tutulur . Yanlışlıkla ekledikten sonra dosyanın işaretini kaldırırsanız, izlenmeyen dosyalar listenizde gösterilir (ve yanlışlıkla değiştirdikten sonra dosyanın işaretini kaldırırsanız, değişiklik listesi için hazırlanmayan değişikliklerinizde gösterilir).
sudo apt-get install git-gui
git rebase -i HEAD~4
açmak için komutunu kullandım. Başka bir not: "Kararsızlık", "Tamam" menüsünde bulunabilir.
git reset --soft HEAD^
(--soft arg öğesini hatırlamak) ve ardından git commit -c ORIG_HEAD
(her şeyi berbat eden --amend yerine ) hatadan daha az eğilimli .
Taahhütünüzü korumak istiyorsanız (belki de ayrıntılı bir tamamlama mesajı yazmak için biraz zaman harcadınız ve kaybetmek istemiyorsanız) ve dosyayı yalnızca taahhütten kaldırmak, ancak depodan tamamen kaldırmak istiyorsanız:
git checkout origin/<remote-branch> <filename>
git commit --amend
Aşağıdaki komutların bir sırasını yapın:
//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'
Sadece ekstra bir komut çalıştırmak zorunda gibi üst cevabı tamamlamak istedim:
git reset --soft HEAD^
git checkout origin/master <filepath>
Şerefe!
Benim için işe yarayan, ancak yine de daha iyi bir çözüm olması gerektiğini düşünen bir şey:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Atmak istediğiniz değişikliği diğer taahhütte bırakın, diğerlerine göz atın
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Aslında, git rebase etkileşimli modunu kullanmak için daha hızlı ve daha kolay bir yol olduğunu düşünüyorum.
git rebase -i head~1
(ya da ~ 4 kafa, ne kadar ileri gitmek istersen)
ve sonra "al" yerine "düzenle" yi kullanın. 'Düzenlemenin' ne kadar güçlü olduğunun farkında değildim.
https://www.youtube.com/watch?v=2dQosJaLN18
Umarım faydalı bulacaksınız.
Ben sadece bir dosyaya geri dönmek istedim yerel bir şube değişiklikleri var aynı sorunu vardı. Benim için işe yarayan -
( aşağıdaki özellik / target_branch , belirli bir dosya için geri almak istediğim değişiklikler dahil tüm değişikliklerimin olduğu yerdir)
( origin / feature / target_branch yaptığım değişiklikleri göndermek istediğim uzak dal)
( özellik / aşamalandırma , bu dosyadaki değişiklik hariç tüm istediğim değişikliklerden zorlayacağım geçici aşamalandırma dalıdır)
Başlangıç / özellik / target_branch'ımdan yerel bir dal oluştur - buna özellik / aşamalandırma adı verildi
Benim çalışma yerel şube Birleştirilmiş özellik / target_branch için özellik / evreleme şube
Teslim edilen özellik / evreleme sonra git reset --soft ORIG_HEAD (Şimdi özellik / evreleme'deki tüm değişiklikler aşamalı olacak, ancak kullanılmayacak.)
Gereksiz değişikliklerle daha önce iade ettiğim dosyanın etiketsiz
Özellik / evreleme için yukarı akış dalı başlangıç noktasına / özellik / target_branch olarak değiştirildi
Aşamalı değişikliklerin geri kalanını taahhüt ettim ve uzak kökeni / özelliği / target_branch'ımın yukarısına itti
Önceki işlemlerden dosyaları kaldırmak istiyorsanız filtreleri kullanın
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
Bu hatayı görürseniz:
Yeni bir yedek oluşturulamıyor. Refs / original / -f ile yedeğin üzerine yazmayı zorla seçeneğinde önceki bir yedekleme zaten var
Yerel deponuzdaki refs yedeklerini kaldırmanız yeterli
$ rm -rf .git/refs/original/refs
eğer değişikliklerinizi henüz git'e itmezseniz
git reset --soft HEAD~1
Tüm değişiklikleri sıfırlayacak ve bir geri dönüşe geri dönecek
Son yaptığınız işlem buysa ve dosyayı yerel ve uzak depodan silmek istiyorsanız şunu deneyin:
git rm <file>
git commit --amend
veya daha iyisi:
önce sıfırla
git reset --soft HEAD~1
istenmeyen dosyayı sıfırla
git reset HEAD path/to/unwanted_file
tekrar taahhüt et
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)
Şu anda cevapların hiçbiri makul değil. Gerçek bir çözüm önerilmesi için yeterli talep olduğu anlaşılıyor: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <dosya adı>
güzel olurdu. Geçmişi değiştirmek istemediğimi anlıyorum, ancak yerel ve yanlışlıkla yerel "hack" dosyasını eklediğimde ve taahhütten kaldırmak istiyorsanız bu süper yararlı olacaktır.