Yerel veri havuzu dalını tıpkı uzak depo kafası gibi sıfırlayın


3851

Yerel şubemi tıpkı uzak depodaki şube gibi olacak şekilde nasıl sıfırlarım?

Yaptım:

git reset --hard HEAD

Ama koştuğumda git status,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

Bana neden bu 'değiştirilmiş' olduğumu söyler misiniz? Bu dosyalara dokunmadım mı? Eğer yapsaydım, bunları kaldırmak istiyorum.


8
git statusİkinci komutunuzun çıktısına göre git reset --hard HEADbaşarısız oldu. Yine de çıktısını yapıştırmadın. → Eksik soru.
Robert Siemer

2
Burada iki sorunu karıştırıyorsunuz: 1) yerel bir dalın uzaktan kumandanın olduğu noktaya nasıl sıfırlanacağı ve 2) aşamalandırma alanınızı (ve muhtemelen çalışma dizinini) nasıl temizleyeceğinizi git statussöylüyor nothing to commit, working directory clean. - Lütfen belirtin!
Robert Siemer

Yanıtlar:


6690

Şubenizi uzak dalla tam olarak eşleşecek şekilde ayarlamak iki adımda yapılabilir:

git fetch origin
git reset --hard origin/master

Bunu yapmadan önce mevcut şubenizin durumunu kaydetmek istiyorsanız (her ihtimale karşı), şunları yapabilirsiniz:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

Şimdi geri almak istediğinize karar vermeniz durumunda (veya daha sonra bakmak veya güncellenmiş dalınıza göre farklılaştırmak istediğinizde) çalışmanız şubeye "kaydedilmiş-çalışm" kaydedilir.

İlk örnekte, uzak repo adının "orijin" olduğunu ve uzak repodaki "master" adlı dalın, yerel repo'nuzda şu anda kullanıma alınmış dalla eşleştiğini unutmayın.

BTW, içinde bulunduğunuz bu durum, halihazırda çıplak olmayan bir deponun kullanıma alınmış dalına bir itme yapılan yaygın bir davaya benziyor. Yakın zamanda yerel repoya girdiniz mi? Değilse, endişelenmeyin - başka bir şey bu dosyaların beklenmedik şekilde değiştirilmesine neden olmuş olmalıdır. Aksi takdirde, çıplak olmayan bir depoya (özellikle şu anda kullanıma alınmış dalda değil) itilmesinin tavsiye edilmediğini bilmelisiniz.


4
Cevabınız için teşekkür ederim. 'İlk örnekte uzak repo adının "köken" olduğunu ve uzak repodaki "master" adlı dalın yerel repodaki dalla eşleştiğini varsaydığınızı unutmayın. 'Git reset --hard' komutunu yürütmeden önce emin olmak için uzak repomun adını ve şube adımı nasıl iki kez kontrol edebilirim? Tekrar teşekkürler.
hap497

21
Uzaktan kumandayı açıkça adlandırmadıysanız, adı büyük olasılıkla "orijin" (varsayılan) olur. Tüm uzak adların bir listesini almak için "git remote" kullanabilirsiniz. Daha sonra "git remote <name>" öğesini kullanarak hangi dalların birbirleriyle ittiğini / çektiğini görebilirsiniz (örneğin, "master" dalınız "origin" adlı uzaktan kumandadaki "master" dan klonlanmışsa, bir satır alırsınız "master uzak master ile birleşir").
Dan Moulding

6
"Çıplak olmayan bir depoya itilmesi önerilmez (ve şu anda teslim alınmış şubeye değil, özellikle" Neden? "
LeeGee

27
Getirmeden hemen sonra, git reset FETCH_HEAD --hardbunun yerine yapabileceğinize inanıyorum , bu da aynı anlama geliyor.
Jean

6
Eklediğim dosyaları kaldırmadı.
Trismegistos

416

Yapmam gerekiyordu (kabul edilen cevaptaki çözüm):

git fetch origin
git reset --hard origin/master

Bunu takiben:

git clean -f

yerel dosyaları kaldırmak için

Hangi dosyaların kaldırılacağını görmek için (gerçekten kaldırmadan):

git clean -n -f

89
ayrıca, git clean -d -fizlenmeyen dizinler varsa.
garg

54
ayrıcagit clean -fdx
Swapnil Kotwal

14
Uzak dalın tam kopyasını istiyorsanız git clean -ffdx ile takip etmeniz gerekir. Thare'in iki f olduğuna dikkat edin.
Trismegistos

6
git clean -fİhtiyacım önemli parçası oldu. Teşekkürler!
dgo

17
temiz komutunu kullanırken dikkatli olun. yok sayılan dosyaları diğer dallardan silebilir.
mikoop

307

İlk olarak, HEADkarşılık gelen yukarı akış dalının önceden getirilmiş olanına sıfırlayın :

git reset --hard @{u}

Belirtmenin @{u}veya ayrıntılı formunun avantajı @{upstream}, uzak repo ve şubenin adının açıkça belirtilmesine gerek olmamasıdır.

Ardından, gerektiğinde, izlenmeyen dosyaları isteğe bağlı olarak aşağıdakilerle de kaldırın -x:

git clean -df

Son olarak, gerektiğinde en son değişiklikleri alın:

git pull

54
Bu, kabul edilenden daha iyi bir yanıt gibi görünüyor, çünkü her zaman statik olandan ziyade mevcut yukarı akış dalına dinamik olarak sıfırlanıyororigin/master
Jon z

@Jonz nokta @{upstream}, çok kullanışlı ve takma adlarda kullanılabilir:alias resetthisbranch="git reset --hard @{upstream}"
Siddhartha

1
@GangadharJannu git reset --hardbir taahhüt gerektirir, aksi takdirde neyi sıfırlayacağınızı bilemez. @{u}belirli bir taahhüdü işaret eder - en son yaptığınız andan itibaren izlenen dalın başı git fetch.
Kristoffer Bakkejord

1
@KristofferBakkejord Açıklama için teşekkürler ama taahhüt karması olmadan bile git reset --harduzak şubeye sıfırlamayacak olsa da yapabiliriz
Gangadhar JANNU 16:19

3
Burada neredeyse yeni bir soru açan herkes için, eğer Powershell'den ayrılırsanız, quotes ( git reset --hard "@{u}") kullanın . Bunu çözmem için biraz zamanımı aldı.
MPStoering

112

git reset --hard HEADaslında yalnızca son taahhüt edilen duruma sıfırlanır. Bu durumda HEAD, şubenizin HEAD'ini ifade eder.

Birden fazla taahhüdünüz varsa, bu işe yaramaz ..

Muhtemelen yapmak istediğiniz şey, başlangıç ​​noktasına veya uzak depoya ne denirse sıfırlanır. Muhtemelen sadece böyle bir şey yapardım

git reset --hard origin/HEAD

Yine de dikkatli olun. Sert sıfırlamalar kolayca geri alınamaz. Dan'ın önerdiği gibi yapmak ve sıfırlamadan önce değişikliklerinizin bir kopyasını dallamak daha iyidir.


2
Cevabımda Dan'ın daha önce yakaladığı yönünde yanlış bir öneri vardı. Kimseyi yoldan saptırmak istemediğim için düzenledim. Orijin / master veya orijin / HEAD şeylerine gelince, bunun önce bir getirme yapıp yapmadığınıza bağlı olduğunu düşünüyorum. Kökeni klonladıysanız ve oldukça yaygın olduğunu düşündüğüm başka dalları yoksa, o zaman onu sıfırlamalıdır. Ama elbette, Dan haklı.
Mikael Ohlson

73

Yukarıdaki önerilerin tümü doğrudur, ancak genellikle projenizi gerçekten sıfırlamak için, içindeki dosyaları bile kaldırmanız gerekir .gitignore.

Proje dizininizi silmenin ve uzaktan kumandadan yeniden klonlamanın ahlaki eşdeğerini elde etmek için:

git fetch
git reset --hard
git clean -x -d -f

Uyarı : git clean -x -d -fise geri dönüşümsüz ve dosya ve veri (kullanmakta ihmal var mesela şeyler kaybedebilir .gitignore).


12
Uyarı: "git clean -x -d -f" geri döndürülemez ve .gitignore dosyasında veri ve veri kaybedebilirsiniz
Akarsh Satija

Biraz daha kısa: git clean -xdfeşittir git clean -x -d -f.
Kiryl

depoda olmayan her şeyi kaldırmak için git clean -ffxd
Trismegistos

44

Aşağıdaki komutları kullanın. Bu komutlar izlenmeyen tüm dosyaları local git'den de kaldıracaktır

git fetch origin
git reset --hard origin/master
git clean -d -f

6
Bu daha eksiksiz bir yanıttır çünkü git clean -d -fyerel dizinde eski şubenin bazı şeyleri olmayacak . Teşekkürler dostum.
Flavio

3
GERÇEKTEN uzaktan kumanda gibi olmasını sağlayan budur. Temiz önemlidir.
David S.

1
git clean -ffxd her şeyi gerçekten kaldırmak için
Trismegistos

1
Tam da ihtiyacım olan şey bu. Teşekkürler
AllJs

38

Soru burada iki konuyu karıştırıyor:

  1. yerel bir dalı uzaktan kumandanın olduğu noktaya sıfırlama
  2. Böylece, nasıl (ve muhtemelen çalışma dizini) kademelendirme alanını temizlemek için git statusdiyornothing to commit, working directory clean.

Tek noktadan cevap:

  1. git fetch --prune (isteğe bağlı) Uzak deponun yerel anlık görüntüsünü günceller. Diğer komutlar yalnızca yereldir.
    git reset --hard @{upstream}Yerel dal işaretçisini, uzaktan kumandanın anlık görüntüsünün olduğu yere koyar, ayrıca dizini ve çalışma dizinini bu taahhüdün dosyalarına ayarlayın.
  2. git clean -d --force Git'e “çalışma dizini temiz” demeyi engelleyen izlenmemiş dosyaları ve dizinleri kaldırır.

1
@{upstream}Sözdizimi eğer varsayılan olarak gerçekleşir set olmak memba gerektirir git checkout <branchname>. - Aksi takdirde ile değiştirin origin/<branchname>.
Robert Siemer

Taahhütte olmayan her şeyi kaldırmak -xiçin ekleyin git clean(örneğin .gitignore mekanizmasıyla yok sayılan dosyalar).
Robert Siemer

22

Bu düzenli olarak karşılaştığım bir şey ve Wolfgang'ın yukarıda verilen herhangi bir şubeyle çalışmak için sağladığı senaryoyu genelleştirdim

Ayrıca bir "eminseniz" istemi ve bazı geri bildirim çıktıları ekledim

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

3
uzaktan kumandanın adını almak için "git remote" kullanabilirsiniz. Bazı durumlarda, "menşei" olmayacak
Yurik

17

Uzak deponun olması originve ilginizi çekmesi şartıyla branch_name:

git fetch origin
git reset --hard origin/<branch_name>

Mevcut şube sıfırlamak için de, gitmek originiçin HEAD.

git fetch origin
git reset --hard origin/HEAD

Nasıl çalışır:

git fetch origin hiçbir şeyi birleştirmeye veya yeniden pazarlamaya çalışmadan uzaktan en son sürümü indirir.

Daha sonra dalı yeni git resetgetirdiğiniz <branch_name>şeye sıfırlar . Bu --hardseçenek, çalışma ağacınızdaki tüm dosyaları, içindeki dosyalarla eşleşecek şekilde değiştirir origin/branch_name.


14

Yaptım:

git branch -D master
git checkout master

şubeyi tamamen sıfırlamak


Not, gerekli dalı silebilmek için başka bir şubeye gitmelisiniz


5
Soruyu bir kez daha okumalısınız, uzaktan kumandayı etkilemekle ilgili hiçbir şey yok, ancak uzaktan kumanda ile aynı ayar yapmak, bu yüzden uzaktan kumanda ile hiçbir şey yapmamalısınız ve bu benim durumumda ve yukarıdakilerin dışında yardımcı oldu.
user2846569

Uzaktan kumandayla aynı şekilde ayarlamak istiyorsanız, en azından bir noktada getirmeniz gerekir, kabul etmiyor musunuz?
Tim

2
en azından bunu denemeli veya dokümanları okumalısınız: kernel.org/pub/software/scm/git/docs/git-checkout.html
user2846569

Yolda, dalında bozuk bir .pck dosyası vardı ve seçeneklerin geri kalanı işe yaramadı, teşekkürler !!
LuckyBrain

14

İşte en popüler yanıtın önerilerini otomatikleştiren bir komut dosyası ... Dalları destekleyen gelişmiş bir sürüm için bkz. Https://stackoverflow.com/a/13308579/1497139 .

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see /programming/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

10

Benim gibi bir sorun yaşadıysanız, zaten bazı değişiklikler yaptınız, ancak şimdi, herhangi bir nedenle ondan kurtulmak istediğinizde, en hızlı yol şu şekilde kullanmaktır git reset:

git reset --hard HEAD~2

2 numaraya gerek duymadım, dolayısıyla 2 sayısı vardı. Sıfırlamak için kendi taahhütlerinizin sayısına değiştirebilirsiniz.

Sorunuzu cevaplamak için - uzak depo HEAD'inden 5 taahhüt öndeyseniz, bu komutu çalıştırmalısınız:

git reset --hard HEAD~5

Yaptığınız değişiklikleri kaybedeceğinize dikkat edin, bu yüzden dikkatli olun!


7

Önceki cevaplar sıfırlanacak dalın geçerli dal olduğunu (teslim alınmış) varsayar. Yorumlarda OP hap497 , dalın gerçekten kontrol edildiğini açıkladı, ancak bu orijinal soru tarafından açıkça gerekli değildir. En az bir "yinelenen" soru olduğundan, şubeyi tamamen depo durumuna sıfırlayın , bu da dalın teslim alındığını varsaymaz, burada bir alternatif vardır:

"Mybranch" dalı şu anda kullanıma alınmamışsa , uzak dalı "myremote / mybranch" 'ın kafasına sıfırlamak için aşağıdaki düşük düzey komutunu kullanabilirsiniz:

git update-ref refs/heads/mybranch myremote/mybranch

Bu yöntem, kullanıma alınmış dalı olduğu gibi bırakır ve çalışma ağacı dokunulmaz. İkinci argüman olarak verilen şey ne olursa olsun, mybranch'ın başını başka bir işe götürür. Bu, özellikle birden çok dalın yeni uzak kafalara güncellenmesi gerektiğinde yararlıdır.

Ancak bunu yaparken dikkatli olun ve gitkkaynağı ve hedefi iki kez kontrol etmek için veya benzer bir araç kullanın. Bunu mevcut dalda yanlışlıkla yaparsanız (ve git sizi bundan uzak tutmazsa), yeni dal içeriği değişmeyen çalışma ağacıyla eşleşmediği için (düzeltmek, dalı yeniden güncellemek, daha önce olduğu yere).


7

Sık kullandığım şey bu:

git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

Herhangi değişiklik için başka bir dal yerine çıkış / yerel ana değişiklik yapmak ayağının geliştirilmesini, bunlarla değil iyi bir uygulama örneğin değişiklik türüne, tarafından önüne şube adı ile olduğunu Not feat/, chore/, fix/, vb Böylece sadece gerek değişiklikleri çekin, master'dan herhangi bir değişiklik yapmayın. Diğerlerinin katkıda bulunduğu diğer dallar için de aynı şey geçerlidir. Bu nedenle, yukarıdakiler yalnızca, başkalarının taahhüt ettiği bir şubeye değişiklik yaptıysanız ve sıfırlamanız gerektiğinde kullanılmalıdır. Aksi takdirde, gelecekte başkalarının ittiği bir şubeye itmekten kaçının, bunun yerine ödeme yapın ve teslim alınan şube aracılığıyla söz konusu şubeye itin.

Yerel şubenizi akış yukarı şubedeki en son işleme sıfırlamak istiyorsanız, şu ana kadar benim için işe yarar:

Uzaktan kumandalarınızı kontrol edin, yukarı akış ve orijininizin beklediğiniz gibi olduğundan emin olun, beklendiği gibi değilse git remote add upstream <insert URL>, örneğin çatalladığınız orijinal GitHub deposunu ve / veya kullanın git remote add origin <insert URL of the forked GitHub repo>.

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force

GitHub'da, işi orada kaydetmek için şubeye yerel adla aynı ada sahip olarak ödeme yapabilirsiniz, ancak başlangıç ​​noktası geliştirmenin yerel kaydedilmiş çalışma dalıyla aynı değişikliklere sahip olması durumunda bu gerekli değildir. Ben örnek olarak geliştirme dalı kullanıyorum, ancak mevcut herhangi bir şube adı olabilir.

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

Ardından, bu değişiklikleri herhangi bir çakışma olduğunda başka bir dalla birleştirmeniz gerekiyorsa, değişiklikleri geliştirirken koruyun:

git merge -s recursive -X theirs develop

Kullanım sırasında

git merge -s recursive -X ours develop

şube_adı'nın çakışan değişikliklerini korumak için. Aksi takdirde ile bir birleştirme aracı kullanın git mergetool.

Tüm değişikliklerle birlikte:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

Akış yukarı / geliştirme yerine, bir sağlama karması, diğer şube adı vb. Kullanabileceğinizi unutmayın. Şubenizin yeşil olup olmadığını ve çalışma dizininin temiz olduğunu (çalışma dizininin temiz olduğunu belirten) kontrol etmek için Oh My Zsh gibi bir CLI aracı kullanın. tarafından onaylanmış veya doğrulanabilir git status). Bu aslında çok bu durumda, bir taahhüt tarafından otomatik örn UML diyagramları, lisans başlıkları, vb eklenen bir şey varsa geliştirmek akıntıya göre kaydedilmesini ekleyebilecekleri Not, daha sonra üzerinde değişiklikler çekebilirdi origin developiçin upstream developgerekirse.


6

Cevap

git clean -d -f

küçültülmüş ( dizinleri kaldırmak için -d ). Teşekkürler!


Ekstra dosya içermeyen tam% 100 temiz repo klasörü için çalıştırın git clean -xdf. Bu, git'in farkında olmadığı tüm dosyaları siler ve klasörünüzü git'in nesne listesindekiyle tam olarak eşleştirir. Bir "what-if" gerçekleştirmek için ekleyebileceğiniz -n(örneğin git clean -nxdf) ekleyebileceğinizi ve bunun aslında hiçbir şey yapmadan neyi sileceğini söyleyeceğini unutmayın. ( git clean )
qJake

5

HEADHem çalışma dizini hem de dizin için duruma geri dönmek istiyorsanız , o zaman git reset --hard HEADyerine, yapmalısınız HEAD^. (Bu, tıpkı tek veya çift tire gibi bir yazım hatası olabilir --hard.)

Bu dosyaların neden değiştirilmiş olarak göründüğü ile ilgili sorunuza göre, belki de sıfırlama yerine yumuşak bir sıfırlama yapmışsınız gibi görünüyor. Bu HEADişlemde değiştirilen dosyaların sahnelenmiş gibi görünmesine neden olur , bu da muhtemelen burada gördüğünüz şeydir.


4

Hiçbir sıfırlama ve temizleme miktarının yerel git repo'mdaki izlenmemiş ve değiştirilmiş dosyalar üzerinde herhangi bir etkisi var gibi görünmüyordu (yukarıdaki tüm seçenekleri denedim). Benim tek çözüm yerel rem rm ve uzaktan klonlamak oldu.

Neyse ki önemsediğim başka şubem yoktu.

xkcd: Git


1

Gördüğüm tüm durumlarda çalışan tek çözüm silmek ve yeniden kazanmaktır. Belki başka bir yol var, ama açıkçası bu şekilde eski devletin orada kalma şansı kalmıyor, bu yüzden tercih ederim. Git'te işleri sık sık karıştırırsanız, bir astar olarak makro olarak ayarlayabilirsiniz:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* .git dosyalarınızın bozuk olmadığını varsayar


4
emin olmak için işletim sisteminizi yeniden yükleyebilirsiniz!
Sebastian Scholle

1

Bir özellik dalı oluşturmayı unuttunuz ve yanlışlıkla doğrudan master'a taahhüt ettiniz mi?

Özellik dalını şimdi oluşturabilir ve yapıları, testleri ve dosya kilitleriyle ilgili sorunları tetiklemekten kaçınmak için çalışma ağacını (yerel dosya sistemi) etkilemeden master'ı geri ayarlayabilirsiniz :

git checkout -b feature-branch
git branch -f master origin/master

1

Sadece 3 komut çalışmasını sağlar

git fetch origin
git reset --hard origin/HEAD
git clean -f

-3

Yerel değişikliklerinizi kaydetmeyi önemsemiyorsanız, ancak yine de deponuzu orijin / HEAD ile eşleşecek şekilde güncellemek istiyorsanız, yerel değişikliklerinizi saklayabilir ve ardından şunları çekebilirsiniz:

git stash
git pull
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.