2015-06-22 17 views
6

Làm việc với Git, tôi phải quay lại một cam kết cụ thể. Tôi đã thực hiện một số thay đổi và bây giờ tôi muốn cam kết chúng. Một cách thích hợp để làm điều này là gì?Làm thế nào để lưu các thay đổi khi ở trạng thái tách rời?

Dự án của tôi hiện đang ở trạng thái HEAD tách rời. Các thay đổi của tôi có được lưu nếu tôi thực hiện cam kết với

? Nếu không, tôi nên làm gì để không bị mất các thay đổi của mình?

+0

* Tôi đã thực hiện một số thay đổi và bây giờ muốn lưu chúng. * Vui lòng cụ thể hơn: ý của bạn là "lưu"? Bạn chủ yếu có hai lựa chọn: cam kết, hoặc stash. Hoặc là một trong những "sẽ" tiết kiệm thay đổi của bạn trong một số ý nghĩa. Bạn đang đề cập đến cái nào? Ngoài ra, bạn có thể muốn tạo một chi nhánh. – Jubobs

+0

Tôi muốn thực hiện các thay đổi của mình. – Nikolas

+0

Tôi đã chỉnh sửa câu hỏi của bạn cho phù hợp. – Jubobs

Trả lời

12

Tuyên bố từ chối trách nhiệm: git không phức tạp, nó rất linh hoạt. Đừng sợ hãi chỉ vì tôi đã lan man vào một câu trả lời dài :)

Bạn có:
master: a-b-c-d-e-f

và muốn thay đổi c. Bạn đã làm:
* git checkout c (. Tránh kiểm tra ra cam kết trong tương lai Di chuyển người đứng đầu chi nhánh thay vì)
* thay đổi một số file

Bạn đang ở:

master: a-b-c-d-e-f 
      \uncommitted-work,detached 

Nếu bạn muốn áp dụng lại def trên đầu trang của bạn "c"

(Nếu bạn đã đẩy, người hạ lưu sẽ có to recover from upstream rebase)

  1. git stash .
  2. git checkout master
  3. git stash pop (giải quyết xung đột)
  4. git stage .
  5. git commit -m "temporary name for g"
  6. (master: a-b-c-d-e-f-g)
  7. git rebase c -i ("áp dụng lại nhánh hiện tại của tôi lên điểm c, và để tôi thao tác các cam kết tương tác", nghĩa là, cha mẹ (rebase) d-e-f lên một mới c)
  8. Làm theo guide to interactive rebase. Bạn muốn đặt hàng lại g do đó, sau c, sau đó thay đổi lệnh rebase từ pick thành fixup. dd để xóa một dòng, P để đặt đường, i để vào chế độ chèn để nhập "sửa lỗi" rồi :wq để lưu và thoát khỏi vim.
  9. (master: a-b-c'-d'-e'-f', trong đó c' là kết quả của việc bạn hợp nhất gc trong khi rebase.d-e-f đã trở thành d'-e'-f' như tổ tiên của họ đã thay đổi vì vậy họ không phải là người "cùng một" cam kết như xa như git là có liên quan, nhưng nội dung của họ vẫn như cũ)

Nếu bạn muốn phục hồi lại d-e-f (và viết lại lịch sử như nếu bạn không bao giờ làm cho họ)

(Nếu bạn đã đẩy, người hạ lưu sẽ có to recover from upstream rebase):

  1. git stash .
  2. git checkout master
  3. (master: a-b-c-d-e-f, với các tập tin giấu ban đầu dựa trên c)
  4. git reset --hard c (loại bỏ tất cả các file và cam kết về tổng thể từ c)
  5. (master: a-b-c, với các tập tin giấu)
  6. git stash pop (quyết tâm xung đột)
  7. (master: a-b-c-*)
  8. git stage .
  9. git commit -m "description of g"
  10. (master: a-b-c-g)

Nếu bạn muốn phục hồi lại d-e-f (nhưng giữ chúng trong lịch sử)

  1. git stash
  2. git revert --no-commit d
  3. git revert --no-commit e
  4. git revert --no-commit f
  5. git push
  6. git stash pop (sẽ không có xung đột)
  7. git stage .
  8. git commit -m "Undo d-e-f in order to fix..."
  9. git push

Nếu bạn có git push d-e-f, và bạn muốn t o giữ chúng riêng biệt:

Âm thanh như những thay đổi mới của bạn là dành cho nhánh mới. git branch <foo>.

+1

Câu trả lời toàn diện tuyệt vời cung cấp thông tin chi tiết về nhiều kỹ thuật và quy trình công việc. Bạn xứng đáng nhận được nhiều tín dụng/sự chú ý hơn điều này. chỉ ONE upvote? Chúa ơi. – Aerovistae

4

Tạo một chi nhánh mới từ này cam kết và sau đó làm commit:

git checkout -b <branchname> 
git commit 

Giả sử bạn đã dàn dựng (ví dụ: git add myfile1 myfile2) tập tin của bạn.

+1

Bạn có thể muốn chỉ định lý do tại sao tạo ra một chi nhánh là thích hợp hơn, trong trường hợp này. – Jubobs

+0

Tôi chưa làm gì cả. Tôi nghĩ rằng tôi cần phải biết thêm về các tập tin dàn dựng. – Nikolas

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