Git - làm việc trên nhánh sai - cách sao chép các thay đổi vào nhánh chủ đề hiện có


333

Tôi đã làm việc trong một dự án, nhưng thật không may, tôi đã quên chuyển sang chi nhánh của mình và như vậy đã làm việc với chủ

Làm cách nào tôi có thể sao chép công việc (3 tệp) tôi đã thực hiện ở đây từ chủ, sang chi nhánh của mình (được gọi là chi nhánh123 ) mà không cần gửi đến chủ?

Câu trả lời:


540

Âm thanh như tất cả những gì bạn cần là như sau:

git stash
git checkout branch123
git stash apply

Sau đó, bạn nên trở lại trên nhánh của mình mà không cần chạm vào nhánh chính.


6
ok- tôi đã chạy nó, nhưng khi tôi quay trở lại master (git checkout master) và chạy trạng thái git, các tệp tương tự vẫn được "sửa đổi" - điều đó có được mong đợi không?
Alex

5
Bạn có thể không thực sự phải bỏ rác, nếu sự khác biệt giữa nhánh hiện tại của bạn (nhánh chính) và nhánh chủ đề (nhánh123) không có trong bất kỳ tệp nào bạn đã sửa đổi cục bộ. Git sẽ cho phép bạn kiểm tra chi nhánh chủ đề trong trường hợp đó.
Cascabel

3
@Alex: Vâng, đó là mong đợi. Điều này không liên quan đến cam kết. stashlưu các sửa đổi địa phương, sau đó stash applyđưa chúng trở lại.
Cascabel

6
Làm thế nào tôi có thể "loại bỏ" chúng khỏi nhánh chính .. để làm sạch nó?
Alex

7
git reset --hard HEADvà bạn quay lại cam kết cuối cùng mà bạn đã thực hiện với chi nhánh chính của mình.
gnab

46

Câu trả lời được chấp nhận là kỹ lưỡng nhất, nhưng có một trường hợp đặc biệt mà bạn có thể đơn giản hóa. Nếu các tệp bạn đã sửa đổi trong thư mục làm việc giống hệt nhau masterbranch123bạn chỉ cần làm

git checkout branch123

Không cần phải bỏ bất cứ điều gì, vì hành vi mặc định checkoutlà KHÔNG ghi đè lên các tệp đã sửa đổi trong thư mục làm việc của bạn, vì vậy bạn sẽ không mất gì cả. (Điều này thực sự đã được đề cập trong các ý kiến ​​đầu tiên bởi Cascabel)

Như những người khác đã đề cập trong các bình luận, nếu branch123chưa tồn tại, bạn có thể làm

git checkout -b branch123

Dựa trên những gì tôi tìm thấy ở đây .


3
Hoặc, nếu bạn muốn tạo một chi nhánh mới,git checkout -b newbranch
Phil Mitchell

2
Điều này làm việc cho tôi tốt hơn so với stash và nó dễ dàng hơn nhiều. Cảm ơn!
Matthias

31
Không có cái này không hoạt động. Git sẽ hiển thị cho bạn thông báo này: "cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể chuyển đổi chi nhánh."
dsharew

1
@DegenSharew: Có, bạn đã đúng trong một số trường hợp, cụ thể là, nếu các tệp bạn đã sửa đổi trong thư mục làm việc không giống hệt nhau trong masterbranch123. Xem câu trả lời chỉnh sửa của tôi.
Russel Dirks

1
Nó hiệu quả tuyệt vời đối với tôi. Tôi chưa có chi nhánh nào, vì vậy tôi đã làm điều này: git checkout -b newbranchname. Những thay đổi của tôi xuất hiện trong chi nhánh đó.
dex3703


0

Vì có thể tạo một nhánh mới nhưng không thể kiểm tra một nhánh hiện có trong khi kiểm tra các tệp, tôi đã tìm thấy thủ thuật sau bằng cách sử dụng một nhánh tạm thời để làm việc:

Kịch bản này hoạt động ít nhất với plugin Git VS 2015 nhưng rất có thể sẽ hoạt động với bất kỳ công cụ git nào.

  1. kiểm tra và thay đổi các tập tin trong master (up!, chi nhánh sai)
  2. tạo một nhánh mới "temp" (hoặc bất kỳ tên không sử dụng nào bạn chọn) từ chủ. Các tập tin đã kiểm tra sẽ được kiểm tra trong temp và không phải trong master.
  3. kiểm tra các thay đổi đối với temp (bản gốc không bị ảnh hưởng)
  4. Bây giờ mọi thứ đã được kiểm tra và có thể kiểm tra một chi nhánh hiện có. Kiểm tra nhánh mong muốn (nhánh tôi muốn thực hiện các thay đổi để bắt đầu) 3.5 Git Rebase
  5. hợp nhất temp với chi nhánh mong muốn. Bây giờ các thay đổi là trong chi nhánh chính xác.
  6. xóa nhánh tạm thời vì nó không cần thiết nữa

EDIT: Tôi phát hiện ra rằng bạn sẽ phải thực hiện một rebase (git rebase --onto) của nhánh tạm thời trước khi thực hiện hợp nhất. Nếu không, những thay đổi trong tổng thể sẽ được bao gồm trong hợp nhất. Một bước thêm 3,5 ở trên. Xem thêm về rebase tại đây: https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Bạn có thể vui lòng giải thích thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

Cảm ơn phản hồi của bạn. Tuy nhiên, giải pháp này khá đơn giản và tuân theo nguyên tắc tương tự như giải pháp "stash" ngoại trừ việc sử dụng một nhánh tạm thời thay vì stash. Điều này thuận tiện hơn ít nhất cho người dùng Visual Studio vì stash không được hỗ trợ bởi plugin GIT
Pasi
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.