Git'teki ilk taahhüt nasıl kaldırılır?


179

Git'teki ilk taahhüdü nasıl kaldıracağımı merak ediyorum.

Herhangi bir şey yapmadan önce yapılan revizyon nedir? Bu düzeltmenin bir adı veya etiketi var mı?


2
Git ile başlamak için, revizyonun anlamsız olduğunu bilmelisiniz. Taahhütler veya onların göreli SHA'ları hakkında konuşabilirsiniz. Ayrıca, bunu neden yapmak istersiniz? İlk taahhüt her şeyin üzerine inşa edildiği şeydir. İlk taahhüdü de dahil olmak üzere birkaç taahhüdü birlikte ezebilirsiniz, bu da yeni ilk taahhüt haline gelir, ancak ilk taahhüdü silmek (veya son taahhüdü dışında herhangi birini silmek) ne anlama gelir?
Shahbaz

@Shahbaz evet, bu en iyi yol, örneğin buraya bakın: ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
timaschew

5
Kullanabilirsiniz git rebase -i --root. Ayrıntılar için aşağıdaki SO yanıtına bakın: stackoverflow.com/questions/2246208/…
MKroehnert


Bu yanıt , mevcut şubenin kök taahhüdünü silmek için doğru çözüme sahiptir:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
Jody Bruchon

Yanıtlar:


322

Benim için en güvenli yol şu update-refkomutu kullanmaktır :

git update-ref -d HEAD

Adı belirtilen başvuruyu siler HEAD, böylece geçerli dalınızdaki tüm taahhütlerinizi sıfırlar (yumuşak bir şekilde çalışmanızı kaybetmezsiniz) .

İstediğiniz ilk işlemi ikincisiyle birleştirmekse, şu rebasekomutu kullanabilirsiniz :

git rebase -i --root

Son bir yol, yetim bir dal, aynı içeriğe sahip ancak herhangi bir taahhüt geçmişi olmayan bir dal oluşturmak ve yeni içeriğinizi buna bağlamak olabilir:

git checkout --orphan <new-branch-name>

7
Bunun kabul edilen cevap olmaması çok kötü. Ayrıca google üzerinde en çok hit az "ilk taahhüt geri alamazsınız" demek çok kötü. Bu benim için hile yaptı. Teşekkürler!
danielpops

1
Desteğiniz için teşekkürler @danielpops! Bu soruyu 3 yıl sonra yanıtladığımı fark etmek güzel. Git bu arada evrim geçirdi.
tzi

Rebase kullandım, ikinci taahhüdü "squash" olarak işaretledim ve sonra bir --force orijini ittim. Teşekkürler!
Philip Atz

1
git update-ref -d HEAD, yalnızca ilk taahhüdü değil, tüm geçmişi kaldırmanın en güvenli yoludur.
user1767316

Yaptım ve ilk işleme eklediğim tüm dosyalarımı sildim. Üzgün. En azından fazla değildi
Vyacheslav Tsivina

42

İlk taahhütten önce hiçbir şey yoktur, çünkü her taahhüt bir üst taahhütten bahseder. Bu, ilk taahhüdü özel kılar (yetim taahhüdü), bu nedenle önceki bir "duruma" atıfta bulunmanın yolu yoktur.

Dolayısıyla, taahhüdü düzeltmek istiyorsanız, basitçe yapabilirsiniz git commit --amend: bu, başka bir tane oluşturmadan taahhüdü değiştirir.

Her şeye yeniden başlamak istiyorsanız, .gitdeposu silin vegit init


7
Bu cevap yanlış: İlk taahhütten önce devlete dönmenin bir yolu var. Aşağıdaki tzi'nin cevabına bakınız.
David Nelson

2
--amendAyrıca başlangıçta yanlış yapılandırmadığınızdan edildi düzgün eğer yazar güncelleme olmayacaktır. İhtiyacım olan şey bu yüzden kabul edilen cevabı kullandım ve yerine yeni bir taahhüt yaptım.
Mark Edington

11
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master

3
Yanıt değil: Soru, "son işlem hariç her şeyin nasıl silineceği" değil, "ilk işlemin nasıl kaldırılacağı" idi.
peterh - Monica'yı eski durumuna getir

1
Tam olarak bunu arıyordum. Teşekkürler!
Krzysztof Tomaszewski

6

İlk taahhüdünüzü düzenlemek isteyebilirsiniz (git git deposunda her zaman ilk taahhüt vardır). git commit --amend --reset-authorHer zamanki yerine kullanmayı düşünün git commit --amend.


1
Yanıt değil: soru ilk taahhüdü silmek ve sonuncunun özelliklerini değiştirmek istemedi.
peterh - Monica

@ peterh-ReinstateMonica Açıklama için: Etkileşimler, içeriklerini tamamen değiştirmek için değişiklikler yapılabilir, ancak yazarı değiştirmek için --reset-author sağlanmalıdır. Bununla, ilk taahhüdünüzü tamamen beğeninize göre değiştirebilirsiniz. Ayrıca CharlesB'nin cevabına da bakınız.
Max Beikirch

3

Hiç gitmemiş gibi bir depodan tüm git taahhütlerini geri almanın bir yolunu arıyordum.

Yeniden pazarlama bir noktaya kadar çalışacaktır. Bununla birlikte, ilk (kronolojik olarak en eski git kesinliği) her zaman sorunlu olacaktır, çünkü bir ebeveyni yoktur, bu yüzden hata verir.

Bu cevapların hiçbiri bunu benim için çözmedi. Ama birçok arama ve deneme yanılma işleminden sonra, bunun işe yaradığını gördüm!

git update-ref -d HEAD
git push origin master -f

Umarım bu size yardımcı olur. İyi günler.


1
Bu yanıtı okuyan herkes için açık olmak gerekirse: bu her taahhüdü siler, ancak OP yalnızca bir repo için yapılan ilk taahhüdü silmek istiyor; bunu TÜM taahhütleri sileceği için ilk taahhüdü silmek için çalıştırmayın.
Jody Bruchon

2

Yapabileceğiniz başka bir yol:

  1. Saklamak istediğiniz bir şubeye çıkış yapın (deyin) git checkout dev
  2. Şimdi sıfırlamak istediğiniz dalı silin git branch -D master
  3. Şimdi aynı ada sahip boş bir şube oluşturun git checkout --orphan master

Tabii ki, tüm bunlar kullanıcı tabanınıza bağlıdır, ancak birden fazla şubeniz varsa, .gitdizini silmek mantıklı değildir.


3
Bunu yaptıktan sonra, itmeden önce uzaktan kumandadaki dalı silmeniz gerekir. Aksi takdirde, itmeye çalışırken şu hatayla karşılaşırsınız:! [reddedildi] master -> master (hızlı ilerlemeyen) - hata: bazı referansları 'git@github.com: r1 / r2.git' adresine iletemedi - ipucu: Geçerli dalınızın ucu olduğundan güncellemeler reddedildi arkasında - ipucu: uzak muadili. Uzaktan değişiklikleri (örn. İpucu: 'git pull ...') tekrar itmeden önce entegre edin ... - Git yaparsanız tüm işlemler geri döner.
dxvargas

2

Diğer dalları tutmak istiyorsanız, ancak örneğin masterdiğer dallara ortak bir geçmişi olmadan şubeyi yeniden başlatacaksanız, bunu başarmanın güvenli bir yolu yeni bir havuz oluşturmak ve bunun içeriğini eski dosyanızda zorlamaktır:

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

Bu newmaster, eski depoda, diğer dalların hiçbiriyle ortak olmayan bir tarihle dal yaratır . Tabii ki master, ile de üzerine yazabilirsiniz git push -f.

Tüm şubeleri ve mevcut tüm içeriği yok etmek istiyorsanız, çalıştırın

rm -rf .git/

1
Yanıt değil: OP ilk taahhüdü kaldırmak ve mevcut çalışma ağacı ile ilk taahhüt olarak yeni bir git repo başlatmamak istedi.
peterh - Monica

@peterh git rebase --rootMuhtemelen OP'nin istediği şey olduğunu kabul ediyorum , ancak bu cevabın iki yukarı oyu varsa, birisinin hala alakalı bulması durumunda silmekten kaçınacağım.
user1338062

İlk bazı dalında taahhüt silmek istiyorsanız ve orada - Bu cevabı tam olarak alakalı olduğunu düşünüyorum olduğu tek taahhüt! (Ancak diğer taahhütleri diğer dallarda da tutmak istersiniz; ve bunu aynı zamanda yapmak istersiniz, böylece değişiklikler sadece yerel olarak değil Bitbucket veya Github'da sonuçlanır.) Bu cevabın bunu yapmanın bir yolu olduğuna inanıyorum ve Bence bunu yapmanın tek yolu bu olabilir. (Çünkü - görebildiğim kadarıyla - bazı şubeleri olan uzak bir dal üzerinde hiçbir taahhüt olmaksızın yerel bir şubeyi zorla zorlamanın bir yolu yoktur.)
MikeBeaton

0

Sadece işlediyseniz ancak itmediyseniz .git dizinini kaldırın ve git inittekrar ...


@peterh Evet öyle. OP'nin sorusunun ilk taahhüdü silmek ama sonraki taahhütleri tutmak istemekle ilgili olduğunu düşünüyorum (sanırım). Bir başka olasılık (Gayet iyi OP'ın sorusunu maçları düşünmek - ve hangi Bu cevap olduğunu bir cevap) ilk silmek ve sadece yine boş geri tamamen onu döndükten sonra, bir daldan işlemek isteyen edilir.
MikeBeaton

@MikeBeaton Haklısın. Yorumumu kaldırıyorum, ancak soruyu belirsiz olarak kapatmak için oy vermem gerekiyor. Sadece bu yorumu yaptım, ancak arkamda 40000 ziyaretçi var ve bunların önemli bir kısmı bu soruyu google ile buldu - ve istediklerini elde etmediler.
peterh - Monica'yı yeniden

Aşırı gibi görünüyor. Soru silinsin mi? Mükemmel mantıklı bir soruya verilen tam cevabın, ... vs. ye bağlı olarak alınması gereken iki farklı yaklaşımın olduğu (mükemmel bir şekilde) iddia edilemez mi? (Ben, kendi adıma, anlamına olurdu değil sadece var işlemek ve ayrıca zaman ilk taahhüt kaldırma zaman ilk taahhüt nasıl kaldırılacağını bilmek mi olduğunu bağımlı yaşıyor kesinlikle Kesinlikle belli değil. Sadece işlemek ve uygulamaya özel detaylar üzerinde, aslında her durumda gerçekten oldukça farklı yaklaşımlara ihtiyaç olduğu ortaya çıkıyor.)
MikeBeaton

0

Sorunun cevabı şunlara bağlıdır:

  • İlk VE SADECE bir dalda (diğer dalları olduğu gibi bırakırken) veya

  • Bir sonraki dalda (ve diğer dallarda) 'yerinde bırakarak' bazı şubelerdeki ilk taahhüdü kaldırmak istiyorsunuz.

Bunlardan ikincisi nispeten daha basittir. Temelde kök salmak zorundasınız - buradaki cevapların çoğu bunu yapmanın yolları hakkında.

İkincisini yapmak (diğer dalları yalnız bırakırken bir daldan ilk ve tek taahhüdü kaldırmak) daha zordur. Ya da en azından, olmasını istiyorsanız ve değişikliğin GitHub veya Bitbucket'e geri yansıtılması için özellikle daha zor. Git'te (anlatabildiğim kadarıyla) Git'te herhangi bir taahhüt olmaksızın bir dalı itmeye veya zorlamaya zorlanamaz. Ve ayrıca (yine, görebildiğim kadarıyla) GitHub veya Bitbucket'te herhangi bir taahhüt olmadan yeni, boş bir dal oluşturmanın hiçbir yolu yoktur. Bu nedenle, tamamen boş bir dal oluşturmak için yeni bir havuz oluşturmanız ve ardından istediğiniz dalı (istediğiniz taahhütler dahil) geri eklemeniz gerekir; @ user1338062'nin cevabına göre.

Bu yüzden umarım bu cevap açık olmayan şeyleri açıklığa kavuşturacaktır - sırayla , her ikisi de yapmak isteyebileceğiniz iki farklı (az ya da çok makul) senaryo için, alınması gereken iki farklı yaklaşım vardır. OP'nin istediklerini yaparak tamamen ustalaşmak için.

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.