Revert changes to a file in a commit

后端 未结 8 1934
無奈伤痛
無奈伤痛 2020-12-12 09:45

I want to revert changes made by a particular commit to a given file only.

Can I use git revert command for that?

Any other simple way to do it?

相关标签:
8条回答
  • 2020-12-12 10:05

    Assuming it is ok to change the commit history, here's a workflow to revert changes in a single file in an earlier commit:

    For example, you want to revert changes in 1 file (badfile.txt) in commit aaa222:

    aaa333 Good commit
    aaa222 Problem commit containing badfile.txt
    aaa111 Base commit
    

    Rebase on the base commit, amend the problem commit, & continue.

    1) Start interactive rebase:

    git rebase -i aaa111
    

    2) Mark the problem commit for edit in the editor by changing pick to e (for edit):

    e aaa222
    pick aaa333
    

    3) Revert changes to the bad file:

    git show -- badfile.txt | git apply -R
    

    4) Add the changes & amend the commit:

    git add badfile.txt
    git commit --amend
    

    5) Finish the rebase:

    git rebase --continue
    
    0 讨论(0)
  • 2020-12-12 10:08

    I would simply use the --no-commit option to git-revert and then remove the files you don't want reverted from the index before finally committing it. Here's an example showing how to easily revert just the changes to foo.c in the second most recent commit:

    $ git revert --no-commit HEAD~1
    $ git reset HEAD
    $ git add foo.c
    $ git commit -m "Reverting recent change to foo.c"
    $ git reset --hard HEAD
    

    The first git-reset "unstages" all files, so that we can then add back just the one file we want reverted. The final git-reset --hard gets rid of the remaining file reverts that we don't want to keep.

    0 讨论(0)
  • 2020-12-12 10:11

    Much simpler:

    git reset HEAD^ path/to/file/to/revert
    

    then

    git commit --amend   
    

    and then

    git push -f
    

    the file is gone and commit hash, message, etc is the same.

    0 讨论(0)
  • 2020-12-12 10:16

    The cleanest way I've seen of doing this is described here

    git show some_commit_sha1 -- some_file.c | git apply -R
    

    Similar to VonC's response but using git show and git apply.

    0 讨论(0)
  • 2020-12-12 10:17
    git reset HEAD^ path/to/file/to/revert/in/commit
    

    The above command will take file out of commit, but it will reflect in git status.

    git checkout path/to/file/to/revert/in/commit
    

    The above command will revert the changes (as a result you get file same as HEAD).

    git commit
    

    (Pass --amend to amend commit.)

    git push
    

    With this, the file which is already in the commit is removed and reverted.

    The above steps should be followed from the the branch where the commit is made.

    0 讨论(0)
  • 2020-12-12 10:20

    If you'd like to reset the changes on a file from your last commit, this is what I'm usually using. I think this is the simplest solution.

    Please notice that the file will be added to the staging area.

    git checkout <prev_commit_hash> -- <path_to_your_file>
    

    Hope it helps :)

    0 讨论(0)
提交回复
热议问题