Birdən çox gedin təkrarlayın

Bu kimi görünən bir git deposu var:

 A -> B -> C -> D -> HEAD 

Şöbə başının A-a işarə etməsini istəyirəm, yəni B, C, D və HEAD-ın yox olmasını istəyirəm və başın A ilə sinonim olması istərdim.

Yenidən qurmağa cəhd edə bilərəm (aradakı dəyişiklikləri tıkladığımdan bəri tətbiq etmir) və ya geri qayıda bilərəm. Amma birdən çox əməlləri necə qaytarıram? Biri tək-tək qaytarırmı? Sifariş vacibdirmi?

499
23 сент. 23 Sentyabr tarixində Bill tərəfindən təyin olundu 2009-09-23 03:27 '09 at 3:27 pm 2009-09-23 03:27
@ 11 cavab

Şərhlərdə yazdığımın genişləndirilməsi

Ümumi qayda budur ki, nəşr etdiyiniz hekayəni yenidən yazmamaq (dəyişdirməməlisiniz). Bir hekayəni yenidən yazsanız (dəyişdirsəniz), dəyişikliklərin birləşdirilməsi və onları yeniləmə problemləri olacaq.

Beləliklə, həlli qurtarmaq istədiyiniz dəyişiklikləri qaytaran yeni bir əmr yaratmaqdır. Bunu git geri qaytarmaqla edə bilərsiniz.

Aşağıdakı vəziyyətiniz var:

 A <- B <- C <- D <- master <- HEAD

(oxlar göstərici istiqamətinə istinad edirlər: əməllər halında "ana" bağı, şöbə şöbəsində yuxarı fiksasiya və şöbənin adı ilə bağlı filialın adı).

Yaratmaq üçün nədir?

 A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD

B, C, D. əmsallarına dəyişiklikləri qaytaran bir öhdəlik anlamına gəldikdə "[(BCD) ^ - 1]" ifadəsi bizə (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ - 1, Buna görə, aşağıdakı əmrləri istifadə edərək lazımi vəziyyəti əldə edə bilərsiniz:

 $ git revert --no-commit D $ git revert --no-commit C $ git revert --no-commit B $ git commit -m "the commit message" 

Alternativ bir həll A törətmək məzmunu və bu dövlət törətmək üçün olacaq:

 $ git checkout -f A -- . $ git commit -a 

Sonra aşağıdakı vəziyyətə sahib olacaqsınız:

 A <- B <- C <- D <- A <<- master <- HEAD

Axırıncı A 'A törətməklə eyni məzmuna malikdir, lakin fərqli bir öhdəlikdir (mesaj göndərmək, valideynlər, tövbə tarixi).

Jeff Ferlandın Charles Bailey tərəfindən dəyişdirilmiş həlli eyni fikrə əsaslanır, lakin sıfırlama üsulundan istifadə edir:

 $ git reset --hard A $ git reset --soft @{1} # (or ORIG_HEAD), which is D $ git commit 
778
24 сент. Jakub Narębski tərəfindən verilmiş cavab 24 Sep. 2009-09-24 11:44 '09 at 11:44 'da 2009-09-24 11:44

Bunu etmək üçün, təkrar əmrini istifadə etmək lazımdır, qayıtmaq istədiyiniz əmrlər üçündür.

Misalınızı nəzərə alaraq bunu etmək lazımdır ("usta" şöbəsindəsiniz):

 git revert master~3..master 
border=0

Bu, B, C və D öhdəliyi ilə (yəni bu əməllərin dəyişdirilməsini ləğv etmək deməkdir) yerli şəbəkənizdə yeni bir öhdəlik yaratacaqdır:

 A <- B <- C <- D <- BCD' <- HEAD 
126
31 июля '12 в 18:00 2012-07-31 18:00 Cavab Victor tərəfindən 31 iyul '12 saat 18:00 'da verilir 2012-07-31 18:00
 git reset --hard a git reset --mixed d git commit 

Bu, bir dəfəyə görə geri ödəmə kimi çıxış edəcək. Yaxşı fiksasiya mesajı verin.

36
23 сент. Jeff Ferlandın 23 sentyabrda verdiyi cavabı 2009-09-23 03:45 '09 saat 03:45 'da 2009-09-23 03:45

Jakub cavabında olduğu kimi, asanlıqla qayıtmaq üçün ardıcıl öhdəliklər seçmenizi təmin edir.

 # revert all commits from B to HEAD, inclusively $ git revert --no-commit B..HEAD $ git commit -m 'message' 
34
31 июля '14 в 21:49 2014-07-31 21:49 cavab 31 iyul '14 'da 21:49' də Konyak'ta veriləcək 2014-07-31 21:49

Əvvəlcə iş surətinizin dəyişməyəcəyinə əmin olun. Sonra:

 git diff HEAD commit_sha_you_want_to_revert_to | git apply 

və sonra düzəltmək. Geri qaytarma səbəbini sənədləşdirməyi unutmayın.

19
09 сент. cavab mateusz.fiolka 09 sep verilir . 2014-09-09 16:13 '14 'da 16:13 2014-09-09 16:13

Mən faydalı yolu tapdım

 git revert --no-commit HEAD~3.. 

Bu əmr sonuncu 3 əmri bir əmr ilə qaytarır.

Həm də tarix yazılmır.

12
29 марта '17 в 3:00 2017-03-29 03:00 Cavab dərinləşir 29 mart '17 saat 3:00 'də 2017-03-29 03:00' də

Mən bu məsələyə sadəcə cavab verə bilməyəcəyindən narahatam. Hər bir sual, tarixin düzgün şəkildə qaytarılması və saxlanılması ilə bağlıdır. Bu sual deyir: "Filialın rəhbəri A-yə, yəni B, C, D və HEAD-i istəməsini istəmirəm və başın A ilə sinonimi olmasını istəyirəm.

 git checkout <branch_name> git reset --hard <commit Hash for A> git push -f 

Yaqubun vəzifəsini oxumaqla çox şey öyrəndim, amma şirkətdə olan bir adam (Pull-Request olmadan test şöbəsinə daxil olmaq) səhvini düzəltməyə və düzəltməyə çalışır və səhvini düzəltməyə çalışır və 5 başlanğıcını düzəldir. . Yalnız bu deyil, indi də pis bir və ya iki çəkmə istəkləri. Beləliklə, unutma, mən son yaxşı fix (abc1234) gördüm və yalnız əsas script qaçdı:

 git checkout testing git reset --hard abc1234 git push -f 

Mən bu repo üzrə işləyən digər 5 uşaqa dedilər ki, son bir neçə saatda ən yaxşı dəyişiklikləri və son testdən sonra Wipe / Re-Branch-ni dəyişəcəklər. Hekayənin sonu.

11
12 июля '16 в 2:29 2016-07-12 02:29 Suamere 12 İyul, 16: 2:29 tarixində cavab verilir . 2016-07-12 02:29

Bir qrup əmrləri ümumi bir depoya (insan istifadə edən və tarixə keçmək istəyən) qaytarmaq üçün en asan yol, git revert ilə birlikdə git revert . İkincisi sizə bir əmanət siyahısı verəcəkdir, birincisi qayıdacaqdır.

Bunun iki yolu var. Istifadə etmək üçün bir öhdəlikdə təkrarlanan çoxlu əməlləri təkrar etmək istəyirsinizsə:

 for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert -n $i; done 

Bu, tələb olunan əmrlər qrupunun qaytarılmasına gətirib çıxaracaq, lakin bütün dəyişiklikləri iş ağacına buraxın, onları hər zamanki kimi düzəltməlisiniz.

Başqa bir seçim hər bir dəyişiklik üçün bir öhdəlik götürməkdir:

 for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done 

Məsələn, bir tip fiksasiya ağacınız varsa

  o---o---o---o---o---o---> fff eee ddd ccc bbb aaa 

dəyişiklikləri bbb-dən bəyan etmək, qaçmaq

 for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done 
4
04 авг. cavab ruslan Kabalin 04 aug verilir. 2011-08-04 14:29 '11 at 2:29 pm 2011-08-04 14:29

Bu, Yaqubun cavabında verilən həllərdən birinin uzadılmasıdır.

Mənə geri atılmaq üçün lazım olan öhdəliklərin bir qədər mürəkkəb olduğu bir vəziyyətlə qarşı-qarşıya qaldım və bəzi əmrlər birləşmə idi və tarixin yenidən yazılmaması lazım idi. Sonda getdikləri dəyişmə dəyişiklikləri arasındakı münaqişələrə qaçdım, çünki bir sıra git revert əmrləri istifadə edə bilmədi. Aşağıdakı addımları istifadə edərək bitirdim.

Əvvəldən hədəf törətmənin məzmununu yoxlayın, şöbənin ucuna HEAD qoyub:

 $ git checkout -f <target-commit> -- . 

(Güvənlik bir dəlil deyil, bir fayl olaraq deyil, cari qovluğa aiddir.)

Sonra tamamlanmış əmrlərə hansı fayllar əlavə olunduğunu müəyyənləşdirin və bu səbəbdən silinməlidirlər:

 $ git diff --name-status --cached <target-commit> 

Əlavə edilmiş fayllar xəttin başında "A" ilə görünür və digər fərqlər olmamalıdır. İndi hər hansı bir fayl silinməlidirsə, bu faylları silmək üçün:

 $ git rm <filespec>[ <filespec> ...] 

Nəhayət, çevrilməni tamamlayın:

 $ git commit -m 'revert to <target-commit>' 

İstəsəniz, istənilən vəziyyətə dönməyimizə əmin olun:

 $git diff <target-commit> <current-commit> 

Heç bir fərq olmamalıdır.

3
08 нояб. Cavab Warren Dew tərəfindən verilir 08 noyabr. 2016-11-08 09:39 '16 at 9:39 2016-11-08 09:39

Onlardan heç biri mənim üçün işləməmişdi, mən də üç öhdəlik götürmüşəm (son üç əmr).

 git revert HEAD git revert HEAD~2 git revert HEAD~4 git rebase -i HEAD~3 # pick, squash, squash 

Bir cazibədarlıq kimi çalışdı :)

0
24 янв. Cavab Dorian 24 yanvar verilir . 2017-01-24 03:28 '17 də 3:28 2017-01-24 03:28 'də

Bir funksiyanı müvəqqəti olaraq açmaq istəyirsinizsə, aşağıdakı əmrlərdən bir sıra istifadə edə bilərsiniz.

Bu necə işləyir.

git log - pretty = oneline | grep 'feature_name' | cut -d '' -f1 | xargs -n1 git revert - no-edit

-1
11 февр. Cavab 11 fevralda Ajit Singh tərəfindən verilir . 2016-02-11 21:47 '16 saat 09:47 'da 2016-02-11 21:47

haqqında digər suallar və ya bir sual verin