Git Shelve vs Stash


273

Tôi rất lạ lẫm với shelvekhía cạnh của Git. Nếu stashđược sử dụng để gác lại công việc còn dang dở shelvethì sao? Bạn sẽ sử dụng nó để làm gì?

Ví dụ về Cập nhật dự án (từ menu VCS)

nhập mô tả hình ảnh ở đây

người ta sẽ nhận được (trong ý tưởng 2019.2)

nhập mô tả hình ảnh ở đây


13
shelvekhông phải là một lệnh git. Bối cảnh cho câu hỏi này là gì, những thuật ngữ này đến từ đâu? shelvetồn tại trong một số công cụ khác nhưng nó không phải là một phần của git.
Giô-na

2
Git stash tương tự như shelvetrong bzr, hg, v.v. Bạn đang đề cập đến một số gói tương tác git?
drRobertz

3
nhiều câu hỏi hơn câu trả lời được chấp nhận có thể xác nhận, câu hỏi này là hợp lệ và thuật ngữ '' Shelve "cũng bị hiểu nhầm như một lệnh git. Cảm ơn bạn đã hỏi, đây cũng là nghi ngờ của tôi (từ IDEA).
PravyNandas

Câu trả lời:


264

git shelve không tồn tại trong Git.

Chỉ git stash:

  • khi bạn muốn ghi lại trạng thái hiện tại của thư mục làm việc và chỉ mục, nhưng muốn quay lại thư mục làm việc sạch.
  • trong đó lưu các sửa đổi cục bộ của bạn đi và hoàn nguyên thư mục làm việc để khớp với cam kết CHÍNH.

Bạn đã có một git dự án cũ năm 2008 để cô lập các sửa đổi trong một chi nhánh, nhưng điều đó sẽ không hữu ích ngày nay.

Như được ghi lại trong hộp thoại giá đỡ Intellij IDEA , tính năng " gác và tháo vỏ " không được liên kết với VCS (công cụ Hệ thống kiểm soát phiên bản) mà với chính IDE, để tạm thời lưu trữ các thay đổi đang chờ xử lý mà bạn chưa cam kết.

Lưu ý rằng kể từ Git 2.13 (quý 2 năm 2017), giờ đây bạn cũng có thể bỏ các tệp riêng lẻ .


72
Hóa ra tôi đã hiểu nhầm khái niệm. Tôi nghĩ rằng đó là lệnh Git trong khi thực tế nó là thứ của bên thứ ba từ IntelliJ IDEA. Tôi không thể tìm thấy các tài liệu git cho nó vì vậy tôi nghĩ rằng tôi đang thiếu một cái gì đó. jetbrains.com/idea/help/shelving-and-unshelving-changes.html
Edgar Martinez

2
Liên kết tài liệu của bạn chỉ ra rằng "giá đỡ" là tập hợp các thay đổi (bản vá) được quản lý chỉ bởi IntelliJ IDE, bỏ "stash" là những thứ tiêu chuẩn do Git quản lý. Vì vậy, tránh kệ.
barbara.post

2
@jerry chin kệ tốt hơn stash trong trường hợp của bạn. Tôi muốn nếu kệ có mặt trong git. Webstorm hút hết RAM. Sẽ là hữu ích nếu git có nó, chúng tôi có thể chạy nó trong dòng cmd
thợ đào mahara

2
Có một trường hợp sử dụng phổ biến mà kệ có mà stash không giải quyết - xử lý các đồng nghiệp / thực tiễn công ty có vấn đề. Có thể để rác hoàn chỉnh được thêm vào kho lưu trữ của bạn và để không phải là 'sửa chữa' nó vì sự điên rồ của ai đó. Sự thay thế là một cái gì đó giống như git stash && <your actual command> && git stash popnhưng đó là hút. Tự động gác và áp dụng là gần hơn với những gì chúng ta cần.
smaudet

1
@VonC tương tự không giống nhau - Tôi có một trường hợp sử dụng trong đó các dự án tôi đang sử dụng có cài đặt tôi yêu cầu không thể được cam kết vì chúng 'không chuẩn'. Và một nửa tá các trường hợp sử dụng khác mà tôi gặp phải liên quan đến những việc như cần sửa đổi tệp xây dựng, v.v. để phát triển cục bộ so với dev / test / prod.
smaudet

187

Khi sử dụng IDE của JetBrains với Git, "các hành động stashing và unstashing được hỗ trợ ngoài việc gác và tháo vỏ. Các tính năng này có nhiều điểm chung; sự khác biệt chính là ở cách các bản vá được tạo và áp dụng. của các tệp, trong khi Stash chỉ có thể hoạt động với một loạt các tệp đã thay đổi cùng một lúc. Dưới đây là một số chi tiết khác về sự khác biệt giữa chúng. "


10
Có vẻ như kệ là linh hoạt hơn git stash .
Dmitry Davydov

12
@DmitryDavydov Có những git stash -pcái vấp cả hai. Thật không may chỉ trong dòng lệnh.
Vee

1
@TheVee vâng, nó rất giống với giá trị về chức năng, cảm ơn vì thông tin.
Dmitry Davydov

10
Trên thực tế, kể từ Git 2.13 (quý 2 năm 2017), bạn có thể bỏ các tệp riêng lẻ ... đọc thêm
kyb

5
Tôi thấy kệ rất hữu ích khi bạn có một bản vá các thay đổi mà bạn muốn áp dụng mỗi khi bạn muốn tự động tạo tài liệu chẳng hạn. Shelve sẽ tạo một tệp trong .idea / Shelve và bạn có thể thêm nó vào VCS của mình và chia sẻ nó với tất cả nhóm của bạn để họ có thể áp dụng những thay đổi đó và chạy các tác vụ tương tự.
ingkevin

63

Ngoài các câu trả lời trước đó, có một điều quan trọng đối với tôi lưu ý:

shelvelà tính năng JetBrains sản phẩm (ví dụ như WebStorm, PhpStorm, PyCharm, vv). Nó đặt các tập tin kệ vào .idea/shelfthư mục.

stashlà một trong những gitlựa chọn Nó đặt các tập tin stash dưới .gitthư mục.


2
Cảm ơn đã làm rõ câu hỏi quan trọng này.
AmerllicA

4

Tôi muốn tạm gác những thay đổi thay vì cất giấu chúng nếu tôi không chia sẻ những thay đổi của mình ở nơi khác.

Stashing là một tính năng git và không cung cấp cho bạn tùy chọn để chọn các tệp cụ thể hoặc thay đổi bên trong một tệp. Kệ có thể làm điều đó nhưng đây là một tính năng dành riêng cho IDE, không phải là tính năng git:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy tôi có thể chọn chỉ định tập tin / dòng nào sẽ được đưa vào giá đỡ của tôi. Lưu ý rằng tôi không thể làm điều đó với stashing.

Cẩn thận khi sử dụng giá trong IDE có thể hạn chế tính di động của các bản vá của bạn vì những thay đổi đó không được lưu trữ trong thư mục .git.

Một số liên kết hữu ích:

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.