Git tương đương với lệnh TFS xếp / hủy giá trị là gì? hái anh đào?


76

Tôi thấy rằng các lệnh kệ / bỏ giá trong TFS rất tiện dụng và rất đơn giản để sử dụng. Tương đương trong Git là gì?

đây là tình huống trong TFS:

  • Tôi đã thực hiện các thay đổi trong thân cây
  • Tôi gác lại: tập hợp thay đổi được lưu trên máy chủ (có nhãn) và tôi lấy lại nguồn trước khi thay đổi
  • Tôi làm việc trong thân cây
  • Ai đó có thể hủy bỏ giá trị: đặt thay đổi trong không gian làm việc của anh ấy

Tôi biết rằng có một lệnh gọi cherry-pick nhưng tôi không chắc về quy trình làm việc và liệu nó có phù hợp với nhu cầu hay không.

Câu trả lời:


85

Những gì bạn mô tả tương tự như vậy git stash, ngoại trừ vì với git, bạn có kho lưu trữ của riêng mình (không chỉ là một kho lưu trữ duy nhất trên máy chủ), chỉ bạn mới có thể lấy lại thiết lập thay đổi đó.

Ý tưởng chung là:

# do some stuff
vim foo/bar.c
# stash away your changes
git stash

# do some other things...

# retrieve your changes
git stash pop

Nếu bạn muốn người khác có quyền truy cập vào tập thay đổi này, thay vào đó bạn muốn chuyển nó vào một nhánh đang hoạt động:

# make yourself a branch
git checkout -b temp-featureA
# commit to it
git add foo/bar.c; git commit

# now you push this branch (or they could just fetch straight from you)
git push origin temp-featureA


# Now, in someone else's repo:
# Fetch updates
git fetch origin
# Make a branch tracking the remote branch
git branch temp-featureA origin/temp-featureA

# Either check it out:
git checkout temp-featureA
# or cherry-pick it, to apply the changes somewhere else:
git cherry-pick temp-featureA
# or, if it's multiple commits, rebase it!
git rebase --onto my-branch start-of-featureA temp-featureA

Bất kỳ ý tưởng phải làm gì nếu tôi không muốn thực hiện những thay đổi này trong bộ kệ? Chúng tôi có các chuỗi kết nối mà chúng tôi thay đổi để đạt được các môi trường khác nhau, nhưng chúng tôi không muốn thay đổi chúng trên tổng thể, chỉ để gỡ lỗi cục bộ, nếu chúng tôi có chúng trong một nhánh, chúng sẽ được cam kết khi chúng tôi đẩy nếu chúng tôi hợp nhất chúng vào chi nhánh của chúng tôi
Mech0z

Có cách nào để lưu trữ trong khi vẫn bảo toàn các thay đổi cục bộ không? Có thể được lưu trữ theo sau bởi lưu trữ áp dụng?
Psddp

Vâng, stash sau đó áp dụng stash về cơ bản sẽ làm được điều đó. Nhưng tôi hơi bối rối tại sao bạn lại muốn. Nói chung, nếu bạn đang lưu trữ thì đó là vì bạn muốn các thay đổi tạm thời biến mất và bạn sẽ đặt chúng trở lại một nơi khác. Nếu bạn định giữ chúng ở lại và tiếp tục làm việc, tốt hơn hết bạn nên thực hiện một cam kết. Sau đó, bạn có thể chọn quả anh đào đó ở nơi khác thay vì áp dụng một lớp bảo quản và bạn luôn có thể giấu nó đi sau đó nếu muốn làm sạch.
Cascabel

3
Trên thực tế, điều này thực sự không giống như một Kệ TFS. Nếu tôi đang làm việc trên một nhánh git cục bộ ... vào cuối ngày, tôi muốn nói rằng ... với tất cả các lỗi và biên dịch .... hãy đặt công việc này trên máy chủ để lưu giữ an toàn. Vì vậy, nếu ổ cứng của tôi bị hỏng, tôi không mất tất cả. Tuy nhiên, tôi chưa muốn đẩy công việc của mình lên chi nhánh từ xa vì nó chưa hoàn thiện. Chi nhánh địa phương của tôi đang theo dõi chi nhánh từ xa. Cascabel liệt kê 8 lệnh git riêng biệt để sắp xếp điều này ... trong TFS ... đó là một lệnh ... Shelve.
Bayrat

29

Những gì bạn muốn làm được thực hiện bằng cách phân nhánh cũ đơn giản trong git.

Từ một câu trả lời hay về StackOverflow của JaredPar :

Giá đỡ là một cách lưu tất cả các thay đổi trên hộp của bạn mà không cần đăng ký. Các thay đổi này vẫn tồn tại trên máy chủ.

Điều này tương tự như cam kết với một chi nhánh và đẩy nó đến một máy chủ trong git.

Làm thế nào để làm nó:

Giả sử bạn đang làm việc trên nhánh "chính" và bạn quyết định triển khai tính năng X. Bạn có một khởi đầu tốt với nó, nhưng sau đó sếp của bạn nói với bạn rằng tính năng Y cần được triển khai càng sớm càng tốt. Phil trong khối tiếp theo thay vì tình nguyện viên hoàn thành tính năng X trong khi bạn thực hiện tính năng Y. Đây là những gì bạn làm:

Tạo một chi nhánh mới và chuyển sang nó:

$ git checkout -b feature-x

Cam kết các thay đổi của bạn:

$ git add filethatyouchanged.cc
$ git commit -m 'partial implementation of feature X'

Đẩy nó đến một máy chủ mà Phil có thể thấy:

$ git push origin feature-x

Quay lại nhánh chính (không thay đổi):

$ git checkout master

Bạn cũng có thể muốn chủ động tạo một nhánh mới cho tính năng Y:

$ git checkout -b feature-y

Phil hiện có thể kéo xuống hoạt động của tính năng X của bạn và tiếp tục nơi bạn đã dừng lại:

phil$ git fetch origin
phil$ git checkout -t origin/feature-x

2
mặc dù không rẻ như trong git, nhưng nó thực sự được lưu trữ trong repo và nếu repo được phân phối, điều đó có nghĩa là bạn có thể phân phối giá đỡ của mình cho bất kỳ máy tính nào từ repo mà không cần phải cam kết. (TFS2010) Điều này rất hữu ích nếu có một số loại chính sách như CI hoặc Gated Check-In (xây dựng phía máy chủ bắt buộc tại mỗi lần đăng ký)
Onno

5

git stash hơi tương tự, ngoại trừ nó bị giới hạn trong cây làm việc của bạn .

Trong một DVCS, để đạt được loại quy trình công việc đó, bạn cần:

  • cam kết những thay đổi hiện tại của bạn trong một chi nhánh mới
  • kiểm tra chi nhánh ban đầu nơi bạn có thể tiếp tục, không có thay đổi nào bạn đã giới thiệu (nhưng đã cam kết trong chi nhánh mới)
  • đẩy nhánh mới đó sang một đại diện trống
  • cho phép một nhà phát triển khác kéo nhánh mới đó và hợp nhất nó vào nhánh hiện tại của mình.

Một cách khác là cho phép nhà phát triển khác tìm nạp chi nhánh của bạn (nơi bạn đã cam kết tập hợp các thay đổi đặc biệt đó) và chọn anh đào , nhưng điều đó không được khuyến khích, vì khó theo dõi các cam kết chọn anh đào .


Cảm ơn câu trả lời của bạn, tôi đã đánh dấu câu trả lời của Jefromi vì nó cho tôi một ví dụ nhưng câu trả lời của bạn cũng rất hữu ích.
MatthieuGD
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.