Yanlış ada sahip bir zulası var. Adı düzeltmek istiyorum, bu yüzden doğru.
Zulayı nasıl yeniden adlandırabilirim?
Yanlış ada sahip bir zulası var. Adı düzeltmek istiyorum, bu yüzden doğru.
Zulayı nasıl yeniden adlandırabilirim?
Yanıtlar:
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.
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.)
git show
ve başlamak daha iyi hissettiriyor git stash store
. Sonra git stash list
eski ve yeni zulayı göreceksiniz. Sonunda eski zulayı temizleyebilirsiniz git stash drop
.
git gc
çalıştırılana kadar kesinliği kaldırmaz . Sonra stash drop
bunu kolayca bulabilirsiniz normalde erişilemez kullanarak işlemek git fsck | grep commit
komutu.
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 :)
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>]
"
git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
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 }; _'
Ç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. :)
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:
git reflog update
Belirli bir yeniden blog girişi ile ilişkili mesajı güncelleyen yeni bir komut uygulayın. Bunu yapmak için, yeni birupdate_reflog_ent()
işlev ( reflog.c dosyasında ), güncelleştirilecek belirli reflog girdisiyle ilişkili iletiyi değiştirir. Birupdate_reflog()
işlev , değişikliği yapmak içinfor_each_reflog_ent()
birlikte kullanılırupdate_reflog_ent
.Bir
git stash rename
komutun yalnızcagit reflog update
uygun ref ve yeni mesajla çağrılması gerekir .
Ya da, elbette, zulayı patlatabilir ve git stash save [message]
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 --amend
bir ş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ı:
git commit --amend
Taahhüt iletisini değiştirmek için kullanın , bu "söz konusu saklamak" ın SHA'sını değiştirirDezavantajları:
Bu, dalları geçici olarak değiştirir. Böylece bu tarif sadece git status --porcelain
temiz 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 $MESSAGE
kez 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.
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 D
iç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/stash
SHA da değişti.
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 git
araç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 list
ve 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-rename
hassas 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 list
iş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 .En basit yol: zulanızı git zulası pop ile açın ve sonra git zulası ile tekrar kaydedin isminizi kaydedin