Git zulası nasıl yeniden adlandırabilirim?


204

Yanlış ada sahip bir zulası var. Adı düzeltmek istiyorum, bu yüzden doğru.

Zulayı nasıl yeniden adlandırabilirim?


5
pop ve farklı bir adla tekrar kaydetmek?
Bartlomiej Lewandowski

5
Haşhaş ve tekrar saklamak her zaman bir seçenek değildir, çünkü saklamak eskimiş duruma dayanabilir ve haşhaş sırasında çatışmalara neden olabilir. (Eski devletin artık tarihin hiçbir yerinde var olması bile gerekmiyor.)
Tom

Yanıtlar:


259

Diyelim ki saklamak listenizin aşağıdaki gibi olduğunu varsayalım:

$ git stash list
stash@{0}: WIP on master: Add some very important feature 
stash@{1}: WIP on master: Fix some silly bug

İlk olarak, yeniden adlandırmak istediğiniz saklamak girdisini kaldırmanız gerekir:

$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)

Şimdi sadece bıraktıktan sonra döndürülen kesinliği kullanarak yeni mesajla tekrar ekleyin:

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db

Ve bu kadar:

$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature

Bu çözüm git 1.8.4 veya üstünü gerektirir ve evet, kirli çalışma dizini ile de çalışır.


3
git show stash@{0}daha sonra eski bilgileri gösterir. Bunu nasıl düzeltirim? (Lütfen saklamanın farklı bir SHA aldığını unutmayın.)
Tino

4
Karmayı almak git showve başlamak daha iyi hissettiriyor git stash store. Sonra git stash listeski ve yeni zulayı göreceksiniz. Sonunda eski zulayı temizleyebilirsiniz git stash drop.
hogi

6
git stash drop değişiklikleri kaybetmeyecek mi?
Shravya Boggarapu

4
@ShravyaBoggarapu, hayır, git git gcçalıştırılana kadar kesinliği kaldırmaz . Sonra stash dropbunu kolayca bulabilirsiniz normalde erişilemez kullanarak işlemek git fsck | grep commitkomutu.
qzb

2
@ ÐerÆndi basitçe uygulamak ve kaydetmek kolay bir seçenektir, ancak değişiklikler nedeniyle değişiklikler yeniden uygulanamayacağı zaman çalışmaz. Bu arada her koşulda düşürme ve depolama işleri. Çözümümü bir kez daha test ettim - son git sürümünde (2.17.0) iyi çalışıyor.
qzb

62

Manuel olarak yapmadığınız veya Git'te iyileştirmeye katkıda bulunmadığınız sürece bir takma ad kullanabilirsiniz:

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "$@" && [ $s != 0 ] && git stash pop stash@{1}; }; _'

Kullanım: " git stash-rename <stash> [save options] [<message>]"

İle [save options]herhangi seçeneği git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

Misal:

$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd

# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd

$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes

Yerel dengesiz değişiklikleriniz olsa bile bu işe yarar :)

EDIT 2016/02/22

Basitleştirilmiş komut dosyası, qzb'ye kredi , https://stackoverflow.com/a/35549615/515973

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'

Kullanım: " git stash-rename <stash> [<message>]"


1
Müthiş! Mümkünse daha da seringit stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
mikemaccana

3
böylece cevap 1) temiz çalışma kopyası, 2) yeniden adlandırmak istediğiniz zulası uygulayın, 3) zu listesinden bırakın, 4) doğru mesajla yeni bir zulası oluşturun.
gcb

2
Açıklığa kavuşturmak için, son zulayı yeniden adlandırıyorsunuz ve böyle bir işlemden sonra en üst zuhur mu oluyor?
onebree

2
Yeniden adlandırmak, varsa mevcut değişiklikleri kaydetmek, silinen saklamayı istenen adla yeniden oluşturmak, varsa mevcut değişiklikleri yeniden uygulamak için zulayı siliyorum.
Julien Carsique

3
Bu sürüm, her iki argümanın da orada olduğundan emin olmak için kontrol eder, böylece son saklamanızı yanlışlıkla düşürmez. Ayrıca tüm stash@{0}referansı değil, sadece stash numarasını gerektirir . gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
jdforsythe

6

Çok basit. İlk olarak, son saklamayı şununla geri alın:

git stash pop

Bundan sonra, stash'ı özelleştirilmiş bir adla bu şekilde kaydedebilirsiniz:

git stash save "your explanatory name"

Umarım sizin için yararlıdır. :)


Yeniden adlandırılan saklama en yeni sürüm olmayabilir.
1919

En son saklamak için bu daha basit (SADECE) beri başparmak.
Kaihua

stash pop son kodunuzla çakışabilir
Kevin Chou

3

Bunun mümkün olduğunu düşünmüyorum. Olmamıştır zula adlandırılması için bir öneri, ancak henüz uygulanmadı.

Genel fikrim:

  1. git reflog updateBelirli bir yeniden blog girişi ile ilişkili mesajı güncelleyen yeni bir komut uygulayın. Bunu yapmak için, yeni bir update_reflog_ent()işlev ( reflog.c dosyasında ), güncelleştirilecek belirli reflog girdisiyle ilişkili iletiyi değiştirir. Bir update_reflog()işlev , değişikliği yapmak için for_each_reflog_ent()birlikte kullanılır update_reflog_ent.

  2. Bir git stash renamekomutun yalnızca git reflog updateuygun ref ve yeni mesajla çağrılması gerekir .

Ya da, elbette, zulayı patlatabilir ve git stash save [message]


3

Okuyucunun yararı için, şu anda kabul edilen ve doğru cevabın bir uzantısı .

Sadece stash mesajını düzeltmek istemiyorsanız ve ayrıca stash'ın taahhüt mesajını düzeltmek istiyorsanız,

git stash list

ve

git log --oneline -1 stash

Her ikisi de gösterilene katılıyor, biraz daha fazlasına ihtiyacınız var. Bunu yapmanın daha iyi bir yolu olabilir, ama bu tarifin anlaşılması kolaydır, umarım.

Bunu yapabilmek için git commit --amendbir şubenin İPUCU'nda olmanız gerekir. Dolayısıyla çözüm:

git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch

Açıklaması:

  • "Söz konusu stash" dan yeni (henüz mevcut olmayan) bir "karalama" dalı oluşturun ve bu şubeye geçin
  • Eski saklamayı çıkarın. Bu hala güvende, çünkü hala dalda.
  • git commit --amendTaahhüt iletisini değiştirmek için kullanın , bu "söz konusu saklamak" ın SHA'sını değiştirir
  • Qzb'nin cevabına göre zulayı saklayın
  • Geri dönün ("master" dan geldiğinizi varsayar) ve temizleme

Dezavantajları:

  • Bu, dalları geçici olarak değiştirir. Böylece bu tarif sadece git status --porcelaintemiz olduğunda uygulanabilir (okuma: hiçbir şey çıkarmaz)

  • Zımbaları yeniden sıralar, böylece değişen zulası olur stash@{0}

  • Sen girmeniz gerekir $MESSAGEkez ya da bazı ortam değişkeni kullanmak (örnekte: MESSAGE)

  • Kullanılmayan bir şube adı bulmanız gerekiyor

Bunu dal değiştirmeden yapmanın yolları vardır, ancak bu bu cevabın kapsamı dışındadır.

Misal

git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list

Çıktı

*-.   e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D

Şimdi taahhüdü değiştirmeden (not: aşağıdaki SHA yanınızda farklı olacaktır):

git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list

Çıktı

*-.   2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

Gördüğünüz gibi, stash@{0}hala olarak gösterilir 2fbf900 (refs/stash) WIP on master: 8bdcc32 Diçinde git log. Dikkatli bakarsanız, birkaç taahhüdün SHA'yı değiştirdiğini göreceksiniz. Bunun nedeni, depoların nasıl ele alındığıdır (ebeveynler SHA'ya dahil edilir ve depoların ebeveyn olarak depoları vardır).

Düzelt:

git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list

Çıktı

*-.   4d55186 (refs/stash) ...changed...
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D

Gördüğünüz gibi, refs/stashSHA da değişti.


Bahsetmeye değer: Bu, orijinal saklamakla kaydedilen dizini yok eder ve yerine orijinal saklamanın üst taahhüdü ile eşleşen yeni bir dizin kullanır. Biri kaydedilen orijinal dizini kullanmayı planlamadıysa (veya orijinal saklamanın üst öğesiyle zaten eşleşiyorsa), bu bir sorun değildir.
torek

1

Julien'in takma adının , On <branch>genellikle stash adlarının başına gelen önekle düzgün bir şekilde ilgilenmenizi sağlayan değiştirilmiş bir sürümü :

git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"stash@{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'

Sözdizimi:

git stash-rename <new-name> [<stash> [<new-branch-name> | .]]

Örnek kullanım:

repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed

Komutun çoğu, argümanları ayrıştırmak ve şube adına ne yapılması gerektiğini bulmak içindir. Kullanılan gitaraçlar aşağıdaki gibidir:

  • git rev-parse <stash> saklamanın SHA'sını bulmak için.
  • git stash list --format=%gs -1 <stash>saklamanın reflog konusunu bulmak için . Bunun, bu komut tarafından değiştirilmeyen stash komut mesajından farklı olduğunu unutmayın . Reflog konusu, görüntülenen şeydir git stash listve yığınlarla ilişkili taahhütlerin karmasını değiştirmeden reflog konusunu değiştirebilirsiniz. Ancak, her zaman orijinal teslim mesajını bulabilirsiniz, bu nedenle git stash-renamehassas bilgileri kaldırmak için kullanmayın !
  • git stash drop <stash>eski referansı saklamak için bırakıyoruz (ama hala SHA'mız var, bu yüzden kayıp değil).
  • git stash store -m <new-message> <sha>aynı taahhüt bilgisiyle ancak farklı bir yeniden bloglama konusuyla yeni bir referansı kaydetmek için .
  • git stash listişlem bittikten sonra saklamak için. Yeni depoların daima listenin başına itildiğini unutmayın. Orijinal pozisyonunu eski haline getirmek için tüm zulanları ilgi alanından önce yeniden itmek gerekir .

0

En basit yol: zulanızı git zulası pop ile açın ve sonra git zulası ile tekrar kaydedin isminizi kaydedin


Yeniden adlandırılan saklama en yeni sürüm olmayabilir.
mikemaccana
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.