Câu hỏi Di chuyển công việc hiện có, không được cam kết sang một nhánh mới trong Git


Tôi bắt đầu một số công việc về một tính năng mới và sau khi mã hóa một chút, tôi đã quyết định tính năng này phải ở trên nhánh riêng của nó.

Làm cách nào để di chuyển các thay đổi chưa được cam kết hiện có sang chi nhánh mới và đặt lại chi nhánh hiện tại của tôi?

Tôi muốn đặt lại nhánh hiện tại của mình trong khi vẫn duy trì công việc hiện tại trên tính năng mới.


2512
2017-09-08 15:57


gốc




Các câu trả lời:


Sử dụng như sau:

git checkout -b <new-branch>

Điều này sẽ rời khỏi nhánh hiện tại của bạn, tạo và thanh toán chi nhánh mới và giữ tất cả các thay đổi của bạn. Sau đó, bạn có thể thực hiện cam kết với:

git add <files>

và cam kết với chi nhánh mới của bạn với:

git commit -m "<Brief description of this commit>"

Những thay đổi trong thư mục làm việc và các thay đổi được tổ chức trong chỉ mục không thuộc về bất kỳ chi nhánh nào. Điều này thay đổi nơi những thay đổi đó sẽ kết thúc.

Bạn không cài lại chi nhánh ban đầu của bạn, nó vẫn như cũ. Cam kết cuối cùng trên <old-branch> sẽ vẫn như cũ. Do đó bạn checkout -b và sau đó cam kết.


2966
2017-09-08 15:59



Chỉ để chắc chắn, tôi cần phải cam kết tính năng chưa hoàn thành TRƯỚC KHI tôi đặt lại chi nhánh ban đầu của mình? Hoặc những tập tin không được cam kết đó sẽ được giữ nguyên bất kể cam kết? - Dane O'Connor
FYI: thay đổi trong thư mục làm việc và những thay đổi được tổ chức trong chỉ mục không thuộc về một chi nhánh. git checkout -b <new branch> thay đổi nơi những thay đổi đó sẽ kết thúc. - Jakub Narębski
Nếu bạn đã có một chi nhánh và muốn di chuyển các thay đổi của bạn đến chi nhánh hiện có, thanh toán stackoverflow.com/questions/556923/… - Chirantan
Nếu bạn muốn đẩy chi nhánh mới của bạn vào kho lưu trữ từ xa: stackoverflow.com/questions/2765421/… - Dewayne
@ JDSmith: uncommit changes đừng thuộc về bất kỳ chi nhánh nào. Chúng chỉ nằm trong thư mục làm việc git checkout ./git reset --hard sẽ không thể phục hồi tẩy họ - knittl


Ngoài ra:

  1. Lưu các thay đổi hiện tại vào một stash tạm thời:

    $ git stash

  2. Tạo một nhánh mới dựa trên stash này và chuyển sang nhánh mới:

    $ git stash branch <new-branch> stash@{0}

Mẹo: sử dụng phím tab để giảm nhập tên stash.


254
2018-06-19 00:18



Nếu nhánh khác đã tồn tại, bạn chỉ có thể chuyển sang nhánh đó bằng thanh toán, sau đó git stash apply. - Archonic
Tốt hơn so với giải pháp được chấp nhận - Jonathan Landrum
Tôi không hiểu mẹo "Mẹo: sử dụng phím tab để giảm gõ tên stash." Không phải là "stash @ {0}" tên? Tôi không thể chạy nó thành công. - Herbert
Tại sao điều này tốt hơn câu trả lời được chấp nhận stackoverflow.com/a/1394804/754997 ? - Chris Page
Tôi không hiểu tại sao điều này tốt hơn thì câu trả lời được chấp nhận git checkout -b <new branch name> - Noitidart


Nếu bạn đã thực hiện cam kết trên nhánh chính của bạn trong khi bạn mã hóa, nhưng bây giờ bạn muốn di chuyển các cam kết đó đến một nhánh khác:

  1. Sao chép lịch sử hiện tại của bạn vào một chi nhánh mới, đồng thời mang theo mọi thay đổi chưa được cam kết:

    git checkout -b <new-feature-branch>
    
  2. Bây giờ buộc nhánh "lộn xộn" ban đầu quay lại: (không chuyển sang nó)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Ví dụ:

    git branch -f master origin/master
    

    hoặc nếu bạn đã thực hiện 4 cam kết:

    git branch -f master HEAD~4
    

Cảnh báo: Có vẻ như git branch -f master origin/master sẽ đặt lại thông tin theo dõi cho nhánh đó. Vì vậy, nếu bạn đã định cấu hình master chi nhánh để đẩy đến một nơi nào đó khác origin/master thì cấu hình đó sẽ bị mất.

Một cách khác là sử dụng kỹ thuật đặt lại này. Nhưng những hướng dẫn đó sẽ loại bỏ bất kỳ thay đổi không được cam kết nào mà bạn có. Nếu bạn muốn giữ chúng, hãy cất chúng trước và tháo chúng ra ở cuối.


35
2018-02-12 07:44



Điều này trả lời một câu hỏi hơi khác so với câu hỏi của op. Tôi quyết định đặt câu trả lời này ở đây vì đây là nơi Google đã mang đến cho tôi khi tôi đang tìm kiếm câu trả lời. Câu hỏi thực tế đề cập đến tình huống này ở đây. - joeytwiddle


Nếu bạn cam kết, bạn cũng có thể chọn cherry ID đơn cam kết. Tôi làm điều này thường xuyên khi tôi bắt đầu làm việc trong chủ, và sau đó muốn tạo ra một chi nhánh địa phương trước khi tôi đẩy mạnh đến nguồn gốc của tôi /.

git cherry-pick <commitID>

Có rất nhiều bạn có thể làm với cherry-pick, như mô tả đây, nhưng đây có thể là trường hợp sử dụng cho bạn.


15
2017-11-30 20:58



Giải pháp tốt hơn để di chuyển một phần thay đổi sang nhánh mới ... vì bạn có thể cam kết những gì bạn muốn ngay bây giờ, lưu trữ tất cả các thay đổi khác, kiểm tra chi nhánh bạn muốn rẽ nhánh, chọn cherry cam kết nhánh mới, quay lại đến nhánh ban đầu, đặt lại cứng một lần commit, sau đó thực hiện một cửa sổ stash, thêm, commit và hát hallelujah. - Meredith
@ Meredith, haha, ya một cái gì đó như thế. Điều này thật tuyệt, trừ khi bạn lên kế hoạch cho những thay đổi của mình trước ... và ai làm điều đó;) - password
Cảm ơn, bạn vừa lưu lại cổ kỹ thuật số của tôi - Phil