Làm thế nào để phục hồi một stash bị rơi trong Git?


1738

Tôi thường xuyên sử dụng git stashgit stash popđể lưu và khôi phục các thay đổi trong cây làm việc của tôi. Hôm qua tôi đã có một số thay đổi trong cây làm việc của mình mà tôi đã cất và bật lên, và sau đó tôi đã thực hiện nhiều thay đổi hơn cho cây làm việc của mình. Tôi muốn quay lại và xem xét các thay đổi được lưu trữ của ngày hôm qua, nhưng git stash popdường như xóa tất cả các tham chiếu đến cam kết liên quan.

Tôi biết rằng nếu tôi sử dụng git stashthì .git / refs / stash chứa tham chiếu của cam kết được sử dụng để tạo stash. Và .git / log / refs / stash chứa toàn bộ stash. Nhưng những tài liệu tham khảo đã biến mất sau đó git stash pop. Tôi biết rằng cam kết vẫn còn trong kho lưu trữ của tôi ở đâu đó, nhưng tôi không biết nó là gì.

Có cách nào dễ dàng để khôi phục tham chiếu cam kết của ngày hôm qua không?

Lưu ý rằng điều này không quan trọng đối với tôi hôm nay vì tôi có bản sao lưu hàng ngày và có thể quay lại cây làm việc của ngày hôm qua để nhận các thay đổi của mình. Tôi đang hỏi bởi vì phải có một cách dễ dàng hơn!


74
Lưu ý cho tương lai: Nếu bạn không muốn mất stash mỗi lần git stash pop, bạn có thể làm git stash applythay thế. Nó cũng làm điều tương tự, ngoại trừ việc nó không xóa tham chiếu đến stash được áp dụng.
Kevin

3
Đã thử tất cả mọi thứ ở đây, không thể tìm thấy một thùng rác đã được bật lên. Rất vui mừng vì jetbrains
Juan Mendes


Tôi đã có vấn đề này. Để cập nhật repo của tôi, tôi chạy git stash, git pull -r upstream, git push -f origin, git stash pop, và pop nói "chết người: log cho refs / stash là trống rỗng". Tôi đã thử một loạt các câu trả lời này, không có gì hiệu quả. Khi tôi nhìn vào .git / refs / stash , SHA đã ở đó. Có lẽ vấn đề với việc đánh dấu ổ đĩa mạng Windows để đồng bộ hóa ngoại tuyến? 🤷♂️
brianary

Câu trả lời:


2786

Khi bạn biết hàm băm của stash commit bạn đã bỏ, bạn có thể áp dụng nó như một stash:

git stash apply $stash_hash

Hoặc, bạn có thể tạo một nhánh riêng cho nó với

git branch recovered $stash_hash

Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với tất cả các công cụ bình thường. Khi bạn đã hoàn tất, chỉ cần thổi chi nhánh đi.

Tìm hàm băm

Nếu bạn chỉ bật nó và thiết bị đầu cuối vẫn mở, bạn vẫngit stash pop sẽ có giá trị băm được in trên màn hình (cảm ơn, Dolda).

Mặt khác, bạn có thể tìm thấy nó bằng cách sử dụng cái này cho Linux, Unix hoặc Git Bash cho Windows:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

... hoặc sử dụng Powershell cho Windows:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

Điều này sẽ hiển thị cho bạn tất cả các cam kết tại các mẹo của biểu đồ cam kết không còn được tham chiếu từ bất kỳ chi nhánh hoặc thẻ nào - mọi cam kết bị mất, bao gồm mọi cam kết bạn đã tạo, sẽ ở đâu đó trong biểu đồ đó.

Cách dễ nhất để tìm stash commit bạn muốn có lẽ là chuyển danh sách đó sang gitk:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

... hoặc xem câu trả lời từ emragins nếu sử dụng Powershell cho Windows.

Điều này sẽ khởi chạy một trình duyệt kho lưu trữ cho bạn thấy từng cam kết trong kho lưu trữ , bất kể nó có thể truy cập được hay không.

Bạn có thể thay thế gitkở đó bằng một cái gì đó như git log --graph --oneline --decoratenếu bạn thích một biểu đồ đẹp trên bảng điều khiển trên một ứng dụng GUI riêng.

Để phát hiện các xác nhận stash, hãy tìm các thông báo cam kết của mẫu này:

        WIP trên somebranch : commithash Một số thông điệp cam kết cũ

Lưu ý : Thông báo cam kết sẽ chỉ ở dạng này (bắt đầu bằng "WIP on") nếu bạn không cung cấp tin nhắn khi bạn đã làm git stash.


49
Jaydel lấy lời ra khỏi miệng tôi. Bài đăng này đã cứu công việc của tôi :) Tôi chỉ muốn thêm - nhớ ngày bạn làm việc với bất cứ điều gì bạn mất giúp duyệt gitk dễ dàng hơn cho những gì bạn đang tìm kiếm.
Sridhar Sarnobat

4
@Codey: Vì PowerShell. Tôi không biết nếu MsysGit gửi một nhị phân AWK. Googling nói với tôi rằng một cái gì đó giống như %{ $_.Split(' ')[2]; }nên thực hiện tương đương với lệnh {print $3}đó awktrong PowerShell, nhưng tôi không có hệ thống Windows để kiểm tra điều đó và bạn vẫn cần một phần tương đương /dangling commit/. Dù sao, chỉ cần chạy git fsck --no-reflogvà nhìn vào đầu ra. Bạn muốn các giá trị băm từ các dòng <cam kết> lúng túng.
Aristotle Pagaltzis

7
Điều đáng nói là thông điệp cam kết sẽ chỉ có chuỗi "WIP" nếu bạn không cung cấp thông điệp của riêng mình khi lưu trữ (tức là bằng cách thực hiện git stash save "<message>").
Samir Aguiar

12
Nếu bạn biết khi thả xảy ra, bạn có thể sử dụng một lớp lót này để có được danh sách các cam kết lơ lửng bằng cách tăng thời gian: git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sortmục cuối cùng có lẽ là mục bạn muốn stash apply.
ris8_allo_zen0

3
git stash apply {ref}khôi phục một stash bị rơi! gitquá tuyệt vời nên là bất hợp pháp!
Tom Russell

707

Nếu bạn không đóng thiết bị đầu cuối, chỉ cần nhìn vào đầu ra từ git stash popvà bạn sẽ có ID đối tượng của ngăn chứa bị rơi. Nó thường trông như thế này:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(Lưu ý rằng git stash dropcũng tạo ra cùng một dòng.)

Để lấy lại số tiền đó, chỉ cần chạy git branch tmp 2cae03evà bạn sẽ lấy nó làm chi nhánh. Để chuyển đổi nó thành stash, hãy chạy:

git stash apply tmp
git stash

Có nó như một nhánh cũng cho phép bạn thao tác tự do; ví dụ, để chọn anh đào hoặc hợp nhất nó.


54
Bạn cũng có thể làm git stash apply commitidsau đó git stashđể có được một stash mới.
Matthew Flaschen

32
Lưu ý rằng nếu git tự động hợp nhất stash và có xung đột, nó sẽ không hiển thị cho bạn hàm băm.
James

31
@James: Sau đó, một lần nữa, nếu những xung đột đó là kết quả của việc chạy git stash pop, nó cũng sẽ không bỏ qua stash, vì vậy đó thường không phải là vấn đề.
Dolda2000

2
Không có SHA trong sản lượng pop git stash của tôi. :(
Vứt bỏ tài khoản

2
@Honey: Đó là điểm của git stash pop. Nếu bạn muốn áp dụng stash mà không làm rơi nó, git stash applythay vào đó hãy sử dụng . Ngoài ra, nếu bạn muốn áp dụng thay đổi cho một số chi nhánh, bạn cũng có thể chọn cam kết thay thế.
Dolda2000

271

Chỉ muốn đề cập đến bổ sung này cho các giải pháp được chấp nhận. Điều đó không rõ ràng ngay với tôi khi lần đầu tiên tôi thử phương pháp này (có lẽ nó nên như vậy), nhưng để áp dụng stash từ giá trị băm, chỉ cần sử dụng "git stash áp dụng":

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

Khi tôi mới sử dụng git, điều này không rõ ràng với tôi và tôi đã thử các kết hợp khác nhau của "git show", "git áp dụng", "patch", v.v.


3
Xin lưu ý rằng điều này áp dụng (duh!) Stash cho cây làm việc hiện tại. Nếu cây bị bẩn, bạn có thể muốn sử dụng nhánh tạm thời hoặc stash trước, áp dụng stash từ SHA-1, stash một lần nữa và sau đó bật thứ hai đến stash cuối cùng (được gọi là stash @ {1}).
musiKk

111

Để có được danh sách các bản lưu vẫn còn trong kho lưu trữ của bạn, nhưng không thể truy cập được nữa:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

Nếu bạn đã đặt tiêu đề cho stash của mình, hãy thay thế "WIP" ở -grep=WIPcuối lệnh bằng một phần tin nhắn của bạn, vd -grep=Tesselation.

Lệnh đang grepping cho "WIP" vì thông báo cam kết mặc định cho stash có dạng WIP on mybranch: [previous-commit-hash] Message of the previous commit.


1
echo 'git fsck - có thể truy cập | cam kết grep | cắt -d "" -f3 | xargs git log --merges --no-walk --grep = WIP '> / usr / local / bin / git-stashlog; chmod a + rx / usr / local / bin / git-stashlog # git stashlog
Erik Martino

Hoặc bạn có thể thêm phần này vào .gitconfig dưới dạng bí danh (đặt trước lệnh với a !).
asmeker

Đã lưu thịt xông khói của tôi - cũng không thực sự nhưng đã giúp tôi mã hóa lại những ngày làm việc - đánh giá cao - vì tôi mới bỏ gần đây tôi mới chọn SHA hàng đầu từ đầu ra của lệnh của bạn - sau đó .... git stash áp dụng SHA ... như đã đề cập trong các câu trả lời khác - nhiều thx
danday74

75

Tôi vừa xây dựng một lệnh giúp tôi tìm thấy cam kết bị mất của mình:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

Điều này liệt kê tất cả các đối tượng trong cây .git / object, định vị các đối tượng thuộc kiểu commit, sau đó hiển thị tóm tắt của từng đối tượng. Từ thời điểm này, chỉ cần xem qua các cam kết để tìm một "WIP phù hợp với công việc: 6a9bb2" ("công việc" là chi nhánh của tôi, 619bb2 là một cam kết gần đây).

Tôi lưu ý rằng nếu tôi sử dụng "git stash áp dụng" thay vì "git stash pop" thì tôi sẽ không gặp vấn đề này và nếu tôi sử dụng "git stash save message " thì cam kết có thể dễ dàng tìm thấy hơn.

Cập nhật: Với ý tưởng của Nathan, điều này trở nên ngắn hơn:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less

41

git fsck --unreachable | grep commitsẽ hiển thị sha1, mặc dù danh sách mà nó trả về có thể khá lớn. git show <sha1>sẽ hiển thị nếu đó là cam kết bạn muốn.

git cherry-pick -m 1 <sha1> sẽ hợp nhất các cam kết vào chi nhánh hiện tại.


37

Tương đương Windows PowerShell bằng gitk:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

Có lẽ có một cách hiệu quả hơn để làm điều này trong một đường ống, nhưng điều này thực hiện công việc.


1
Tôi rất biết ơn cho câu trả lời của bạn
Виталий Шебаниц

32

Nếu bạn muốn khôi phục lại một stash bị mất, trước tiên bạn cần tìm băm của stash bị mất của bạn.

Như Aristotle Pagaltzis đề nghị git fscknên giúp bạn.

Cá nhân tôi sử dụng log-allbí danh của mình để hiển thị cho tôi mọi cam kết (cam kết có thể phục hồi) để có cái nhìn rõ hơn về tình huống:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

Bạn có thể thực hiện tìm kiếm thậm chí nhanh hơn nếu bạn chỉ tìm kiếm thông báo "WIP on".

Khi bạn biết sha1 của mình, bạn chỉ cần thay đổi reflog stash của mình để thêm stash cũ:

git update-ref refs/stash ed6721d

Bạn có thể thích có một tin nhắn liên quan -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

Và thậm chí bạn sẽ muốn sử dụng nó như một bí danh:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1

2
Tuy nhiên, -d\\ nên -d\ (hoặc thậm chí rõ ràng hơn -d' ')
joeytwiddle

Có một lỗi: "gây tử vong: tranh luận mơ hồ 'lơ lửng': không biết sửa đổi hoặc đường dẫn không có trong cây làm việc."
Daniel Ryan

bạn cũng cần bọc lệnh phụ bằng dấu ngoặc kép git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721
Andrei Shostik

18

Tôi thích cách tiếp cận của Aristotle, nhưng không thích sử dụng GITK ... vì tôi đã quen sử dụng GIT từ dòng lệnh.

Thay vào đó, tôi lấy các cam kết lơ lửng và xuất mã thành tệp DIFF để xem xét trong trình chỉnh sửa mã của mình.

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

Bây giờ bạn có thể tải lên tệp diff / txt (tệp trong thư mục chính của bạn) vào trình soạn thảo txt của bạn và xem mã thực tế và kết quả SHA.

Sau đó chỉ cần sử dụng

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

17

Bạn có thể liệt kê tất cả các cam kết không thể truy cập bằng cách viết lệnh này trong terminal -

git fsck --unreachable

Kiểm tra băm cam kết không thể truy cập -

git show hash

Cuối cùng áp dụng nếu bạn tìm thấy mục stash -

git stash apply hash

15

Tại sao mọi người hỏi câu hỏi này? Bởi vì họ chưa biết hoặc hiểu về reflog.

Hầu hết các câu trả lời cho câu hỏi này đưa ra các lệnh dài với các tùy chọn hầu như không ai sẽ nhớ. Vì vậy, mọi người đi vào câu hỏi này và sao chép dán bất cứ điều gì họ nghĩ rằng họ cần và quên nó gần như ngay lập tức sau đó.

Tôi sẽ khuyên mọi người với câu hỏi này chỉ kiểm tra reflog (git reflog), không nhiều hơn thế. Khi bạn thấy danh sách tất cả các cam kết đó, có hàng trăm cách để tìm hiểu những gì bạn đang tìm kiếm và chọn anh đào hoặc tạo một nhánh từ nó. Trong quá trình bạn sẽ tìm hiểu về các tùy chọn reflog và hữu ích cho các lệnh git cơ bản khác nhau.


1
Chào Robby. Điều này có liên quan nếu bạn đang làm việc, bị theo dõi bên cạnh và cần phải tìm lại nơi bạn đã rời đi vài tuần trước chỉ để biết rằng bạn không thể tìm thấy công việc bị bỏ rơi của mình - nó có thể bị mất ở đâu đó trong những thứ khác bạn đã làm reflog là tuyệt vời nếu đó là lịch sử gần đây, nhưng không phải là khoảng cách thời gian dài.
emragins

1
Xin chào, tôi đồng ý, nhưng đây chính xác là trường hợp sử dụng của OP. Tôi không biết chắc chắn các lệnh khác được đăng ở đây sẽ hoạt động như thế nào, nhưng geuss của tôi sẽ là họ cũng sẽ ngừng hoạt động một khi các tham chiếu đến cam kết bị đánh cắp của anh ta được dọn sạch.
RobbyD

1
Hmm ... kịch bản ở trên là điều đã đưa tôi đến câu hỏi này và tôi biết rằng ít nhất là một vài tuần nếu không đến gần một tháng giữa khi tôi (vô tình) bị mất stash và khi tôi có thể phục hồi nó.
emragins

15

Trong OSX với git v2.6.4, tôi chỉ vô tình chạy git stash drop, sau đó tôi tìm thấy nó bằng cách đi qua các bước dưới đây

Nếu bạn biết tên của stash thì hãy sử dụng:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

nếu không, bạn sẽ tìm thấy ID từ kết quả bằng cách thủ công với:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

Sau đó, khi bạn tìm thấy id xác thực, chỉ cần nhấn git stash, áp dụng {commit-id}

Hy vọng điều này sẽ giúp ai đó nhanh chóng


12

Tôi muốn thêm vào giải pháp được chấp nhận một cách tốt khác để trải qua tất cả các thay đổi, khi bạn không có sẵn gitk hoặc không có X cho đầu ra.

git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits

for h in `cat tmp_commits`; do git show $h | less; done

Sau đó, bạn nhận được tất cả các khác biệt cho các băm được hiển thị lần lượt. Nhấn 'q' để đến diff khác.


12

Tôi không thể có bất kỳ câu trả lời nào để hoạt động trên Windows trong một cửa sổ lệnh đơn giản (Windows 7 trong trường hợp của tôi). awk, grepSelect-stringkhông được công nhận là lệnh. Vì vậy, tôi đã thử một cách tiếp cận khác:

  • lần chạy đầu tiên: git fsck --unreachable | findstr "commit"
  • sao chép đầu ra vào notepad
  • tìm thay thế "cam kết không thể truy cập" bằng start cmd /k git show

sẽ trông giống như thế này:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • lưu dưới dạng tệp .bat và chạy nó
  • kịch bản sẽ mở một loạt các cửa sổ lệnh, hiển thị từng cam kết
  • nếu bạn tìm thấy cái bạn đang tìm, hãy chạy: git stash apply (your hash)

có thể không phải là giải pháp tốt nhất, nhưng làm việc cho tôi


Bạn có thể sử dụng git bash ngay cả trên Windows. Trong git bash, bạn có tất cả các công cụ dòng lệnh (unixoid) mà bạn cần.
Adrian W

10

Câu trả lời được chấp nhận bởi Aristotle sẽ hiển thị tất cả các cam kết có thể truy cập, bao gồm các cam kết không giống như stash. Để lọc tiếng ồn:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

Điều này sẽ chỉ bao gồm các cam kết có chính xác 3 cam kết cha mẹ (mà một stash sẽ có) và thông báo có "WIP on".

Hãy ghi nhớ rằng nếu bạn đã lưu stash của mình bằng một tin nhắn (ví dụ git stash save "My newly created stash"), điều này sẽ ghi đè thông báo "WIP on ..." mặc định.

Bạn có thể hiển thị thêm thông tin về từng cam kết, ví dụ: hiển thị thông báo cam kết hoặc chuyển nó tới git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

6

Yêu thích của tôi là một lót này:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

Về cơ bản, đây là ý tưởng giống như câu trả lời này nhưng ngắn hơn nhiều. Tất nhiên, bạn vẫn có thể thêm --graphđể có được màn hình giống như cây.

Khi bạn đã tìm thấy cam kết trong danh sách, hãy áp dụng với

git stash apply THE_COMMIT_HASH_FOUND

Đối với tôi, việc sử dụng --no-reflogsđã tiết lộ mục stash bị mất, nhưng --unreachable(như tìm thấy trong nhiều câu trả lời khác) thì không.

Chạy nó trên git bash khi bạn ở trong Windows.

Tín dụng: Chi tiết về các lệnh trên được lấy từ https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf


5

Khôi phục nó bằng cách sử dụng các bước sau:

  1. Xác định mã băm đã xóa:

    gitk --all $ (git fsck --no-reflog | awk '/ dangling commit / {print $ 3}')

  2. Cherry Pick Stash:

    git cherry-pick -m 1 $ stash_hash_code

  3. Giải quyết xung đột nếu có sử dụng:

    sáp nhập git

Ngoài ra, bạn có thể gặp sự cố với thông báo cam kết nếu bạn đang sử dụng gerrit. Vui lòng bỏ các thay đổi của bạn trước khi theo các lựa chọn thay thế tiếp theo:

  1. Sử dụng thiết lập lại cứng cho cam kết trước đó và sau đó khuyến nghị thay đổi này.
  2. Bạn cũng có thể bỏ qua sự thay đổi, rebase và đề nghị.

@ miva2 chỉnh sửa của bạn đã xóa liên kết đến câu trả lời đúng nhất trong câu hỏi này. Thêm liên kết trở lại trong bình luận stackoverflow.com/questions/89332/ từ
Abhijeet

4

Những gì tôi đến đây đang tìm kiếm là làm thế nào để thực sự lấy lại được stash, bất kể những gì tôi đã kiểm tra. Cụ thể, tôi đã cất giấu một cái gì đó, sau đó kiểm tra một phiên bản cũ hơn, sau đó bật nó lên, nhưng bản gốc là không có gì ở thời điểm trước đó, vì vậy bản stash biến mất; Tôi không thể làm gì git stashđể đẩy nó trở lại vào ngăn xếp. Điều này làm việc cho tôi:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

Nhìn lại, tôi có nên sử dụng git stash applykhông git stash pop. Tôi đã làm một bisectvà có một bản vá nhỏ mà tôi muốn áp dụng ở mỗi bisectbước. Bây giờ tôi đang làm điều này:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.

Đây là một câu trả lời, hoặc tiếp tục của câu hỏi?
Alex Brown

Một chút của cả hai. Tôi tìm thấy trang này bởi vì tôi đã mất một stash và đang cố gắng lấy lại nó. Trường hợp sử dụng đối với tôi là thực hiện một phép chia nhỏ mà tôi muốn áp dụng thay đổi trước khi thử nghiệm ở mỗi bước. Tôi đã học được một cách khó khăn là bạn không thể chỉ bật, kiểm tra, stash, bisect bởi vì điều đó có thể để lại một cam kết khác trên stash, do đó stash apply.
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.