Tại sao git stash không phải là duy nhất cho mỗi nhánh?


81

Tôi cho rằng nó cho phép di chuyển các thay đổi từ nhánh này sang nhánh khác nhưng đó là mục đích của việc hái anh đào và nếu bạn không thực hiện cam kết các thay đổi của mình, có lẽ bạn không nên di chuyển chúng xung quanh?

Đôi khi tôi đã áp dụng sai stash ở nhánh sai, điều này khiến tôi băn khoăn về câu hỏi này.


13
Git thiếu thứ gì đó cho phép bạn liên kết các thay đổi chưa được cam kết với một nhánh (hoặc đầu). Điều này trở nên rõ ràng khi bạn có công việc đang tiến hành cho nhiều chi nhánh tại một thời điểm. Như câu trả lời ở đây đã chỉ ra, dù sao thì stash cũng có các ứng dụng hữu ích dựa trên các đặc điểm của nó. git stash-herebất kỳ ai?
Blake Taylor

Câu trả lời:


69

Như đã đề cập, nếu bạn muốn có một "kho lưu trữ trên mỗi nhánh", bạn thực sự muốn có một nhánh mới tách khỏi nhánh hiện có.

Ngoài ra, bên cạnh thực tế đã được đề cập rằng kho lưu trữ cho phép bạn kéo vào một nhánh mà bạn đang làm việc, nó cũng cho phép bạn chuyển đổi các nhánh trước khi bạn đã cam kết mọi thứ. Điều này không hữu ích cho việc hái anh đào theo nghĩa thông thường mà rất hữu ích cho việc hái anh đào bản sao làm việc của bạn .

F.ex., trong khi làm việc trên một nhánh tính năng, tôi thường sẽ nhận thấy các lỗi nhỏ hoặc tạp chất mỹ phẩm trong mã không liên quan đến nhánh đó. Vâng, tôi chỉ sửa những cái đó ngay lập tức. Khi đến thời điểm cam kết, tôi cam kết một cách chọn lọc những thay đổi có liên quan nhưng không phải những bản sửa lỗi và mỹ phẩm. Thay vào đó, tôi lưu trữ những thứ đó, điều này cho phép tôi chuyển sang chi nhánh sửa lỗi nhỏ trên ổn định của mình, nơi tôi có thể áp dụng kho lưu trữ và cam kết từng bản sửa lỗi nhỏ riêng biệt. (Tùy thuộc vào những thay đổi được đề cập, tôi cũng sẽ lưu trữ một số trong số chúng một lần nữa, để chuyển sang một nhánh tính năng khác, nơi tôi áp dụng chúng .)

Điều này cho phép tôi đi sâu vào chế độ lập trình khi tôi đang làm việc và không phải lo lắng về việc quản lý thư viện phù hợp với mã của tôi. Sau đó, khi tôi nghỉ ngơi tinh thần, tôi có thể quay lại và sắp xếp cẩn thận những thay đổi của mình vào tất cả các ngăn phù hợp.

Nếu kho lưu trữ không phải là toàn cầu, loại quy trình công việc này sẽ khó thực hiện hơn nhiều.


4
Tôi không đồng ý với điều này: As mentioned, if you want a “per-branch stash,” you really want a new branch forking off from the existing branch.. Đặc biệt, tôi thường chuyển đổi giữa hai phiên bản của cùng một chương trình, và chạy toàn bộ makemất 10 phút; có thể lưu trữ các tệp nhị phân đã xây dựng, trên mỗi nhánh, sẽ rất tốt. Và tôi chắc chắn không muốn các mã nhị phân trong nhật ký hoặc trong một nhánh.
Clément

Tại sao? (Tôi nghĩ rằng bạn làm gì, bạn chỉ không biết nó.)
Aristotle Pagaltzis

21

Kể từ Git 1.6, giờ đây bạn có thể áp dụng kho lưu trữ cho các chi nhánh bằng cách sử dụng

git stash branch name_of_new_branch

Git sẽ tạo nhánh mới cho bạn, và hãy kiểm tra nó! Để biết thêm thông tin, hãy xem

  • sách git

  • info git-stashvà tìm kiếm trên tùy chọn = branch.

Tôi đoán bạn có thể di chuyển các kho lưu trữ xung quanh bằng cách sử dụng

git stash branch <branch | new_branch> [<stash>]

và để xem danh sách các kho lưu trữ của bạn, hãy sử dụng

git stash list

Tài liệu tham khảo


Cảm ơn bạn! Tôi không biết rằng bạn có thể áp dụng chuỗi ký tự cho các chi nhánh, nhưng đây dường như là một hành vi. Có một cửa hàng trên một chi nhánh, tôi đã kiểm tra một chi nhánh khác và làm một số công việc ở đó. Hóa ra tôi cũng cần lưu trữ một số thay đổi đang chờ xử lý của nó trước khi có thể rebase để thành thạo. Cập nhật " gitk --all" của tôi không còn hiển thị kho lưu trữ đầu tiên của tôi nữa; Tôi nghĩ nó có thể bị che phủ. Sau khi công việc của tôi ở chi nhánh thứ hai hoàn thành, sau đó tôi mở kho lưu trữ đó. Sau đó, "" cập nhật của tôi gitk --allhiển thị lại kho lưu trữ ban đầu.
Daniel Miladinov

17

nếu bạn muốn một "kho lưu trữ" chạy khỏi một chi nhánh, hãy làm như thế này để lưu trữ các thay đổi của bạn trên một chi nhánh mới ngoài chi nhánh hiện tại của bạn.

git checkout -b new_stash
git commit -a -m "stashed changes"

để hoàn tác lưu trữ

git reset HEAD^
git branch -d new_stash

git stash đặc biệt hữu ích vì bạn có thể kéo các thay đổi vào một cây bẩn, tức là nếu bạn có các chỉnh sửa nổi bật và muốn thực hiện

git pull

và bạn không thể, bạn có thể lưu trữ các thay đổi của mình, kéo và sau đó áp dụng

git stash
git pull
git stash apply
git stash clear

hy vọng điều này đã giúp!


Điều gì sẽ xảy ra nếu thứ bạn đang cố gắng lưu trữ, chẳng hạn như một loạt các tệp nhị phân sinh ra từ việc chạy maketrong nhánh đó? (một kho lưu trữ trên mỗi nhánh sẽ tiết kiệm thời gian vào lần tới khi bạn xây dựng tăng dần trong nhánh đó, nhưng bạn chắc chắn không muốn thêm các tệp nhị phân vào chỉ mục)
Clément

5

git-stash hữu ích nhất đối với tôi để chuyển các thay đổi chưa đăng ký sang một nhánh khác với nhánh hiện đã đăng xuất.

Ví dụ - tôi thường thấy mình đang thực hiện các thay đổi đơn giản trên một nhánh sửa lỗi; chỉ để thấy rằng một thay đổi mà tôi đang thực hiện phức tạp hơn những gì tôi dự đoán ban đầu. Git-stash là cách dễ nhất để chuyển tập hợp các thay đổi đó sang một nhánh khác.

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.