di chuyển các tập tin đã thay đổi sang một chi nhánh khác để đăng ký


422

Điều này thường xảy ra với tôi: Tôi viết một số mã, đi kiểm tra các thay đổi của mình và sau đó nhận ra tôi không ở trong nhánh thích hợp để kiểm tra các thay đổi đó. Tuy nhiên tôi không thể chuyển sang chi nhánh khác mà không thay đổi hoàn nguyên. Có cách nào để di chuyển các thay đổi sang một chi nhánh khác để được kiểm tra trong đó không?

Câu trả lời:


751

git stash là bạn của bạn.

Nếu bạn chưa thực hiện cam kết, chỉ cần chạy git stash. Điều này sẽ tiết kiệm tất cả các thay đổi của bạn.

Chuyển sang nhánh bạn muốn thay đổi và chạy git stash pop.

Có rất nhiều công dụng cho git stash. Đây chắc chắn là một trong những lý do hữu ích hơn.

Một ví dụ:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
Không cần stash thay đổi không cam kết, họ đi với bạn khi bạn kiểm tra một chi nhánh. Stash là nhiều hơn để lưu trữ lâu dài những thứ tạm thời (thứ bạn muốn hoàn thành và cam kết sau đó, nhưng bạn cần phải làm một cái gì đó khác ngay bây giờ).
Tekkub

2
Tôi nhận được điều này. Vì vậy, tôi phải stash, chuyển nhánh và sau đó bật C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS

3
@Tekkub "lưu trữ lâu dài những thứ tạm thời" nói rằng cảm thấy rất khó xử, một điểm khác để sử dụng stash là nó đẩy nó trong một ngăn xếp vì vậy nếu bạn không muốn nó tiếp tục và làm việc trên một thứ khác thì nó hữu ích theo cách đó . Có, bạn không phải làm thế nhưng chỉ cảm thấy sạch sẽ hơn và kiểm soát nhiều hơn.
Atherion

bravo bé! nên nối thêm những gì bạn nên làm nếu bạn thực hiện các cam kết
Ishan Srivastava

2
@Tekkub Điều đó chỉ đúng nếu chi nhánh bạn chuyển sang cập nhật với chi nhánh bạn đang ở. Ví dụ, nếu bạn đang vô tình làm việc trên nhánh prod và cần chuyển sang nhánh giai đoạn nhưng giai đoạn đã thay đổi trong stash thời gian trung bình là cách duy nhất để thực hiện chuyển đổi.
danielson317

248

Nếu bạn chưa thực hiện các thay đổi của mình , chỉ cần sử dụng git checkoutđể di chuyển đến chi nhánh mới và sau đó cam kết chúng một cách bình thường - các thay đổi đối với các tệp không được gắn với một chi nhánh cụ thể cho đến khi bạn cam kết chúng.

Nếu bạn đã đã cam kết thay đổi của bạn:

  1. Nhập git logvà ghi nhớ SHA của cam kết bạn muốn di chuyển.
  2. Kiểm tra chi nhánh bạn muốn di chuyển cam kết.
  3. git cherry-pick SHAthay thế SHA từ trên.
  4. Chuyển về chi nhánh ban đầu của bạn.
  5. Sử dụng git reset HEAD~1để thiết lập lại trước khi cam kết chi nhánh sai của bạn.

cherry-pick nhận một cam kết nhất định và áp dụng nó cho đầu thanh toán hiện tại, do đó cho phép bạn sao chép cam kết sang một chi nhánh mới.


9
Bạn thậm chí không cần phải chọn anh đào ở đây. git reset HEAD~N --softvà sau đó git checkout -bđể di chuyển tất cả các mã hiện chưa được cam kết sang một nhánh mới.
Aaron

19
thay đổi đối với các tệp không được gắn với một nhánh cụ thể cho đến khi bạn cam kết chúng. <- này. Điều này đã giải quyết một bí ẩn cho tôi. Cảm ơn.
Tschallacka

8
Tôi gặp lỗi sau khi cố gắng chuyển nhánh: "thay đổi cục bộ sang các tệp sau sẽ bị ghi đè khi thanh toán". Vì vậy, có vẻ như tôi không thể chuyển đến một chi nhánh khác và cam kết bình thường.
Mischa

3
@Mischa nó không hoạt động nếu bạn chuyển đổi giữa hai nhánh có lịch sử khác nhau
watashiSHUN

1
@Aaron đẹp hơn nhiều (đối với kịch bản sau cam kết)! Hãy làm một câu trả lời riêng.
Jacktose

16

Đáng buồn là điều này cũng xảy ra với tôi khá thường xuyên và tôi sử dụng git stashnếu tôi nhận ra lỗi của mình trước đó git commitvà sử dụnggit cherry-pick khác, cả hai lệnh được giải thích khá tốt trong các câu trả lời khác

Tôi muốn thêm một sự làm rõ cho git checkout targetBranch: lệnh này sẽ chỉ bảo vệ thư mục làm việc của bạn và ảnh chụp nhanh được tổ chức nếu targetBranch có cùng lịch sử với chi nhánh hiện tại của bạn

Nếu bạn chưa thực hiện các thay đổi của mình, chỉ cần sử dụng thanh toán git để di chuyển đến chi nhánh mới và sau đó cam kết chúng bình thường

@ Tuyên bố của Amber là không sai, khi bạn di chuyển đến một newBranch , git checkout -b newBranch, một con trỏ mới được tạo ra và nó được trỏ đến chính xác cùng một cam kết như chi nhánh hiện tại của bạn.
Trên thực tế, nếu bạn tình cờ có một chi nhánh khác chia sẻ lịch sử với chi nhánh hiện tại của bạn (cả hai điểm tại cùng một cam kết), bạn có thể "di chuyển các thay đổi của mình" bằng cáchgit checkout targetBranch

Tuy nhiên, thông thường các nhánh khác nhau có nghĩa là lịch sử khác nhau và Git sẽ không cho phép bạn chuyển đổi giữa các nhánh này với một thư mục làm việc bẩn hoặc khu vực tổ chức. trong trường hợp bạn có thể thực hiện git checkout -f targetBranch(làm sạch và thay đổi vứt bỏ) hoặc git stage+ git checkout targetBranch(xóa và lưu thay đổi), chỉ cần chạy git checkout targetBranchsẽ gây ra lỗi:

lỗi: Các thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè khi thanh toán: ... Vui lòng cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn chuyển nhánh. Hủy bỏ


5

Thiết lập lại git mềm sẽ đưa các thay đổi đã cam kết trở lại vào chỉ mục của bạn. Tiếp theo, hãy kiểm tra chi nhánh bạn dự định cam kết. Sau đó git cam kết với một thông điệp cam kết mới.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Từ tài liệu git :

git reset [<mode>] [<commit>]Biểu mẫu này đặt lại đầu nhánh hiện tại và có thể cập nhật chỉ mục (đặt lại thành cây) và cây làm việc tùy thuộc vào. Nếu bị bỏ qua, mặc định là - trộn. Phải là một trong những điều sau đây:

--softKhông chạm vào tệp chỉ mục hoặc cây làm việc (nhưng đặt lại đầu vào, giống như tất cả các chế độ làm). Điều này khiến tất cả các tệp đã thay đổi của bạn "Thay đổi được cam kết", vì trạng thái git sẽ đặt nó.

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.