2013-08-06 34 views
6

Tôi đang làm việc trên chi nhánh A và tính năng/nhiệm vụ không được thực hiện. Sau đó, tôi cần phải chuyển sang một chi nhánh khác B để sửa chữa nhanh chóng. Khi tôi cố gắng chuyển sang một nhánh khác, Git buộc tôi phải lưu các thay đổi cục bộ của mình nếu không tôi sẽ mất tất cả các thay đổi cục bộ của mình.Trên chi nhánh địa phương, không muốn thực hiện thay đổi, nhưng cần phải chuyển sang một chi nhánh khác

Tôi cần phải cam kết mã không đầy đủ của mình. Có cách nào để tôi có thể chuyển đổi giữa nhiều chi nhánh mà không cam kết và mất mã không? Hay có cách nào tốt hơn để xử lý tình huống này?

+0

thể trùng lặp của [Saving Git thay đổi tạm thời] (http://stackoverflow.com/questions/6800778/saving-git-changes-temporarily) –

Trả lời

9

Một tùy chọn, là mipadi demonstrates, chỉ cần sử dụng git stash.

lựa chọn khác là chỉ đơn giản là chỉ cần cam kết công việc hiện tại của bạn cơ bản dở dang, chuyển ngành, và sau đó khi bạn đã sẵn sàng để chuyển đổi qua lại, làm một hỗn hợp reset lại trước đó của bạn cam kết:

# While working on "feature" branch, 
# you suddenly need to go work on a hotfix: 
$ git commit --all --message "Backup my feature work" 
$ git checkout -b hotfix master 

# You did your hotfix, and are ready to go back to feature 
$ git checkout feature 
$ git reset head^ 

git reset head^ sẽ làm một thiết lập lại hỗn hợp trở lại cam kết trước khi bạn đã thực hiện một cam kết sao lưu, và tất cả các thay đổi bạn đã thực hiện trong cam kết dự phòng của bạn sẽ được khôi phục vào bản sao làm việc của bạn. Từ (tôi nhấn mạnh) official Linux Kernel documentation for git reset:

Resets chỉ số nhưng không phải là cây làm việc (ví dụ: các tập tin thay đổi được lưu giữ nhưng không được đánh dấu cho cam) và báo cáo những gì đã không được cập nhật. Đây là hành động mặc định.

+0

+1 Tôi cũng khuyên bạn nên điều này vì 'git stash' không liên quan đến bất kỳ nhánh nào. Làm 'git commit -a -m" stashing "' giữ bối cảnh công việc của bạn. Đây sẽ là câu trả lời được chấp nhận. – eckes

+0

Stashing có thể không liên quan đến chi nhánh, nhưng _is_ dựa trên cam kết CHÍNH hiện tại. 'git show -s stash' cho thấy dấu gạch chéo cam kết như là một kết hợp của hai commit cha, trong đó đầu tiên là HEAD stash được dựa trên.Và 'git stash [save]' không có một thông báo cho trước ghi lại tên của nhánh theo mặc định. – musiphil

+0

Tôi thích stashing cho bất cứ điều gì tạm thời bởi vì chỉ có một lệnh 'git stash' có thể lưu trữ trạng thái của cả chỉ số và cây làm việc. Cam kết không nắm bắt những thay đổi trong cây đang hoạt động không được tổ chức cho chỉ mục. – musiphil

8

Bạn có thể sử dụng git stash, thao tác này sẽ lưu thay đổi của bạn mà không cần tạo cam kết.

Thứ nhất, stash thay đổi của bạn:

$ git stash 

Sau đó chuyển sang chi nhánh khác của bạn:

$ git checkout branch-B 

Khi bạn đang đọc, quay trở lại chi nhánh ban đầu của bạn và unstash thay đổi của bạn :

$ git checkout branch-A 
$ git stash pop 

Xem tài liệu được liên kết ở trên để biết thêm chi tiết và chi tiết cụ thể về các trường hợp sử dụng bổ sung.


Về mặt kỹ thuật nó tạo ra một cam kết, nhưng git stash sử dụng một số phép thuật, do đó bạn không thực sự thấy cam kết, và các công cụ Git biết làm thế nào để đối phó đúng cách với những giả-cam.

+0

tốt, những gì nếu khi tôi đã thực hiện một số thay đổi về chi nhánh-B và cam kết với họ, sẽ không cam kết thay đổi chi nhánh-A của chúng tôi? – Suleman

Các vấn đề liên quan