2011-01-07 28 views
14

Thường xảy ra với tôi rằng tôi thực hiện một số thay đổi cục bộ, chỉ để phát hiện ra rằng tôi đã thực hiện trên nhánh sai, vì vậy tôi cần chuyển nhánh trước khi cam kết. Vấn đề là tôi không thể chuyển nhánh khi có thay đổi cục bộ. Có cách nào để làm điều đó?GIT: Thêm các thay đổi cục bộ vào chi nhánh không phải hiện tại

Rõ ràng, tôi có thể sao chép các tệp đã cập nhật, chuyển đổi nhánh, sau đó sao chép chúng trở lại, nhưng điều này không thực sự có vẻ thông minh!

Trả lời

16

Bạn có thể chuyển nhánh trong khi sửa đổi cục bộ trừ khi thay đổi cục bộ xung đột với sự khác biệt giữa hai nhánh. Trong trường hợp này, bạn có thể sử dụng tùy chọn -m hoặc --merge để checkout để thực hiện việc thanh toán, đồng thời thực hiện thay đổi kết nối mạng và thay đổi do chuyển đổi nhánh.

git checkout -m other-branch 
9

Tôi sử dụng git stash khi điều này xảy ra. Nó tạo ra một cam kết tạm thời của trạng thái hiện tại của bản sao làm việc (cả tệp được lưu trong bộ nhớ cache và các tệp uncached) và chuyển đổi bản sao làm việc sang HEAD hiện tại. Sau đó, bạn có thể chuyển sang chi nhánh khác và thực hiện git stash pop.

+0

Ngọt ngào. Bạn chỉ cần đảm bảo các thay đổi của bạn được tổ chức. Hoạt động hoàn hảo. – helios

+0

rất bóng bẩy, chắc chắn có thứ gì đó làm cho việc thực hiện dễ dàng – Martin

2

Như đã nói khác, bạn có thể sử dụng stash hoặc checkout --merge. Tuy nhiên, tùy chọn đó sẽ gây ra thay đổi về dấu thời gian của một số tệp. Nếu bạn đang làm việc trên một dự án lớn nơi biên dịch có thể mất một thời gian dài (dự án hiện tại của chúng tôi mất nửa giờ để biên dịch với các bản dựng được phân phối), điều này có thể không tối ưu.

Trong trường hợp này, bạn có thể sử dụng kho lưu trữ khác để di chuyển cam kết đến đúng nhánh. Trước tiên, bạn sẽ cần phải sao chép kho hiện tại của bạn (điều này cần phải được thực hiện một lần duy nhất):

$ git clone /path/to/repository repository.clone 
$ cd repository.clone 
$ git remote add origin repository.clone 
$ git fetch origin 

Sau đó, trong kho hiện tại của bạn, bạn cam kết thay đổi của bạn:

$ cd /path/to/repository 
$ git add path/to/modified/files 
$ git commit -m 'Commit message' 

Trên kho khác , bạn lấy mới cam kết, và di chuyển nó đến chi nhánh chính xác:

$ cd ../repository.clone 
$ git fetch origin 
$ git checkout correct-branch 
$ git reset --hard origin/correct-branch 
$ git cherry-pick origin/current-branch 
$ # resolve conflicts if any, commit with -c option in this case 
$ git push origin correct-branch:correct-branch 

Sau đó trên kho lưu trữ ban đầu, bạn loại bỏ tạm thời cam kết, và loại bỏ các thay đổi liên quan (trừ khi bạn muốn k eep chúng trong cả hai nhánh).

$ cd /path/to/repository 
$ git reset HEAD^ 
$ # edit file and remove modifications moved to other branch 

Điều này phức tạp hơn và liên quan đến quá trình viết lại lịch sử, nhưng khi dự án của bạn thực sự lớn và thời gian biên dịch là yếu tố hạn chế. Lưu ý rằng bạn có thể tái sử dụng kho lưu trữ nhân bản, vì vậy không cần phải xóa/tạo lại nó mỗi lần (nếu thời gian biên dịch dài, thì kho lưu trữ có thể lớn, và nhân bản nó có thể mất chút thời gian).

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