2013-09-24 29 views
8

Morning tất cả, Hãy nói rằng tôi có một loạt các cam kết như sau:Loại trừ một cam kết duy nhất từ ​​một "git diff"

  • abc000
  • def111
  • abc222
  • def333
  • abc444
  • def555

Tôi biết tôi có thể sử dụng

$ git diff -c --binary abc000..def555 > /tmp/abc000_def555.patch 

để tạo bản vá nâng cấp hệ thống từ abc000 lên def555.

Nhưng điều gì sẽ xảy ra nếu tôi muốn (vì những lý do không thể chấp nhận được) loại trừ def333 khỏi bản vá - làm cách nào tôi có thể thực hiện việc này? Lưu ý rằng tôi không muốn hoàn nguyên def333, chỉ là tôi không muốn bản vá kết hợp với cam kết này.

Cảm ơn

Trả lời

1

tôi sẽ nói bạn tạo một chi nhánh mới, anh đào-chọn các cam kết mà bạn cần và sau đó làm diff

7

Trên thực tế tất cảgit diff s là cam-cặp-khôn ngoan: ở trên so sánh cây/tệp trong số abc000 so với các cây/tệp trong số def555. Ví dụ: def333 thay đổi dir/file nhưng không có thay đổi đối với dir/file giữa abc000def555 (ví dụ: thay đổi trong def333 bị hủy bởi một điều gì đó trên đường đi), bạn có thể không thấy dir/file trong đó.

Nói chung, tuy nhiên, những thay đổi được thực hiện trong def333 sẽ thay đổi dir/file trong một cách mà xuất hiện khi so sánh các phiên bản trong abc000 chống lại một trong def555. Vì vậy, bạn sẽ có lẽ thấy thay đổi đó.

Cách dễ nhất để có được sự khác biệt là "def555 sẽ trông như thế nào nếu def333 được hoàn nguyên" là thực hiện điều đó: tạo cây (trên nhánh tạm thời) với thay đổi được hoàn nguyên. Để làm điều đó với một chi nhánh được đặt tên thực tế, bạn có thể làm như sau:

git checkout def555 # by ID, so that you get a "detached HEAD" 
git checkout -b temp-branch 
git revert --no-edit def333 
git diff [options] abc000 
git checkout somebranch; git branch -D temp-branch 

Nếu bạn không muốn nhánh tạm thời thì sao? Vâng, đó là tầm thường: chỉ cần không tạo ra một. Nhận "HEAD tách rời" như trên, thực hiện hoàn nguyên như trên và sau đó git checkout somebranch. Không có nhánh tạm thời nào để xóa, ngoại trừ cái tên chưa được đặt tên mà git sẽ cảnh báo rằng bạn đang bỏ lại phía sau ... đó chỉ là những gì bạn muốn.

+1

Bạn cũng có thể sử dụng 'hoàn nguyên - không cam kết', sau đó bạn sẽ không cần một nhánh (hoặc đầu bị tách rời) ở tất cả và không để lại gì phía sau. – Bergi

+0

@Bergi: true (mặc dù sau đó bạn sẽ cần phải "git reset --hard' để làm sạch cây công việc sau khi bạn đã hoàn tất). – torek

3

Không thể git diff và loại trừ một hoặc nhiều cam kết. Bạn phải thực hiện một chi nhánh mới, phục hồi các cam kết không mong muốn, sau đó diff nó và làm cho một bản vá:

git checkout -b <branch-name>-diff-branch // Create a throwaway branch. 
git revert <unwanted-sha> // Get rid of the unwanted commit. Do this as many times as necessary, you cannot revert multiple SHAs at once. 
git diff > new.patch // Create your new patch. 
git checkout - // Checkout previous branch, nice trick eh?! 
git branch --delete --force <branch-name>-diff-branch // Delete the throwaway branch. 

tái bút: Tôi không muốn bán thịt câu trả lời của torek quá nhiều vì vậy tôi đăng một cái mới mà tôi nghĩ là ngắn gọn hơn.

0

Bạn có thể thử sử dụng git rebase -i và sau đó thả cam kết mà bạn không cần. Một cách khác là chọn cherry, chọn các cam kết bạn cần trên một nhánh khác.

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