簡體   English   中英

如何在git上恢復舊提交中的特定文件

[英]How to revert a specific file in a old commit on git

我想我的問題是接近這一個 ,但我使用Git。

所以,讓我說我有

Commit1更改了file1.cfile2.c

Commit2更改了file2.cfile3.cfile4.c

Commit3更改了file1.cfile2.cfile3.c

等等...

然后,我只想恢復Commit2file2.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 showgit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM