Git şubesinin başlangıç ​​sürümüne sıfırlanması gerekiyor


439

Yanlışlıkla bir süredir olmamam gereken bir dal üzerinde çalışıyordum, bu yüzden uygun adı vererek daldan ayrıldım. Şimdi orijin (github) versiyonuna olmamam gereken dalı üzerine yazmak istiyorum. Bunu yapmanın kolay bir yolu var mı? Şubeyi silmeyi ve ardından izleme şubesini sıfırlamayı denedim, ancak bana sadece üzerinde çalıştığım sürümü veriyor.



Git 2,23 (Ağustos 2019) ile: git switch -C mybranch origin/mybranch. Bkz aşağıda benim Düzenlenen cevabı
VonC

Yanıtlar:


814

Henüz başlamamışsanız, şubenizi yukarı akış şubesine şu yolla sıfırlayabilirsiniz :

git checkout mybranch
git reset --hard origin/mybranch

(Sorunuzda belirttiğiniz gibi ayrı bir dalda en son taahhüdünüzü belirttiğinizden emin olun)

Sıfırlama işleminden hemen sonra, sıfırlama işleminden mybranch@{1}önceki eski işlemeyi ifade eder.

Ancak daha önce ittiyseniz, diğer seçenekler için bkz. " Git dalı oluşturma ve orijinali yukarı akış durumuna döndürme ".


İle Git 2,23 (2019 Ağustos) , yani tek bir komut şöyle olacaktır: git switch.
Yani:git switch -C mybranch origin/mybranch

Misal

C:\Users\vonc\git\git>git switch -C master origin/master
Reset branch 'master'
Branch 'master' set up to track remote branch 'master' from 'origin'.
Your branch is up to date with 'origin/master'.

Bu, endeksi ve çalışma ağacını, tıpkı bir gibi geri yükler git reset --hard.


Tarafından yorumladığı gibi Brad Herman , bir reset --hardolurdu herhangi yeni bir dosya kaldırmak veya HEAD Değiştirilen dosyayı sıfırlamak .

Aslında, "temiz bir sayfadan" başladığınızdan emin olmak için git clean -f -d, sıfırlama işleminden sonra sıfırlama yaptığınız dalla tamamen aynı olan bir çalışma ağacının kullanılmasını sağlar.


Bu blog gönderisi bu takma adları önerir ( masteryalnızca şube için, ancak bunları uyarlayabilir / genişletebilirsiniz):

[alias]
   resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
   resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d

Sonra şunu yazabilirsiniz:

git resetupstream

veya

git resetorigin

26
bu, TAMAMLANMADI / KADEMELİ değişiklikleri SİLECEK (--hard'dan)
Peter Ehrlich

5
Ben kullandım git reset --hard origin/mybranchben herhangi bir yerel değişiklikler hakkında umursamadı zaman komutunu birkaç kez ve sadece orijinini eşleşen temiz bir kopyasını istedi. Ancak, bugün bu işe yaramadı - hala bir avuç yeni, dizginsiz dosyam vardı ve git bana HEAD'de olduğunu vaat etti. Hakkında not git clean -f -d, istemediğim tüm yeni dosyaları silerek düzeltildi.
Matthew Clark

@MatthewClark Beklenen: bkz. Stackoverflow.com/q/4327708/6309
VonC

1
Harika! Ayrıca birçok kez git reset --hard HEADherhangi bir değişiklik yok
sayılan

Sourctree ile de bu mümkün müdür?
Lonzak

20

Ne olduğunu varsayarsak:

# on branch master
vi buggy.py                 # you edit file
git add buggy.py            # stage file
git commit -m "Fix the bug" # commit
vi tests.py                 # edit another file but do not commit yet

O zaman yanlış dalda değişiklik yaptığınızı anlarsınız.

git checkout -b mybranch    # you create the correct branch and switch to it

Ama masterhala taahhüdünüzü gösteriyor. Daha önce işaret ettiği yeri göstermesini istiyorsunuz.

Çözüm

En kolay yol:

git branch --force master origin/master

Başka bir yol:

git checkout master
git reset --soft origin/master
git checkout mybranch

Kullanmanın reset --hard, kullanılmayan değişikliklerinizin kaybolmasına neden olacağını unutmayın (örneğimde tests.py).


Cevabımdan daha güvenli görünüyor;) +1
VonC

8

Bir sunucu üzerinde özel bir repo var ve düzenli olarak rebase / force-push, diğer bilgisayardaki yerel dalı sık sık gerekli kılar. Bu nedenle, şu andaki dal için bunu yapmanıza izin veren aşağıdaki takma adı "catchup" ı oluşturdum. Diğer cevabın aksine, bu takma adda sabit kodlanmış dal adı yoktur.

Sıkı tutun.

[alias]
  catchup = "!f(){ echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \"; read -r ans; if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)); else echo \"catchup aborted\"; fi }; f"

Düzgün biçimlendirilmiş (.gitconfig içindeki yeni satırlarla çalışmaz) şöyle görünür:

"
!f(){
  echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \";
  read -r ans;
  if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then
    git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD));
  else
    echo \"catchup aborted\";
  fi
}; f
"
  • \\033[0;33mVe \\033[0mrenk ile şimdiki şube ve memba vurgulayan içindir.
  • $(git symbolic-ref -q --short HEAD) geçerli şube adı
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) mevcut dalın yukarı akışını gösterir.

Sıfırlama potansiyel olarak tehlikeli bir çağrı olduğundan (özellikle --hard seçeneğiyle, taahhüt edilmeyen değişiklikleri kaybedersiniz), önce size ne yapacağını söyler. Örneğin şube iseniz dev-kap uzaktan adında qcpp / dev-kap ve girdiğiniz git catchupsen istenir:

dev-container'ı qcpp / dev-container'a sıfırlansın mı? (E / H)

Daha sonra y yazarsanız veya yalnızca return tuşuna basarsanız, sıfırlama işlemi gerçekleştirilir. Başka bir şey girerseniz sıfırlama gerçekleştirilmez.

Süper güvende olmak ve programsız olarak değiştirilmemiş / taahhüt edilmemiş değişiklikleri kaybetmeyi önlemek istiyorsanız, yukarıdaki dizini diff-index denetimlerine göre daha fazla pezevenk yapabilirsiniz .

Zorunlu uyarı kelimesi: Eğer halka açık bir depo üzerinde çalışıyorsanız, başkalarının dayandığı diğer insanlar üzerinde çalıştınız ve bu takma isme ihtiyacınız varsa, yanlış yapıyorsunuz ™ .


1

Bunu denedim ve mevcut şubemi en son uzak github'a sıfırlamadı. Google'a gittim ve https://itsyndicate.org/blog/how-to-use-git-force-pull-properly/ buldum

önerilen

git fetch origin master
git reset --hard origin/master

V8 şubemi sıfırlamak istedim ve yaptım

git fetch origin v8
git reset --hard origin/v8

ve işe yaradı


Getirmekten bahsetmen iyi olur. Bunu bir kez olmadan yaptım ve her şeyi 2 yıl önce sıfırladım :)
Adam
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.