Helpex - Trao đổi & giúp đỡ Đăng nhập
147

Tôi có một stash với một tên không chính xác. Tôi muốn sửa tên để nó chính xác.

Làm thế nào tôi có thể đổi tên một stash?

147 hữu ích 2 bình luận 21k xem chia sẻ
183

Giả sử danh sách stash của bạn trông như thế này:

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

Trước tiên, bạn phải xóa mục nhập stash mà bạn muốn đổi tên:

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

Bây giờ chỉ cần thêm nó một lần nữa với thông báo mới bằng cách sử dụng sha of commit trả lại sau khi thả:

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

Và đó là:

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

Giải pháp này yêu cầu git 1.8.4 trở lên, và vâng, nó cũng hoạt động với thư mục làm việc bẩn.

183 hữu ích 5 bình luận chia sẻ
57

Trừ khi bạn làm thủ công hoặc đóng góp cải tiến cho Git, bạn có thể sử dụng bí danh:

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}; }; _'

Cách sử dụng: " git stash-rename <stash> [save options] [<message>]"

Với [save options]bất kỳ tùy chọn nào của git stash save:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

Thí dụ:

$ 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

Điều đó sẽ hoạt động ngay cả khi bạn có những thay đổi cục bộ :)

EDIT 2016/02/22

Tập lệnh được đơn giản hóa, ghi có vào qzb , 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; }; _'

Cách sử dụng: " git stash-rename <stash> [<message>]"

57 hữu ích 5 bình luận chia sẻ
3

Vì lợi ích của người đọc, đây là phần mở rộng cho câu trả lời hiện được chấp nhận và chính xác .

Nếu bạn không chỉ muốn sửa thông báo stash và còn muốn sửa thông điệp cam kết của stash, như vậy

git stash list

git log --oneline -1 stash

cả hai đồng ý với những gì được hiển thị, bạn cần thêm một chút. Có thể có một cách tốt hơn để làm điều đó, nhưng công thức này ở đây rất dễ hiểu, tôi hy vọng.

Để có thể làm được, git commit --amendbạn cần phải ở trên TIP của một chi nhánh. Do đó, giải pháp là:

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

Giải thích:

  • Tạo một nhánh "cào" mới (chưa tồn tại) từ "stash in question" và chuyển sang nó
  • Loại bỏ stash cũ. Điều này là an toàn, vì chúng tôi vẫn có điều này trên chi nhánh.
  • Sử dụng git commit --amendđể thay thế thông điệp cam kết, điều này thay đổi SHA của "stash in question"
  • Lưu stash, dựa trên câu trả lời của qzb
  • Chuyển về (giả sử bạn đến từ "chính chủ") và dọn dẹp

Hạn chế:

  • Điều này tạm thời chuyển nhánh. Vì vậy, công thức này chỉ có thể được áp dụng khi git status --porcelainsạch (đọc: không xuất ra bất cứ thứ gì)

  • Nó gia hạn các stash, vì vậy stash đã thay đổi trở thành stash@{0}

  • Bạn cần nhập $MESSAGEhai lần hoặc sử dụng một số biến môi trường (trong ví dụ MESSAGE:)

  • Bạn cần tìm một tên chi nhánh không sử dụng

Có nhiều cách để làm điều này mà không cần chuyển nhánh, nhưng điều này nằm ngoài phạm vi của câu trả lời này.

Thí dụ

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

Đầu ra

*-.   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

Bây giờ không thay đổi cam kết (lưu ý: SHA sau đây sẽ khác ở bên bạn):

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

Đầu ra

*-.   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

Như bạn có thể thấy, stash@{0}vẫn được hiển thị như 2fbf900 (refs/stash) WIP on master: 8bdcc32 Dtrong git log. Nếu bạn nhìn kỹ, bạn sẽ thấy rằng một số cam kết đã thay đổi SHA. Điều này là do cách xử lý stash (cha mẹ được bao gồm SHA và stash có stash là cha mẹ).

Khắc phục điều đó:

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

Đầu ra

*-.   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

Như bạn cũng có thể thấy, refs/stashcó một SHA đã thay đổi, quá.

3 hữu ích 0 bình luận chia sẻ
3

Tôi không nghĩ rằng nó có thể làm như vậy. Đã có một đề xuất đổi tên stash, nhưng nó chưa được thực hiện.

Ý tưởng chung của tôi là:

  1. Thực hiện một git reflog updatelệnh mới cập nhật thông báo liên quan đến một mục nhập reflog cụ thể. Để làm điều này, một update_reflog_ent()chức năng mới (trong reflog.c ) sẽ thay đổi thông báo liên quan đến mục nhập reflog cụ thể để cập nhật. Một update_reflog()chức năng sẽ sử dụng for_each_reflog_ent()với update_reflog_entđể thực sự làm thay đổi.

  2. Một git stash renamelệnh sau đó sẽ chỉ cần gọi git reflog updatevới thông báo thích hợp và thông báo mới.

Hoặc, bạn có thể, tất nhiên, bật stash và làm một git stash save [message]

3 hữu ích 0 bình luận chia sẻ
0

Dưới đây là phiên bản sửa đổi của bí danh của Julien cho phép bạn xử lý chính xác On <branch>tiền tố thường được đặt trước để bỏ tên:

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; }; _'

Cú pháp:

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

Ví dụ sử dụng:

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

Hầu hết các lệnh là để phân tích cú pháp các đối số và tìm ra những gì nên được thực hiện cho tên nhánh. Các gitcông cụ được sử dụng như sau:

  • git rev-parse <stash> để tìm SHA của stash.
  • git stash list --format=%gs -1 <stash>để tìm chủ đề reflog của stash. Lưu ý rằng điều này khác với thông báo cam kết của stash, không được thay đổi bởi lệnh này. Chủ đề reflog là những gì hiển thị git stash listvà bạn có thể thay đổi chủ đề reflog mà không thay đổi giá trị băm của các cam kết liên quan đến stash. Tuy nhiên, bạn luôn có thể tìm thấy thông điệp cam kết ban đầu, vì vậy đừng sử dụng git stash-renameđể xóa thông tin nhạy cảm!
  • git stash drop <stash>để bỏ tham chiếuvào stash (nhưng chúng ta vẫn có SHA, vì vậy nó không bị mất).
  • git stash store -m <new-message> <sha>để lưu một tham chiếu mới vào stash với cùng thông tin cam kết nhưng một chủ đề reflog khác .
  • git stash listđể liệt kê các stash sau khi hoạt động kết thúc. Lưu ý rằng stash mới luôn được đẩy đến đầu danh sách. Nó sẽ là cần thiết để đẩy lại tất cả các stash trước khi stash quan tâm để khôi phục vị trí ban đầu của nó.
0 hữu ích 0 bình luận chia sẻ
0

Cách đơn giản nhất: bật stash của bạn với git stash pop sau đó lưu lại với git stash lưu tên của bạn

0 hữu ích 1 bình luận chia sẻ
0

Nó rất đơn giản. Đầu tiên, hoàn tác stash cuối cùng với:

git stash pop

Sau này, yo có thể lưu stash với một tên tùy chỉnh theo cách này:

git stash save "your explanatory name"

Tôi hy vọng nó hữu ích cho bạn. :)

0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ git git-stash , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading