2013-01-09 23 views
7

Giả sử tôi có một lịch sử git tuyến tính của 8 cam kết và một chi nhánh (master):Áp dụng git cam kết để làm việc cây unadded?

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> [8=master] 

tôi muốn chuyển tổng thể để 4 (mà tôi có thể làm với git branch -f master 4):

1 -> 2 -> 3 -> [4=master] -> 5 -> 6 -> 7 -> 8 

Bây giờ cây làm việc ở trạng thái 4.

Bây giờ tôi muốn áp dụng các thay đổi từ 4 -> 8 vào cây đang hoạt động của tôi dưới dạng bản vá.

Tức là, không ảnh hưởng đến trạng thái của thư mục .git, tôi muốn áp dụng các thay đổi từ 4->8 không được tổ chức vào cây đang hoạt động của mình. Sau đó cây làm việc phải ở trạng thái 8 nhưng nhánh và nhánh chính đã cam kết phải ở trạng thái 4.

Một cách khác để nói: Giả vờ sau khi chuyển chủ thành 4, tôi thực hiện các thay đổi từ 4 đến 8 thủ công vào cây làm việc của tôi mà không cần thêm chúng vào chỉ mục. Kết quả sẽ giống nhau.

Cách dễ nhất để thực hiện việc này là gì?

Trả lời

1

Trong trường hợp của bạn, nếu bạn không thực sự quan tâm đến các bit "unstaged", điều đơn giản nhất để làm là lẽ

git checkout 8 -- . 

này sẽ cập nhật cây và chỉ số của bạn để phù hợp với các cam kết 8, mà không thay đổi lịch sử cam kết của bạn. Sau đó, bạn có thể git reset để hủy thay đổi chỉ mục.

Nếu bạn thực sự muốn để tệp chỉ mục không bị xáo trộn, nó hơi phức tạp hơn, vì git luôn cập nhật cây làm việc từ chỉ mục. Bạn có thể làm điều gì đó như

GIT_INDEX_FILE=/tmp/foo git checkout 8 -- . 

Điều này sẽ sử dụng đường dẫn /tmp/foo làm tệp chỉ mục tạm thời chỉ cho lệnh này. Sau đó, bạn có thể muốn xóa tệp này sau đó.


Trong một tình huống phức tạp hơn nơi bạn muốn nộp đơn xin lại bản vá lỗi đó sẽ không thực sự mang lại cho bạn trở lại tình trạng chính xác của cam kết 8, bạn có thể sử dụng git cherry-pick --no-commit commit1 commit2 ... để áp dụng các cam kết theo thứ tự. Điều này vẫn sẽ thay đổi chỉ số của khóa học.

3
git format-patch 4..8 | xargs git apply 

[sửa: một tiếp theo này từ bình luận dưới đây bỏ qua làm cho các file vá cá nhân]

git diff 4..8 | git apply 
+1

Hoặc, bằng nhau, 'git diff 4..8 | git apply' – cmbuckley

+0

Tôi thích bạn hơn. – jthill

0
git checkout [email protected]{1} -- . 

là tất cả các bạn cần. Nó đọc "kiểm tra các tập tin mà các cam kết mà chủ đã được trỏ đến một thời gian trước đây". Thanh toán git reflog để xem cách hoạt động của tính năng này.

Ngoài ra, bạn không nên buộc phải tạo lại chi nhánh như bạn đã làm. Điều này sẽ cho phép git theo dõi tất cả các địa điểm mà chủ nhân đã từng trỏ đến. Sử dụng

git stash -u 

trong trường hợp bạn có một số công việc trong thư mục công việc.Sau đó

git reset --hard master^^^^ 

hoặc

git reset --hard master~4 
+0

_ "Điều này sẽ cho phép git theo dõi tất cả các địa điểm mà chủ nhân đã từng trỏ đến." _ - ý của bạn là gì? Bạn có thể giải thích theo dõi này nhiều hơn một chút không? –

+0

Ông nói rằng ông muốn áp dụng những thay đổi không được tổ chức. Thanh toán sẽ hiển thị chúng. – jthill

0
git cherry-pick master~4 master~5 master~6 master~7 master~8 

cây làm việc của bạn đã được sạch sẽ mặc dù

git help cherry-pick 
11

Tôi biết tôi là muộn để đảng, nhưng đối với những người khác tham khảo, tôi nghĩ cách đơn giản nhất đơn giản là:

git cherry-pick --no-commit 4..8

+1

Cộng với 'git reset' sau đó để thay đổi không bị giới hạn. –

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