Bir şubede yapılan tüm değişiklikler nasıl iptal edilir?


116

Bir şubede çalışıyorum (yani design) ve bir dizi değişiklik yaptım, ancak hepsini atmam ve depo sürümüyle eşleşecek şekilde sıfırlamam gerekiyor. git checkout designYapacağımı düşündüm , ama bana zaten şubede olduğumu designve değiştirilmiş 3 dosyam olduğunu söylüyor.

Bu değişiklikleri nasıl atarım ve şubeyi şu anda uzak sunucuda olduğu gibi alırım?

Yanıtlar:


207

Not: Bunu GERİ ALAMAZSINIZ .

Deneyin git checkout -folan herhangi bir yerel değişiklikler silinecek bu değil işlenen TÜM şube ve usta.


86

git reset --hard , son işleminizden bu yana her şeyi atmak istiyorsanız size yardımcı olabilir


6
veyagit reset --hard HEAD^
deadfish

28
git reset --hard HEAD^gerçekten kabul edilen cevap olmalı. OP diğer şubeler hakkında soru sormuyordu ...
vphilipnyc

2
Bunu denedim ve sanırım son girişimden bu yana her şeyi sildi, sadece son taahhüdümüzü değil.
Chase Roberts

3
Git reset --hard HEAD ^ denedim ve hala bir sürü izlenmemiş dosya bıraktı. Şimdi bunları basit bir komutla nasıl kaldıracağınızı Google'a aktaralım.
John Deighan

20
git diff master > branch.diff
git apply --reverse branch.diff

Hedefiniz belirli bir şubenin durumunu ana dal ile eşit olacak şekilde ayarlandıysa, bu adımlar çok yararlı olabilir. Bunu yapmak için, bunu belirli bir dalın içinden çalıştırın ve sonra [şube adı] .diff dosyasınıgit rm [branch name].diff
karolus

18

Herhangi bir değişiklik istemiyorsanız designve kesinlikle uzaktaki bir dalla eşleşmesini istiyorsanız, dalı silebilir ve yeniden oluşturabilirsiniz:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
ayrıca: git checkout tasarımı; git reset - hard origin / design
Dan

Şubeyi silmeden önce de taahhüt
ederdim

Yerel şubede uzaktan kumanda olmayan taahhütleriniz varsa, bu bence gerçekten kafa karıştırıcı durumlara girmenin bir reçetesidir. Kesinlikle ediyorum değil bu çözümü kullanın.
erewok

1
@erewok: Soru özellikle soruyu soranın tüm değişiklikleri atmak istediğini söylüyor.
mipadi

Ve bu cevabın bunu başardığını sanmıyorum.
erewok

7

@Will, git immersion gerçekten güzel ve basit bir git öğreticisidir. aşağıdaki durumlarda değişiklikleri nasıl geri alacağınızı gösterecektir: aşamalandırılmamış, aşamalı ve taahhüt edilmiş. laboratuarlar 14-18


2
Sadece şunu söylemek isterim ki, bir yıldan fazla bir süre sonra git daldırma yaptım. OI! Bu kadar çok ... er yapmalıydım
Will

1
Bunun Rubyyüklenmesi gerekiyor ... ki bu her zaman bir seçenek gibi görünmüyor
Vishnu

5

Yerel şubenizdeki değişiklikleri atmak istediğinizde, bu değişiklikleri git stash komutunu kullanarak saklayabilirsiniz.

git stash kaydet "bir_adı"

Değişiklikleriniz kaydedilecek ve isterseniz bunları daha sonra geri alabilir veya silebilirsiniz. Bunu yaptıktan sonra şubenizde taahhüt edilmeyen herhangi bir kod kalmayacaktır ve en son kodu git pull kullanarak ana şubenizden çekebilirsiniz.


4

Kaynak kökte: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

Tüm Değişiklikleri İptal Etmek İçin Tersinir Yöntem:

Bu soruyu birleştirme yaptıktan ve hemen ardından kasayı geliştirmeyi unuttuktan sonra buldum . Tahmin ettiniz: Birkaç dosyayı doğrudan ana bilgisayarda değiştirmeye başladım . D'Ah! Durumum pek benzersiz olmadığından (hepimiz yaptık, değil mi; ->), ustayı yeniden geliştirmek gibi görünmesi için tüm değişiklikleri attığım tersine çevrilebilir bir yol sunacağım .

git diffHangi dosyaların değiştirildiğini görmek ve hatamın kapsamını değerlendirmek için a yaptıktan sonra , şunu çalıştırdım:

git stash
git stash clear

İlk olarak tüm değişiklikleri sakladıktan sonra, daha sonra temizlendi. Ana dosyalarda yanlışlıkla yapılan tüm değişiklikler gitti ve eşlik geri yüklendi.

Şimdi bu değişiklikleri geri yüklemek istediğimi varsayalım. Bunu yapabilirim. İlk adım, temizlediğim / bıraktığım zulanın karmasını bulmak:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Hash'i öğrendikten sonra, taahhüt edilmeyen değişiklikleri başarıyla geri yükledim:

git stash apply hash-of-cleared-stash

Bu değişiklikleri gerçekten geri yüklemek istemedim, sadece onları geri alabileceğimi doğrulamak istedim, bu yüzden onları tekrar sildim.

Diğer bir seçenek de , değişiklikleri silmek yerine zulayı farklı bir şubeye uygulamaktır . Bu nedenle, yanlış dalda çalışmaktan kaynaklanan değişiklikleri temizlemek açısından, stashsize boo-boo'unuzdan kurtulmanız için büyük bir esneklik sağlar.

Her neyse, bir daldaki değişiklikleri temizlemek için tersine çevrilebilir bir yol istiyorsanız, yukarıdakiler bu kullanım durumunda daha az tehlikeli bir yoldur.


-1

git checkout -f

Sorunuz için bu yeterli. Tek şey, bir kez yapıldığında bitmiş olmasıdır. Geri alma yok.

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.