[英]How to revert a specific file in a old commit on git
我想我的問題是接近這一個 ,但我使用Git。
所以,讓我說我有
Commit1更改了file1.c和file2.c
Commit2更改了file2.c , file3.c , file4.c
Commit3更改了file1.c , file2.c和file3.c
等等...
然后,我只想恢復Commit2在file2.c中所做的更改,但是,嘗試保留Commit3在此文件中所做的更改...
你認為呢? 有辦法嗎?
謝謝。
您可以嘗試還原Commit2(即,應用新的 git提交,其更改將與Commit2中所做的更改相反)但不提交。 例如,在gitk
有一個即時菜單條目。 在這個新的提交中,您只保留對file2
所做的更改並提交結果。
或者,你可以簡單地做一些事情
git diff Commit2..Commit1 -- file2.c > revert.patch
git apply revert.patch
在應用之前查看補丁可能很有用,因為在Commit2之后提交可能會引入與Commit2中對file2.c
的更改的一些沖突。
通常,要退出整個提交,您將使用git revert
(您可能已經知道)。 這里的問題是您只想退出舊提交中的一些更改。 但事實證明這很容易,因為:
git revert
與反向應用補丁( git show
或git diff
根據需要使用特定的提交ID,然后git apply -R
生成的補丁)然后提交具有相同的效果; 和 git diff
允許您選擇哪些文件得到區分。 因此,對於常規(單親)提交,您可以簡單地:
git show <commit-id> -- <path>
從<commit-id>
獲得“有趣”的更改,然后將結果通過管道(或以其他方式提供)給git apply -R
:
git show HEAD~3 -- <path> | git apply -R
或者在這種情況下:
git show commit2 -- file2.c | git apply -R
對於合並提交, git show
將生成一個組合的diff,這不是你想要的,所以你應該使用git diff
(或git diff-tree
)和兩個特定的commit-ID。 請注意,您可以在反向應用之前(或之后)檢查差異,因為git apply
不會自行進行新提交(因此您必須自己執行此操作)。
你想revert
嗎?
或者只是想修改它。 如果是這樣,你可以這樣做
git rebase -i HEAD^^
接下來,編輯器將打開。 在編輯器中修改Commit2上的'pick'到'edit'
pick abcdefg Commit3
pick jikdvuf Commit2
至
pick abcdefg Commit3
edit jikdvuf Commit2
然后,您可以修改您的提交。 所以現在修改文件。 你可能想做git checkout FILENAME
。 之后
git add FILENAME
git rebase --continue
現在您已成功修改Commit2上的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.