Nói rằng tôi có những thay đổi không được cam kết trong thư mục làm việc của tôi. Làm thế nào tôi có thể tạo một bản vá từ những người mà không phải tạo một cam kết?
Nói rằng tôi có những thay đổi không được cam kết trong thư mục làm việc của tôi. Làm thế nào tôi có thể tạo một bản vá từ những người mà không phải tạo một cam kết?
Câu trả lời:
git diff
cho những thay đổi không có căn cứ. git diff --cached
cho các thay đổi theo giai đoạn.
git format-patch
cũng bao gồm khác biệt nhị phân và một số thông tin meta. Trên thực tế đó sẽ là đặt cược tốt nhất để tạo một bản vá, nhưng afaik điều này chỉ hoạt động đối với các nguồn / thay đổi được kiểm tra, phải không?
git diff --relative
Nếu bạn chưa cam kết thay đổi, thì:
git diff > mypatch.patch
Nhưng đôi khi điều đó xảy ra là một phần của những thứ bạn đang làm là các tệp mới không bị theo dõi và sẽ không nằm trong git diff
đầu ra của bạn . Vì vậy, một cách để thực hiện một bản vá là tạo mọi thứ cho một cam kết mới ( git add
mỗi tệp hoặc chỉ git add .
) nhưng không thực hiện cam kết, và sau đó:
git diff --cached > mypatch.patch
Thêm tùy chọn 'nhị phân' nếu bạn muốn thêm tệp nhị phân vào bản vá (ví dụ: tệp mp3):
git diff --cached --binary > mypatch.patch
Sau này bạn có thể áp dụng bản vá:
git apply mypatch.patch
Lưu ý: Bạn cũng có thể sử dụng --staged
như một từ đồng nghĩa của --cached
.
git diff --no-color
. Nếu không, nó trông giống như một vấn đề mã hóa.
git diff
và git apply
sẽ làm việc cho các tệp văn bản, nhưng sẽ không hoạt động đối với các tệp nhị phân.
Bạn có thể dễ dàng tạo một bản vá nhị phân đầy đủ, nhưng bạn sẽ phải tạo một cam kết tạm thời. Khi bạn đã thực hiện (các) cam kết tạm thời của mình, bạn có thể tạo bản vá với:
git format-patch <options...>
Sau khi bạn thực hiện bản vá, hãy chạy lệnh này:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Điều này sẽ khôi phục (các) cam kết tạm thời của bạn. Kết quả cuối cùng khiến bản sao làm việc của bạn (cố ý) bị bẩn với cùng những thay đổi ban đầu bạn có.
Về phía nhận, bạn có thể sử dụng thủ thuật tương tự để áp dụng các thay đổi cho bản sao làm việc mà không cần có lịch sử cam kết. Đơn giản chỉ cần áp dụng các bản vá, và git reset --mixed <SHA of commit *before* the patches>
.
Lưu ý rằng bạn có thể phải được đồng bộ hóa tốt để toàn bộ tùy chọn này hoạt động. Tôi đã thấy một số lỗi khi áp dụng các bản vá khi người thực hiện chúng không kéo theo nhiều thay đổi như tôi có. Có lẽ có nhiều cách để làm cho nó hoạt động, nhưng tôi đã không nhìn sâu vào nó.
Đây là cách tạo các bản vá tương tự trong Rùa Git (không phải tôi khuyên bạn nên sử dụng công cụ đó):
Tortoise Git
->Create Patch Serial
Since
: FETCH_HEAD
sẽ hoạt động nếu bạn được đồng bộ hóa tốt)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
tùy chọnVà làm thế nào để áp dụng chúng:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
tùy chọnĐể tạo một bản vá với cả tệp sửa đổi và tệp mới (dàn dựng), bạn có thể chạy:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
không hoạt động.
file_name.patch
được sử dụng bởi patch
lệnh? Chúng có tương thích với nhau không?
Tôi thích:
git format-patch HEAD~<N>
trong đó <N>
số lần cam kết cuối cùng để lưu dưới dạng các bản vá.
Các chi tiết về cách sử dụng lệnh có trong DOC
CẬP NHẬT
Ở đây bạn có thể tìm thấy làm thế nào để áp dụng chúng sau đó.
CẬP NHẬT Đối với những người không có ý tưởng về format-patch
Thêm bí danh:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Sau đó, tại bất kỳ thư mục của kho dự án của bạn chạy:
git make-patch
Lệnh này sẽ tạo 0001-uncommited.patch
tại thư mục hiện tại của bạn. Bản vá sẽ chứa tất cả các thay đổi và các tệp chưa được theo dõi hiển thị cho lệnh tiếp theo:
git status .
Chúng tôi cũng có thể chỉ định các tệp, chỉ bao gồm các tệp có thay đổi tương đối, đặc biệt khi chúng mở rộng nhiều thư mục cũ
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Tôi thấy điều này không được chỉ định trong các câu trả lời hoặc nhận xét, tất cả đều có liên quan và chính xác, vì vậy đã chọn để thêm nó. Rõ ràng là tốt hơn so với ngầm!