วิธีการตั้งชื่อและดึงที่ซ่อนตามชื่อในคอมไพล์?


1419

ฉันถูกเสมอภายใต้ความประทับใจที่คุณจะให้ซ่อนชื่อโดยการทำซึ่งคุณสามารถนำไปใช้ในภายหลังด้วยการทำgit stash save stashname git stash apply stashnameแต่ดูเหมือนว่าในกรณีนี้สิ่งที่เกิดขึ้นคือstashnameจะใช้เป็นคำอธิบายที่ซ่อน

ไม่มีทางที่จะตั้งชื่อที่ซ่อนจริงหรือไม่? ถ้าไม่คุณจะแนะนำให้ใช้ฟังก์ชันการทำงานที่เทียบเท่าได้อย่างไร โดยพื้นฐานแล้วฉันมีที่ซ่อนเล็ก ๆ ซึ่งฉันต้องการใช้เป็นระยะ แต่ไม่ต้องการที่จะตามล่าในgit stash listจำนวนที่สะสมที่แท้จริงของมัน


68
git stash push -m stashnameเป็นไวยากรณ์ปัจจุบัน git stash save stashnameเลิกใช้แล้ว
SherylHohman

1
git stash push -m stashname ไม่ทำงานใน 2.8.0.windows.1
Jac

Git สำหรับ Windows 2.26.0 เปิดตัวเมื่อไม่กี่วันที่ผ่านมา อาจจะได้รับการแก้ไขแล้ว github.com/git-for-windows/git/releases/tag/v2.26.0.windows.1
tom_mai78101

คำตอบ:


816

นี่คือวิธีที่คุณทำ:

git stash save "my_stash"

"my_stash"ชื่อที่ซ่อนอยู่ที่ไหน

สิ่งที่มีประโยชน์เพิ่มเติมที่ควรทราบ: ที่เก็บข้อมูลทั้งหมดจะถูกเก็บไว้ในสแต็ก ประเภท:

git stash list

นี่จะแสดงรายการการหยุดทั้งหมดของคุณ

หากต้องการใช้ stash และลบออกจาก stash stack ให้พิมพ์:

git stash pop stash@{n}

หากต้องการใช้ stash และเก็บไว้ใน stash stack ให้พิมพ์:

git stash apply stash@{n}

nดัชนีการเปลี่ยนแปลงที่ซ่อนอยู่ที่ไหน


88
นี่ไม่ได้ตอบคำถาม ตามค่าเริ่มต้นคุณจะพบว่ามีตัวเลขจำนวนมากสำหรับที่เก็บของคุณ แต่นี่ไม่ได้ตอบว่าคุณจะใส่ชื่อเพื่อระบุได้อย่างง่ายดาย
GoodSp33d

16
OP พยายามหลีกเลี่ยงชื่อ stash @ {n} ชื่ออย่างไม่เหมาะสมสำหรับชื่อที่กำหนดเอง git stash apply <custom-name>
ตุ๋น

10
ไม่ตอบคำถามเกี่ยวกับการดึงที่ซ่อนตามชื่อ
nullsteph

46
git stash push -m my_stashเป็นไวยากรณ์ปัจจุบัน git stash save my_stashเลิกใช้แล้ว
SherylHohman

21
มันไม่เกี่ยวข้อง มันมีประโยชน์
Gayan Weerakutti

441

git stash saveถูกเลิกใช้ตั้งแต่ 2.15.x / 2.16 แต่คุณสามารถใช้ได้git stash push -m "message"

คุณสามารถใช้สิ่งนี้:

git stash push -m "message"

โดยที่ "ข้อความ" เป็นบันทึกย่อของคุณสำหรับที่เก็บสะสมนั้น

เพื่อที่จะดึงที่ซ่อนคุณสามารถใช้: git stash list. สิ่งนี้จะแสดงรายการเช่นนี้ตัวอย่างเช่น:

stash@{0}: On develop: perf-spike
stash@{1}: On develop: node v10

จากนั้นคุณเพียงแค่ใช้applyให้มันstash@{index}:

git stash apply stash@{1}

การอ้างอิง git stash man page


9
เอกสารแสดงpushมากกว่าsaveไวยากรณ์: git stash push
SherylHohman

30
นี่คือคำตอบที่แท้จริง น่าเสียดายที่มีคำตอบเก่า ๆ อยู่ด้านบน
malan

1
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรุ่นใหม่git stash push: stackoverflow.com/a/47231547/6309
VonC

แหล่งที่มา (บนเอกสารปัจจุบันล่าสุด) สำหรับการแจ้งการเลิกใช้งาน: git-scm.com/docs/git-stash/2.24.0#Documentation/…
Gabriel Devillers

1
FWIW: เมื่อทำงานgit stash apply stash@{1}ใน Powershell คุณจะได้รับerror: unknown switch 'e'กลับ แทนที่จะใช้git stash apply --index 1หรือgit stash apply 'stash@{1}'หลบหนี}และ{ใช้ backtick `
LosManos

104

คุณสามารถเปลี่ยนที่ซ่อนเป็นสาขาหากคุณรู้สึกว่ามันสำคัญพอ:

git stash branch <branchname> [<stash>]

จากหน้าคน:

สิ่งนี้สร้างและตรวจสอบสาขาใหม่ที่ชื่อ<branchname>เริ่มต้นจากการคอมมิชชันที่<stash>ถูกสร้างขึ้นในตอนแรกใช้การเปลี่ยนแปลงที่บันทึกไว้ในแผนผัง<stash>การทำงานใหม่และดัชนีจากนั้นปล่อย<stash>ถ้าทำเสร็จสมบูรณ์ เมื่อไม่<stash>ได้รับให้ใช้อันล่าสุด

สิ่งนี้มีประโยชน์ถ้าสาขาที่คุณวิ่งgit stash saveมีการเปลี่ยนแปลงมากพอที่จะใช้การเก็บซ่อนคอมไพล์ล้มเหลวเนื่องจากความขัดแย้ง เนื่องจากที่เก็บถูกนำไปใช้บนการคอมมิทที่เป็น HEAD ในขณะที่ git stash ถูกรันมันจะกู้คืนสถานะ stashed ดั้งเดิมโดยไม่มีข้อขัดแย้ง

คุณสามารถรีบูทสาขาใหม่นี้ไปยังที่อื่นที่เป็นของคุณเมื่อคุณถูกซ่อน


1
เนื่องจากกิ่งก้านค่อนข้างถูกในคอมไพล์คำแนะนำนี้จึงมีประโยชน์กับฉันมากที่สุด
Jayan

5
แน่นอน แต่นี่ไม่ได้ช่วยถ้าคุณต้องการใช้ที่เก็บนี้อีกครั้งในสาขาต่าง ๆ ในภายหลังเช่น OP ขอ คุณจะต้องเลือกหัวเชอร์รี่
ตุ๋น

@AdamDymitruk มีวิธีการดำเนินการใด ๆ ในขณะที่เก็บสะสมโดยไม่ต้องปรากฏ (เหมือนในgit stash apply)
Kasun Siyambalapitiya

เมื่อฉันลองทำสิ่งนี้ฉันได้รับข้อความแสดงข้อผิดพลาดว่าหนึ่งในไฟล์ของฉันจะถูกเขียนทับเมื่อเช็คเอาต์และฉันควรจะยืนยันหรือซ่อน (!) การเปลี่ยนแปลงของฉัน git stash push -m 'name'ทำงาน
wortwart

@AdamDymmitruk คำตอบที่น่าตื่นตาตื่นใจ พัดใจของฉัน
ด่าน

75

หากคุณกำลังมองหาวิธีที่มีน้ำหนักเบาในการบันทึกการเปลี่ยนแปลงสำเนาการทำงานปัจจุบันบางส่วนหรือทั้งหมดแล้วนำไปใช้ใหม่ในภายหลังให้ลองพิจารณาไฟล์แพตช์:

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

ทุกขณะนี้แล้วฉันสงสัยว่าฉันควรใช้ stashes สำหรับสิ่งนี้และจากนั้นฉันเห็นสิ่งต่าง ๆ เช่นความวิกลจริตข้างต้นและฉันพอใจกับสิ่งที่ฉันทำ :)


2
นี่ไง! ขอบคุณ. ฉันยังได้อัปเดต. gitignore ของฉันด้วยเพื่อละเว้นไฟล์. patch และฉันพร้อมที่จะมีแพตช์ให้มากที่สุด
LINGS

ฉันสามารถเห็นเจตนาที่อยู่เบื้องหลังคำถามซึ่งจะต้องนำการเปลี่ยนแปลงในท้องที่มาใช้ทุกครั้งที่คุณถอนสาขาจากเจ้านายและไม่ผูกมัดพวกเขา ดังนั้นบางทีคำถามควรได้รับการแก้ไขและคำตอบนี้ควรได้รับการยอมรับว่าเป็นทางออก เรียบง่ายเช่นกัน
ank

46

การหยุดชะงักไม่ได้หมายถึงการเป็นสิ่งถาวรตามที่คุณต้องการ คุณน่าจะได้รับบริการที่ดีขึ้นโดยใช้แท็กในการกระทำ สร้างสิ่งที่คุณต้องการซ่อน ทำให้ความมุ่งมั่นออกมาจากมัน สร้างแท็กสำหรับการส่ง HEAD^จากนั้นย้อนกลับไปยังสาขาของคุณ ตอนนี้เมื่อคุณต้องการนำไปใช้สะสมที่คุณสามารถใช้git cherry-pick -n tagname( -nคือ--no-commit)


1
แน่นอนว่าวิธีนี้ให้ความรู้สึกสะอาดขึ้นกว่าที่จะไปnamed commitเที่ยวที่ไหนซักแห่ง ความรำคาญเล็กน้อยเท่านั้นคือมันไม่ได้รับการมุ่งมั่นกับการเลือกเชอร์รี่และอยู่ใน diff ซึ่งหมายความว่าจะต้องมีการตรวจสอบด้วยตนเองในระหว่างการกระทำต่อไป
Aditya MP

1
นี่คือที่ใกล้เคียงที่สุด ฉันคิดว่าฉันจะสร้างชื่อแทนสำหรับสิ่งนี้ ฉันไม่ชอบใช้คำอธิบายเป็น "ชื่อ"
ตุ๋น

อัปยศมันเพิ่มในดัชนีและคุณต้องรีเซ็ตบางคนควรแก้ไข--no-stageตัวเลือก! ที่เกี่ยวข้อง: stackoverflow.com/questions/32333383/ …
Ciro Santilli 法轮功病毒审查审查六四法轮功法轮功

41

ใช้git stash push -m aNameForYourStashเพื่อบันทึก จากนั้นใช้git stash listเพื่อเรียนรู้ดัชนีของที่เก็บที่คุณต้องการใช้ จากนั้นใช้git stash pop --index 0ป๊อปอัพสะสมและใช้มัน

หมายเหตุ: ฉันใช้git เวอร์ชั่น 2.21.0.windows.1


1
คำตอบของคุณคือสิ่งที่คำตอบที่ติดอันดับจะคำนึงถึงความคิดเห็นนี้ในไวยากรณ์ปัจจุบันสำหรับgit stash {push,save}
ไมเคิล - Where's Clay Shirky

32

ฉันมีทั้งสองฟังก์ชั่นใน.zshrcไฟล์ของฉัน:

function gitstash() {
    git stash push -m "zsh_stash_name_$1"
}

function gitstashapply() {
    git stash apply $(git stash list | grep "zsh_stash_name_$1" | cut -d: -f1)
}

ใช้พวกเขาด้วยวิธีนี้:

gitstash nice

gitstashapply nice

"zsh_stash_name_" คืออะไร?
Sam Hasler

1
@ SamHasler เพียงบางส่วนของสตริงที่ไม่ซ้ำกันแบบสุ่ม ในกรณีที่คุณต้องการที่จะรู้ว่าสะสมถูกสร้างขึ้นด้วยการสะสมซ่อนตัวปกติหรือด้วยฟังก์ชั่นเหล่านี้
iWheelBuy

ทางออกที่สวยงามสำหรับแฟน ๆ นามแฝง
suarsenegger

22

แล้วเรื่องนี้ล่ะ

git stash save stashname
git stash apply stash^{/stashname}

1
มันเสียงเหมือนสิ่งที่ต้องการที่ใช้จะเป็นคำตอบที่ได้รับการยอมรับ แต่ได้ถูกลบไปแล้ว
ไมเคิล - ที่ไหน Clay Shirky

หืมทำไมมันถูกลบไป?
AdamB

ฉันไม่รู้เพราะฉันไม่ได้โพสต์คำตอบและไม่มี 10,000 ชื่อเสียง แต่ฉันคิดว่ามันมีบางอย่างที่เกี่ยวข้องกับความคิดเห็นที่บอกว่ามันใช้งานไม่ได้: มันโชคร้ายที่git stash apply stash^{/<regex>}ใช้งานไม่ได้ ค้นหารายการที่ซ่อนจริงเห็นความคิดเห็นภายใต้คำตอบที่ยอมรับ )
Michael - ที่ไหน Shirky Clay

นี่คือคำตอบที่คุณกำลังมองหา!
kiedysktos

1
สำหรับการดึงฉันไป 1. git stash listที่แสดงให้ฉัน stashes พร้อมกับหมายเลขดัชนีที่เกี่ยวข้องของพวกเขาแล้วฉันไป 2 git stash apply 0- ที่ 0 คือหมายเลขดัชนีที่ฉันจะได้ดูจากคำสั่งแรก
ตีสองหน้า

8

นามแฝง

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

การใช้

git sapply "<regex>"

  • เข้ากันได้กับ Git สำหรับ Windows

แก้ไข: ฉันยึดติดกับโซลูชันดั้งเดิมของฉัน แต่ฉันเห็นว่าทำไมคนส่วนใหญ่ถึงชอบรุ่นของ Etan Reisner (ด้านบน) ดังนั้นสำหรับบันทึก:

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"

การใช้awk -F: '{print $1}'จะช่วยลดความจำเป็นในการใช้งานทั้งหมด นอกจากนี้ทำไมห่อนี้ในฟังก์ชั่น? และการใช้awk -F: -vpat="$*" '$0 ~ pat {print $1}'ควรอนุญาตให้วาง grep เช่นกัน แม้ว่าอาจต้องใช้การอ้างอิงที่แตกต่างกันเล็กน้อยสำหรับรูปแบบ
Etan Reisner

@EtanReisner: ตัวอย่างข้อมูลของคุณมีมากกว่าหนึ่งบรรทัด
Vlastimil Ovčáčík

ทำให้การดำเนินการ{print $1; exit}เพื่อเลิกหลังจากบรรทัดแรกที่จับคู่
Etan Reisner

@EtanReisner: หลังจากการทดสอบบางอย่างฉันสามารถกำจัด sed แต่เสื้อคลุมและ grep อยู่
Vlastimil Ovčáčík

คุณไม่จำเป็นต้องใช้ grep แต่อย่างที่ฉันบอกว่ารูปแบบข้อความอาจแตกต่างกันหากไม่มี ฉันสมมติว่าโดย wrapper คุณหมายถึงฟังก์ชั่นเชลล์? คุณไม่เคยอธิบายว่าทำไมคุณคิดว่าคุณต้องการสิ่งนี้ดังนั้นฉันจึงไม่สามารถออกความเห็นว่าคุณทำจริง ๆ หรือไม่ แต่ฉันเชื่อว่าคุณไม่น่าจะเป็นไปได้ (คุณอาจต้องเรียกใช้เชลล์ด้วยตนเองแทนที่จะเป็น git stash โดยตรง แต่อาจไม่ใช่เช่นนั้น)
Etan Reisner

8

มันโชคร้ายที่git stash apply stash^{/<regex>}ใช้งานไม่ได้ (จริงๆแล้วมันไม่ได้ค้นหารายชื่อที่ซ่อนดูความคิดเห็นภายใต้คำตอบที่ได้รับการยอมรับ )

นี่คือการแทนที่แบบหล่นในที่ค้นหาgit stash listโดย regex เพื่อค้นหาแรก (ล่าสุด) stash@{<n>}จากนั้นส่งต่อไปที่git stash <command>:

# standalone (replace <stash_name> with your regex)
(n=$(git stash list --max-count=1 --grep=<stash_name> | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash show "$n" ; else echo "Error: No stash matches" ; return 1 ; fi)
(n=$(git stash list --max-count=1 --grep=<stash_name> | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash apply "$n" ; else echo "Error: No stash matches" ; return 1 ; fi)
# ~/.gitconfig
[alias]
  sshow = "!f() { n=$(git stash list --max-count=1 --grep=$1 | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash show "$n" ; else echo "Error: No stash matches $1" ; return 1 ; fi }; f"
  sapply = "!f() { n=$(git stash list --max-count=1 --grep=$1 | cut -f1 -d":") ; if [[ -n "$n" ]] ; then git stash apply "$n" ; else echo "Error: No stash matches $1" ; return 1 ; fi }; f"

# usage:

$ git sshow my_stash
 myfile.txt | 1 +
 1 file changed, 1 insertion(+)

$ git sapply my_stash
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.txt

no changes added to commit (use "git add" and/or "git commit -a")

โปรดทราบว่าจะส่งคืนรหัสผลลัพธ์ที่ถูกต้องเพื่อให้คุณสามารถใช้คำสั่งเหล่านี้ภายในสคริปต์อื่น ๆ สิ่งนี้สามารถตรวจสอบได้หลังจากรันคำสั่งด้วย:

echo $?

เพียงระวังเกี่ยวกับการหาประโยชน์ส่วนขยายของตัวแปรเนื่องจากฉันไม่แน่ใจเกี่ยวกับ--grep=$1ส่วนนี้ อาจจะเป็น--grep="$1"แต่ฉันไม่แน่ใจว่าจะรบกวนตัวคั่น regex (ฉันเปิดรับข้อเสนอแนะ)


6

คำตอบนี้เป็นหนี้มากกับ Klemen Slavič ฉันเพิ่งจะแสดงความคิดเห็นในคำตอบที่ยอมรับ แต่ฉันยังไม่มีตัวแทนมากพอ :(

คุณสามารถเพิ่มนามแฝงคอมไพล์เพื่อค้นหาการอ้างอิงการสะสมและใช้ในนามแฝงอื่น ๆ สำหรับการแสดง, การประยุกต์, การดรอปและอื่น ๆ

[alias]
    sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
    sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
    sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
    sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"

โปรดทราบว่าเหตุผลของref=$( ... ); echo ${ref:-<no_match>};รูปแบบคือดังนั้นสตริงว่างจะไม่ถูกส่งคืนซึ่งจะทำให้ sshow, sapply และ sdrop เพื่อกำหนดเป้าหมายที่เก็บล่าสุดแทนที่จะล้มเหลวอย่างที่คาดหวัง


1
งานนี้สำหรับฉันในขณะที่คำตอบที่ยอมรับดูเหมือนจะไม่ทำงาน (ดูคำยกย่องของฉันในคำตอบที่ได้รับการยอมรับ)
38911

4

นามแฝง นี่อาจเป็นไวยากรณ์โดยตรงสำหรับระบบที่คล้าย Unix โดยไม่จำเป็นต้องใส่แค็ปซูลในฟังก์ชั่น เพิ่มรายการต่อไปนี้ใน ~ / .gitconfig ภายใต้ [alias]

sshow = !sh -c 'git stash show stash^{/$*} -p' -
sapply = !sh -c 'git stash apply stash^{/$*}' -
ssave = !sh -c 'git stash save "${1}"' -

การใช้งาน: regex อย่างราบรื่น

ตัวอย่าง: git sshow MySecretStash

เครื่องหมายยัติภังค์ที่ท้ายว่ารับข้อมูลจากอินพุตมาตรฐาน


4

ใช้สคริปต์ทุบตีเล็ก ๆ เพื่อค้นหาจำนวนที่ซ่อน เรียกมันว่า "gitapply":

NAME="$1"
if [[ -z "$NAME" ]]; then echo "usage: gitapply [name]"; exit; fi
git stash apply $(git stash list | grep "$NAME" | cut -d: -f1)

การใช้งาน:

gitapply foo

... โดยที่ foo เป็นซับสตริงของชื่อของที่เก็บที่คุณต้องการ


3

ใช้git stash save NAMEสำหรับบันทึก

จากนั้น ... คุณสามารถใช้สคริปต์นี้เพื่อเลือกสิ่งที่จะใช้ (หรือป๊อป):

#!/usr/bin/env ruby
#git-stash-pick by Dan Rosenstark

# can take a command, default is apply
command = ARGV[0]
command = "apply" if !command
ARGV.clear

stashes = []
stashNames = []
`git stash list`.split("\n").each_with_index { |line, index|
    lineSplit = line.split(": ");
    puts "#{index+1}. #{lineSplit[2]}"
    stashes[index] = lineSplit[0]
    stashNames[index] = lineSplit[2]
}
print "Choose Stash or ENTER to exit: "
input = gets.chomp
if input.to_i.to_s == input
    realIndex = input.to_i - 1
    puts "\n\nDoing #{command} to #{stashNames[realIndex]}\n\n"
    puts `git stash #{command} #{stashes[realIndex]}`
end

ฉันชอบที่จะเห็นชื่อของการหยุดชะงักและเลือก นอกจากนี้ฉันใช้ Zshell และไม่ทราบวิธีใช้นามแฝง Bash บางอย่างด้านบน;)

หมายเหตุ: ตามที่เควินบอกคุณควรใช้แท็กและหยิบเชอร์รี่แทน


git stash savegit stash pushจะเลิกในความโปรดปรานของ
wranvaud

2

นี่เป็นวิธีหนึ่งในการทำให้สำเร็จโดยใช้ PowerShell:

<#
.SYNOPSIS
Restores (applies) a previously saved stash based on full or partial stash name.

.DESCRIPTION
Restores (applies) a previously saved stash based on full or partial stash name and then optionally drops the stash. Can be used regardless of whether "git stash save" was done or just "git stash". If no stash matches a message is given. If multiple stashes match a message is given along with matching stash info.

.PARAMETER message
A full or partial stash message name (see right side output of "git stash list"). Can also be "@stash{N}" where N is 0 based stash index.

.PARAMETER drop
If -drop is specified, the matching stash is dropped after being applied.

.EXAMPLE
Restore-Stash "Readme change"
Apply-Stash MyStashName
Apply-Stash MyStashName -drop
Apply-Stash "stash@{0}"
#>
function Restore-Stash  {
    [CmdletBinding()]
    [Alias("Apply-Stash")]
    PARAM (
        [Parameter(Mandatory=$true)] $message,         
        [switch]$drop
    )

    $stashId = $null

    if ($message -match "stash@{") {
        $stashId = $message
    }

    if (!$stashId) {
        $matches = git stash list | Where-Object { $_ -match $message }

        if (!$matches) {
            Write-Warning "No stashes found with message matching '$message' - check git stash list"
            return
        }

        if ($matches.Count -gt 1) {
            Write-Warning "Found $($matches.Count) matches for '$message'. Refine message or pass 'stash{@N}' to this function or git stash apply"
            return $matches
        }

        $parts = $matches -split ':'
        $stashId = $parts[0]
    }

    git stash apply ''$stashId''

    if ($drop) {
        git stash drop ''$stashId''
    }
}

รายละเอียดเพิ่มเติมที่นี่



1

ไปงานปาร์ตี้ที่นี่ช้า แต่ถ้าใช้ VSCode วิธีที่รวดเร็วในการทำเช่นนี้คือการเปิดพาเล็ทคำสั่ง (CTRL / CMD + SHIFT + P) และพิมพ์ "Pop Stash" คุณจะสามารถเรียกข้อมูลที่ซ่อนของคุณตามชื่อ โดยไม่จำเป็นต้องใช้ git CLI


1

git stash applyยังทำงานร่วมกับ refs stash@{0}อื่นที่ไม่ใช่ ดังนั้นคุณสามารถใช้แท็กสามัญเพื่อรับชื่อถาวร นี่เป็นข้อดีที่คุณไม่สามารถทำได้โดยไม่ตั้งใจgit stash dropหรือgit stash popมัน

ดังนั้นคุณสามารถกำหนดนามแฝงpstash(aka "ที่เก็บถาวร") ดังนี้:

git config --global alias.pstash '!f(){ git stash && git tag "$1" stash && git stash drop; }; f'

ตอนนี้คุณสามารถสร้างที่ซ่อนที่ติดแท็ก:

git pstash x-important-stuff

และshowและapplyอีกครั้งตามปกติ:

git stash show x-important-stuff
git stash apply x-important-stuff

0

ฉันไม่คิดว่าจะมีวิธีการคอมไพล์ป๊อปซ่อนโดยชื่อของมัน

ฉันได้สร้างฟังก์ชั่นทุบตีที่ทำมัน

#!/bin/bash

function gstashpop {
  IFS="
"
  [ -z "$1" ] && { echo "provide a stash name"; return; }
  index=$(git stash list | grep -e ': '"$1"'$' | cut -f1 -d:)
  [ "" == "$index" ] && { echo "stash name $1 not found"; return; }
  git stash apply "$index"
}

ตัวอย่างการใช้งาน:

[~/code/site] on master*
$ git stash push -m"here the stash name"
Saved working directory and index state On master: here the stash name

[~/code/site] on master
$ git stash list
stash@{0}: On master: here the stash name

[~/code/site] on master
$ gstashpop "here the stash name"

ฉันหวังว่ามันจะช่วย!


0

สำหรับทุกอย่างนอกเหนือจากการสร้างที่ซ่อนฉันจะเสนอวิธีแก้ไขปัญหาอื่นโดยแนะนำfzfเป็นการพึ่งพา ฉันขอแนะนำให้คุณสละเวลา 5 นาทีและแนะนำให้รู้จักกับมันเพราะมันเป็นเครื่องช่วยเพิ่มประสิทธิภาพการทำงาน

อย่างไรก็ตามข้อความที่ตัดตอนมาที่เกี่ยวข้องจากหน้าตัวอย่างของพวกเขาเสนอการค้นหาที่ซ่อน มันง่ายมากที่จะเปลี่ยน scriptlet เพื่อเพิ่มฟังก์ชั่นเพิ่มเติม (เช่นแอพพลิเคชั่นสะสมหรือวาง):

fstash() {
    local out q k sha
    while out=$(
            git stash list --pretty="%C(yellow)%h %>(14)%Cgreen%cr %C(blue)%gs" |
            fzf --ansi --no-sort --query="$q" --print-query \
                --expect=ctrl-d,ctrl-b); do
        mapfile -t out <<< "$out"
        q="${out[0]}"
        k="${out[1]}"
        sha="${out[-1]}"
        sha="${sha%% *}"
        [[ -z "$sha" ]] && continue
        if [[ "$k" == 'ctrl-d' ]]; then
            git diff $sha
        elif [[ "$k" == 'ctrl-b' ]]; then
            git stash branch "stash-$sha" $sha
            break;
        else
            git stash show -p $sha
        fi
    done
}

0

ดังนั้นฉันไม่แน่ใจว่าทำไมหัวข้อนี้จึงตกตะลึงมาก ฉันสามารถตั้งชื่อ stash ด้วยการกดและการบันทึกที่ไม่สนับสนุนและฉันสามารถใช้ regex เพื่อดึงกลับมาพร้อมกับการใช้:

วิธีการเก็บซ่อน Git เพื่อใช้ชื่อที่จะใช้

$ git stash push -m "john-hancock"

$ git stash apply stash^{/john-hancock}

ดังที่ได้กล่าวมาแล้วคำสั่งบันทึกเลิกใช้แล้ว แต่ก็ยังใช้งานได้ดังนั้นคุณสามารถใช้สิ่งนี้กับระบบเก่าที่คุณไม่สามารถอัปเดตพวกเขาด้วยการโทรแบบกด ต่างจากคำสั่ง push ไม่จำเป็นต้องใช้สวิตช์ -m กับการบันทึก

// save is deprecated but still functional  
$ git stash save john-hancock

มีปัญหากับป๊อปและวาง

ฉันไม่เชื่อว่ามันใช้งานได้กับป๊อป แต่ฉันคิดว่านั่นเป็นเพราะป๊อปทำงานได้ไม่ดีหลังจากการสมัครและ regex ไม่เป็นมิตร นั่นเป็นเพียงลางสังหรณ์ ฉันยังไม่ได้ทดสอบ

นี่คือ Git 2.2 และ Windows 10

หลักฐานภาพ

นี่คือภาพเคลื่อนไหว GIF ที่สวยงามที่แสดงให้เห็นถึงกระบวนการ

GIF แบบเคลื่อนไหวแสดงการซ่อน git นำไปใช้โดยใช้ชื่อที่ระบุตัวได้

ลำดับเหตุการณ์

GIF ทำงานได้อย่างรวดเร็ว แต่ถ้าคุณมองกระบวนการก็คือ:

  1. คำสั่ง ls แสดงไฟล์ 4 ไฟล์ในไดเรกทอรี
  2. แตะ example.html เพิ่มไฟล์ที่ 5
  3. git stash push -m "john-hancock" -a (-a มีไฟล์ที่ไม่ได้ติดตาม)
  4. คำสั่ง ls แสดงไฟล์ 4 ไฟล์หลังจาก stash หมายถึง stash และการฮาร์ดรีเซ็ตโดยนัยทำงาน
  5. git stash ใช้ stash ^ {/ john-hancock} วิ่ง
  6. คำสั่ง ls แสดงรายการไฟล์ 5 ไฟล์ซึ่งแสดงไฟล์ example.html กลับมาซึ่งหมายความว่าคำสั่ง git stash Apply ใช้งานได้

มันสมเหตุสมผลหรือไม่

พูดตรงไปตรงมาฉันไม่แน่ใจว่าประโยชน์ของวิธีนี้คืออะไร มีค่าในการให้ชื่อที่ซ่อน แต่ไม่ใช่การดึง อาจจะเขียนสคริปต์กระบวนการที่จะเป็นประโยชน์ แต่ก็ยังง่ายกว่าที่จะเพียงแค่ป๊อปซ่อนโดยใช้ชื่อ

$ git stash pop 3
$ git stash apply 3

นั่นดูง่ายกว่าสำหรับฉันมากกว่า regex

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.