Git'te yerel taahhütler nasıl silinir?


263

Bir şey üzerinde çalışıyordum ve tamamen vidalandığına karar verdim ... bir kısmını yaptıktan sonra. Bu yüzden aşağıdaki sırayı denedim:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

Hangi noktada mesaj aldım

Your branch is ahead of 'origin/master' by 2 commits.

Yerel dizinimi silmek ve her şeyi yeniden indirmek zorunda kalmadan yerel taahhütlerimi silmek istiyorum . Bunu nasıl başarabilirim?


6
Her ikisini de yapmaya gerek yoktur git fetchve git pull- çekme getirme ve birleştirme kombinasyonudur.
Eter

12
Kullanıcılar için not: Bu sorunun ana sorununun "Şubeniz N taahhütleri tarafından 'başlangıç ​​/ master'ın önünde" mesajı ile ilgisi yoktur. . Bu mesaj nedeniyle diğer soruları bu sorunun kopyası olarak kapatmayı lütfen durdurun.

Yanıtlar:


581
git reset --hard origin/master

değil tüm kaydedilmesini kaldıracaktır origin/masternerede originrepo adıdır ve masterşube adıdır.


1
Ben "köken / usta" sözdizimi, bir eğik çizgi ile yerel bir repo ifade düşündüm?
Daniel C.Sobral

9
mipadi: Daha doğru bir şekilde ifade edilirse, mevcut dalı, başlangıç ​​/ master ile aynı taahhüdüne işaret edecek şekilde sıfırlar.
Christoffer Hammarström

Bir dalı ifade eder. uzak deponun dalını origin/masterizleyen bir daldır . masterorigin
mipadi

@ DanielC.Sobral No, uzaktan kumandanın şubesine origin/masterbir referanstır . masterorigin
Matthew

1
@littletiger git klasörleri değil, yalnızca dosyaları ve yollarını izler. Bu nedenle, boş klasörleri (dosyasız klasörler veya yalnızca yok sayılan dosyalar) tamamen yok sayar. İçlerine gidecek hiçbir şey olmadığı için hiçbir yerde görünmüyorlar.
Mumbleskates

33

Bir kenara, mipadi'nin yanı sıra (bu arada çalışmalı) yanıtı yapmanın şunu bilmelisiniz:

git branch -D master
git checkout master

Ayrıca tam olarak ne istediğinizi yapar having to redownload everything(teklifiniz açıklanmıştır). Bunun nedeni, yerel deponuzun uzak repo'nun bir kopyasını içermesidir (ve bu kopya yerel dizininizle aynı değildir, kullanıma alınmış dalınızla aynı değildir).

Bir şubeyi silmek son derece güvenlidir ve şubenin yeniden yapılandırılması çok hızlıdır ve ağ trafiği gerektirmez. Unutmayın, git öncelikle tasarım gereği yerel bir repo. Uzak dalların bile yerelde bir kopyası var. Git'e belirli bir yerel kopyanın aslında uzak bir dal olduğunu söyleyen sadece bir miktar meta veri var. Git'te tüm dosyalar her zaman sabit diskinizde bulunur.

Eğer master dışında bir şubeniz yoksa:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Peki bu, yerel olarak yapılan taahhütleri menşe olarak yapılan taahhütlerden nasıl ayırır? Aslında, bana şunu söylerCannot delete the branch 'master' which you are currently on.
Daniel C.Sobral

1. Temel olarak tüm taahhütler, yerel veya menşe kaynaklı olup olmadıklarına bakılmaksızın aynıdır. Önemli olan, geçmişlerin doğru şekilde senkronize edilmiş olmasıdır. Yerel taahhüdünüz yalnızca onları ittikten sonra başlangıçta var olacaktır ve başlangıçta git, başlangıçtaki tarih mantıklı olmayan bir duruma gelebilirse, itmeyi reddeder.
slebetman

2
2. Elbette, şu anda kullanıma alınmış olan dalı silemezsiniz. Master'ı silmek için önce başka bir şubeye göz atın. Başka bir şube yoksa, sadece geçici bir şube oluşturun:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

Ayrıca, uzak repo yerel kopyasının farklı olması hakkında söylediklerime de dikkat edin: git, uzak dal kopyanızdaki dosyaları düzenlemenize ve hatta görüntülemenize izin vermez. Yalnızca uzak daldan daha sonra görüntüleyebileceğiniz ve düzenleyebileceğiniz başka bir dal oluşturmanıza izin verir. Kural olarak, bu yerel dal uzak dal ile aynı ada sahiptir. origin/masterYerel makinenizde kısmen haklısınız . Bu uzak dalın yerel (tam) kopyası. Gerçek uzak dal origin master.
slebetman

Bu benim için çalıştı. Belki de git branch -D mastergerekli değildi, çünkü belirtildiği gibi bir hata oluşturuyor.
Alexis Wilke

15

Yaptığım şey HEAD'e sert bir şekilde sıfırlamaya çalışmak. Bu işlem tüm yerel taahhütleri silecektir:

git reset --hard HEAD^

Bu gerçekten işe yarayan en iyi cevap. Tüm yerel taahhütler atıldı ve HEAD olarak sıfırlandı. ^ Char kullanımı nedir?
karim

@karim '^' muhtemelen regex şeyler, muhtemelen uzun zaman önce manuel dosyada bilmediğim veya okuduğum oldukça derin bir şey .. üzgünüm adam :)
giang nguyen

1
Geç, ancak ^ana taahhüt temsil eder, bu yüzden taahhüt HEAD^edilmemiş değişiklikleri atmak ve şubeyi bir önceki komiteye taşır, en son taahhüdü etkili bir şekilde "siler" (taahhüt hala mevcut olmasına rağmen, şube sadece bunu göstermez). Cevabın sadece bir yerel taahhüdü olacak ve geri kalanı taahhüt edilmemiş değişiklikler. @karim @giang
QuantumQuaver

3

Koşman gerek

git fetch

Tüm değişiklikleri almak ve daha sonra "şubeniz önde" mesajı almayacaksınız.


5
Getirmenin, yerel taahhütlerden kurtulan sorucunun ana sorunuyla bir ilgisi yoktur.

1
ne zaten zaten yerel dosyaları taahhüt ve sonra belirtilen komut ateş etmeye çalışıyorum. Aynı hata mesajını gösterecektir. Git getirmeyi ve git getirmesini -p de denedim. ama aynı hatayı gösteriyor
Morez

1

Uzaktan kumandanın senkronize olmadığı ve güncellenmesi gereken durumlar gördüm. A reset --hardveya branch -Dbaşarısız olursa,

git pull origin
git reset --hard 

bu soruya cevap vermiyor, reset --hardbu durumda bir çalışma
CharlesB

1
Merhaba Charles, reset --hardburada çalışması gereken haklısın . Ancak, ben sadece zaman zaman şube düzgün sıfırlamak başarısız olduğunu ve bir git pull originuzaktan kumandayı yeniden senkronize ve reset --harddüzgün çalışması için izin işaret ediyorum .
Jim Clouse

0

Bir yapmam gerekiyordu:

git checkout -b master

git'in var olmadığını söylediği için,

git -D master
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.