web-dev-qa-db-ja.com

コミット内のファイルへの変更を元に戻す

特定のファイルにのみ特定のコミットによって加えられた変更を元に戻したい。

そのためにgit revertコマンドを使用できますか?

他の簡単な方法はありますか?

91
Lakshman Prasad

私がこれを行う最もきれいな方法は、 ここ で説明されています

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

VonCの応答に似ていますが、git showおよびgit applyを使用します。

160
mgalgs

コミット履歴を変更してもよいと仮定して、以前のコミットで単一のファイルの変更を元に戻すワークフローを次に示します。

たとえば、1つのファイルの変更を元に戻したい(badfile.txt)コミット中aaa222

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

ベースコミットに基づいてリベースし、問題のコミットを修正して続行します。

1)インタラクティブリベースを開始します。

git rebase -i aaa111

2)picke(編集用)に変更して、エディターで編集する問題のコミットをマークします。

e aaa222
pick aaa333

3)不良ファイルへの変更を元に戻します。

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

4)変更を追加し、コミットを修正します。

git add badfile.txt
git commit --amend

5)リベースを終了します。

git rebase --continue
24
tee

git revert は、コミット内のすべてのファイルの内容用です。

単一のファイルの場合、 スクリプト化

#!/bin/bash

function output_help {
    echo "usage: git-revert-single-file <sha1> <file>"
}

sha1=$1
file=$2

if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi

git-Shell-scripts からのユーティリティ smtlaissezfaire


注意:

別の方法は ここで説明 現在の変更をまだコミットしていない場合です。

git checkout -- filename

git checkout には、ファイルのオプションがあり、HEADからファイルを変更し、変更を上書きします。


Dropped.on.Caprica 言及 コメント内

Gitにエイリアスを追加して、git revert-file <hash> <file-loc>そして、その特定のファイルを元に戻します。
この要点 」を参照してください。

[alias]
  revert-file = !sh /home/some-user/git-file-revert.sh
19
VonC

--no-commitgit-revertオプションを使用し、インデックスから元に戻したくないファイルを削除してから、最終的にコミットします。次に、最新の2番目のコミットでfoo.cへの変更だけを簡単に元に戻す方法を示す例を示します。

$ 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

最初のgit-resetはすべてのファイルを「アンステージング」するため、元に戻すファイルを1つだけ追加して戻すことができます。最後のgit-reset --hardは、保持したくない残りのファイルの取り消しを取り除きます。

12
Dan Moulding
git reset HEAD^ path/to/file/to/revert/in/commit

上記のコマンドはコミットからファイルを取り出しますが、git status

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

上記のコマンドは、変更を元に戻します(結果として、HEADと同じファイルを取得します)。

git commit

(パス --amendコミットを修正します。)

git Push

これにより、すでにコミットされているファイルは削除され、元に戻されます。

上記の手順は、コミットが行われるブランチから実行する必要があります。

5
Bharath T S

はるかに簡単:

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

それから

git commit --amend   

その後

git Push -f

ファイルがなくなっており、コミットハッシュ、メッセージなどは同じです。

4
Forrest

次の手順を実行できます。

  1. git revert -n <*commit*>-nすべての変更を元に戻しますが、コミットしません)
  2. git add <*filename*>(元に戻し、コミットするファイルの名前)
  3. git commit -m 'reverted message'(元に戻すためのメッセージを追加)
  4. コミット後、他のファイルの変更を破棄して、元に戻す前にコミットした変更でファイルが更新されたままになるようにします
1
Imran Sahil