thay đổi git stash áp dụng cho chi nhánh mới?


347

Tôi đã làm việc trên nhánh chính, thực hiện một số thay đổi và sau đó chuyển chúng. Bây giờ, chủ của tôi đang ở ĐẦU.

Nhưng bây giờ, tôi muốn truy xuất những thay đổi này nhưng đến một nhánh mới có nhánh từ phiên bản CHÍNH của nhánh chính.

Làm thế nào để tôi làm điều này ?


3
Tôi nghĩ rằng bạn đang tìm kiếm điều này? stackoverflow.com/questions/556923/ cường
zx1986

Câu trả lời:


502

Là thủ tục tiêu chuẩn không hoạt động?

  • thay đổi
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

Ngắn hơn:

  • thay đổi
  • git stash
  • git checkout -b xxx
  • git stash pop

8
@sfletche nếu bạn muốn đặt tên cho stash của mình, bạn cần thực hiện git stash lưu <name>, nếu không, như bạn nói, nó giống như git stash.
SgtPooki

5
Sau khi sử dụng phương pháp này, có vẻ như nếu bạn quay lại nhánh trước, các thay đổi được lưu lại đã trở lại. Có thể chỉ có những thay đổi được lưu trữ trên nhánh mới?
Thomas Higginbotham

Chỉ cần cam kết thay đổi của bạn với chi nhánh mới.
ChrisR

2
@ThomasHigginbotham không có Thư mục làm việc chung giữa các nhánh và được sao chép từ chi nhánh này sang chi nhánh khác khi bạn chuyển từ chi nhánh này sang chi nhánh khác. Để "đạt được" những gì bạn muốn, tôi thường tạo ra các bản sao khác nhau, thêm mô tả hữu ích bằng git stash save "description"lệnh đã đề cập trước đó; và sau đó tôi git clearlà nhánh (để chuyển thư mục làm việc thực tế) và sau đó git stash apply stash@{my_desired_stash}trong nhánh mong muốn (sau khi chuyển sang đó git checkout <branch>rõ ràng). Tôi biết nó không phải là một giải pháp thực sự, nhưng là cách tốt nhất bạn có thể làm với git .
Kamafeather

Tôi cũng đã hoàn thành việc này với git stash dropmột lần tôi đã cam kết
lẻ kế

221

Vì bạn đã thực hiện các thay đổi của mình, tất cả những gì bạn cần là một lớp lót này:

  • git stash branch <branchname> [<stash>]

Từ các tài liệu ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

Tạo và kiểm tra một nhánh mới có tên < Branchname > bắt đầu từ cam kết mà tại đó < stash > ban đầu được tạo, áp dụng các thay đổi được ghi trong < stash > cho cây và chỉ mục làm việc mới. Nếu điều đó thành công và < stash > là một tham chiếu của biểu mẫu stash @ {< revision >}, thì nó sẽ bỏ < stash >. Khi không có < stash >, áp dụng cái mới nhất.

Điều này rất hữu ích nếu nhánh mà bạn chạy git stash save đã thay đổi đủ để áp dụng git stash không thành công do xung đột. Vì stash được áp dụng trên đỉnh của cam kết đó là HEAD tại thời điểm git stash được chạy, nó khôi phục trạng thái stash ban đầu mà không có xung đột.


3
Đối với stash duy nhất đây là cách để đi. Tham chiếu tên stash không bắt buộc vì Git sẽ áp dụng stash mới nhất, chuyển sang nhánh mới và áp dụng stash trong 1 lệnh.
sinister

@RodneyGolpe Điều này dường như cũng áp dụng stash cho 'master'? Những gì tôi muốn làm là, từ 'master', git stash, sau đó tôi có thể mong đợi 'git stash nhánh [tên nhánh] để áp dụng stash cho một nhánh mới, để lại master mà không cần chỉnh sửa?
David Doria

2
@DavidDoria Bạn phải cam kết thay đổi chi nhánh mới của mình trước khi quay lại làm chủ.
Rodney Golpe

Bây giờ cũng đã cam kết thay đổi thành chủ ... Tôi thực sự thua lỗ ... rõ ràng tôi vẫn không thực sự hiểu git. Sau khi thiết lập lại chủ mềm, sau đó kéo từ repo từ xa bây giờ tôi là nơi tôi muốn. Sư phụ ở trong trạng thái trước những thay đổi. Chi nhánh mới nắm giữ những thay đổi.
Ekkstein

1

Nếu bạn có một số thay đổi trên không gian làm việc của mình và bạn muốn đưa chúng vào một nhánh mới, hãy sử dụng lệnh này:

git stash branch branchName

Nó sẽ làm cho:

  1. một chi nhánh mới
  2. di chuyển thay đổi đến chi nhánh này
  3. và xóa stash mới nhất (Giống như: git stash pop)
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.