Git'e göre nasıl ödeme yapılır?


314

Kaynak kodunda bir gerileme üzerinde çalışıyorum. Git'e "parametrelenmiş bir tarih / saate göre kaynağa bakın" demek istiyorum. Mümkün mü?

Mevcut görüşümde kaybetmek istemediğim değişiklikler de var. İdeal olarak, mevcut kaynak ile bir önceki tarihe göre ilgilendiğim bazı sürüm arasında geçiş yapmak istiyorum.


9
Eğer bilmiyorsanız, git bisect regresyonları bulmak için oldukça harika. Biliyorum, iyi bilinen bir taahhüt bulmak için Andy'nin {1 yıl önce} sözdizimini kullanın, sonra bunu başlangıç git bisect goodnoktanız olarak kullanın .
MatrixFrog

Bunun iyi bir kullanım örneği olduğunu hissediyorum tags.
Jess

Yanıtlar:


365

Mevcut değişikliklerinizi korumak için

İşinizi taahhütte bulunmadan saklayabilirsiniz git stash. Onu git stash popgeri almak için kullanmaktansýn . Ya da ( carleeto'nun dediği gibi) git commitayrı bir dalda yapabilirsiniz.

Rev-parse kullanarak tarihe göre ödeme

Belirli bir tarihe göre bir taahhüdü şu şekilde kullanarak kontrol edebilirsiniz rev-parse:

git checkout 'master@{1979-02-26 18:30:00}'

Kullanılabilir seçeneklerle ilgili daha fazla bilgiyi git-rev-parse.

Yorumlarda belirtildiği gibi bu yöntem, geçmişinizdeki taahhüdü bulmak için reflog'u kullanır. Varsayılan olarak bu girişlerin süresi 90 gün sonra dolar . Reflog'u kullanma sözdizimi daha az ayrıntılı olsa da, yalnızca 90 gün geri gidebilirsiniz.

Rev-list kullanarak tarihe göre çıkış yapma

Reflog'u kullanmayan diğer seçenek, rev-listtaahhüdü belirli bir zamanda zamanında almak için kullanmaktır :

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`

Birleştirme ile getirilen sürümleri değil, yalnızca geçmişinizi istiyorsanız --first-parent öğesini not edin . Genellikle istediğiniz budur.


2
@Rocky Bize daha fazla detay verebilir misiniz Rocky? Komut satırına ne giriyorsunuz ve neden işe yaramadığını söylüyorsunuz? Bir hata mesajı alıyor musunuz?
Andy

8
@Rocky: Sorun, parametrenin tırnak işaretleri içine alınması gerektiğidir, aksi takdirde bash, boşluklardaki bağımsız değişkenleri ayırır. Deneyin git co 'master@{2 days ago}'.
Mark Wilden

13
Not: ne kadar geriye gittiğinize bağlı olarak, bu çalışmayabilir çünkü reflog kullanır (bir süre sonra sona erer). 'Uyarı:' Master 'günlüğü yalnızca ...' e geri döner. Rocky'nin çözümü her zaman işe yarar. git checkoutgit rev-list -n 1 --before="2009-07-27 13:37" master
Mark Nadig

3
Cevabınızı düzenledim çünkü backticks kullanımdan kaldırıldı ve okunması zor. Alt kabuklar $(...)tercih edilir.
Amedee Van Gasse

1
@ 40. doğum günün kutlu olsun Andy! (1979-02-26 demek istediğini varsayarak :))
David Blevins

123

Andy'nin çözümü benim için çalışmıyor. Burada başka bir yol buldum:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git: tarihe göre ödeme


3
Yukarıdaki komutu yürüttüğümde, error: unknown switch `n'bununla nasıl başa çıkacağım hakkında bir fikrim var mı?
Tim

15

Görünüşe göre bunun satırlarında bir şeye ihtiyacınız var: Tarihe göre Git kasası

Başka bir deyişle, rev-listtaahhüdü bulmak için kullanın ve sonra gerçekten almak için ödeme kullanın.

Aşamalı değişikliklerinizi kaybetmek istemiyorsanız, en kolay şey yeni bir dal oluşturmak ve bu dalda kullanmaktır. Dallar arasında istediğiniz zaman geçiş yapabilirsiniz.

Düzenleme: Bağlantı kesildi, işte komut:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

2
Harika bağlantı! Yani git checkout branch@{date}reflog süresi dolduğunda çalışma durdurulur, ancak kullanabilirsiniz git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`.
cdunn2001

10

İkame emri vermek için boruyu tercih edenlere

git rev-list -n1 --before=2013-7-4 master | xargs git checkout

9

Benim durumumda -n 1seçenek çalışmıyor. Windows'ta aşağıdaki komut dizisinin iyi çalıştığını gördüm:

git rev-list -1 --before="2012-01-15 12:00" master

Bu, belirtilen tarih için uygun taahhüdün SHA'sını döndürür ve ardından:

git checkout SHA

4

git rev-parseEğer ilgilendiğiniz tarih ise @Andy önerdiği çözüm cezası işleri tarihini işlemek . Ancak yazarın tarihine göre ödeme yapmak istiyorsanız , rev-parseişe yaramaz çünkü taahhütleri seçmek için bu tarihi kullanma seçeneği sunmaz. Bunun yerine aşağıdakileri kullanabilirsiniz.

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

(Ayrıca zaman kullanımını belirtmek istiyorsanız $1 >= "2016-04-12" && $2 >= "11:37"de awk yüklemi.)


3

rev-listAna dalınızdan üretim dalınıza en son birleştirme taahhüdünü bulmak istiyorsanız (tamamen varsayımsal bir örnek olarak) seçenekle daha da ileri gitmek :

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

Belirli bir tarihten itibaren üretim sunucularında olan kodu bulmak gerekiyordu. Bu benim için buldu.


2

Bir derleme yaptığınız sırada deponun kesin sürümüne geri dönmek istiyorsanız, derlemeyi yaptığınız taahhüdü etiketlemek en iyisidir.

Diğer cevaplar, depoyu belirli bir zaman dilimi içinde bir şubedeki en son taahhütlere geri döndürme teknikleri sağlar - ancak her zaman yeterli olmayabilir. Örneğin, bir daldan oluşturursanız ve daha sonra dalı silerseniz veya daha sonra yeniden temel alan bir daldan oluşturursanız, oluşturduğunuz işlem git durumunda geçerli herhangi bir daldan "erişilemez" olabilir. Git'teki erişilemeyen nesneler, depo sıkıştırıldığında sonunda kaldırılabilir.

Taahhüt üzerine bir etiket koymak, daha sonra şubelerle ne yaparsanız yapın, etiketin kaldırılmasının engellenmesi anlamına gelmez.


Bu bana aradığım cevabı vermese de, şimdiye kadar bahsedilmeyen bir yönü belirtmek için iyi bir sözü hak ediyor. Bu, doğru sürüme ulaşmanızı engelleyen sorunların kaynağı olabilir.
manuelvigarcia

1
git rev-list -n 1 --before="2009-07-27 13:37" origin/master

yazdırılan dizeyi alın (örneğin XXXX) ve şunları yapın:

git checkout XXXX

2
Bu @bartoszkp cevabının kopyası değil mi? sadece kökeni referans ekleyerek, diğer cevap bir yorum olmalı ...
manuelvigarcia

evet, aslında neredeyse, sadece SHA'nın ne olduğunu bilmeyenler için neyin kopyalanacağını (benim gibi) clearifing, benim durumumda metin net değildi ve bu, çözümü kurduktan sonra kodum, kopyalanmadı, aslında görebilirsiniz seçenekler de çok farklı
Luca C.
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.