特定のコミットによって行われた変更を特定のファイルのみに戻したい。
そのためにgit revertコマンドを使用できますか?
それを行う他の簡単な方法はありますか?
特定のコミットによって行われた変更を特定のファイルのみに戻したい。
そのためにgit revertコマンドを使用できますか?
それを行う他の簡単な方法はありますか?
回答:
これを行うために私が見た最もきれいな方法はここに説明されています
git show some_commit_sha1 -- some_file.c | git apply -R
VonCの応答に似ていますが、git show
およびを使用しgit apply
ます。
fatal: unrecognized input
-3
ですが、パッチが失敗した場合、通常は変更を少し前に修正しているため、ほぼ常にgit applyにフラグを追加して、3者間マージを行う必要があります。
some_file.c
は明らかですが、ファイルへのパスが含まれている場合は、それが含まれていることを確認してください。それ以外の場合は何も
コミット履歴を変更しても問題ない場合、以前のコミットで単一ファイルの変更を元に戻すワークフローを次に示します。
たとえばbadfile.txt
、コミットで1つのファイル()の変更を元に戻したいとしますaaa222
。
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
ベースコミットに基づいてリベースし、問題のコミットを修正して続行します。
1)インタラクティブなリベースを開始します。
git rebase -i aaa111
2)(編集用)に変更pick
して、エディターで問題のコミットを編集用にマークe
します。
e aaa222
pick aaa333
3)不正なファイルへの変更を元に戻します:
git show -- badfile.txt | git apply -R
4)変更を追加してコミットを修正します。
git add badfile.txt
git commit --amend
5)リベースを終了します。
git rebase --continue
edit
が変更されたように表示されませんでした。しかし、git show -- badfile.txt | git apply -R
私が必要とする答えは<3
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
(smtlaissezfaireのgit-shell-scriptsユーティリティから)
注意:
現在の変更をまだコミットしていない場合は、ここで別の方法を説明します。
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
git revert-file <hash> <file-loc>
その特定のファイルを元に戻すことができます。私はこの答えから離れました(ただし、正しく機能するためにいくつかの編集を行う必要がありました)。私の.gitconfig
スクリプトと編集したスクリプトのコピーは、gist.github.com
--no-commit
オプションを使用して、git-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
は、残したくない残りのファイルの復元を取り除きます。
はるかに簡単:
git reset HEAD^ path/to/file/to/revert
その後
git commit --amend
その後
git push -f
ファイルはなくなっており、コミットハッシュ、メッセージなどは同じです。
git checkout -- path/to/file/to/revert
ステップが必要ですか?また、ハッシュが同じであるというのは本当ではありませんよね?「最後のコミットは、元に戻されたファイルへの変更が含まれていないという点のみが異なる新しいコミットに置き換えられるという結果になります。」
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
これにより、すでにコミットされているファイルが削除され、元に戻されます。
上記の手順は、コミットが行われるブランチから実行する必要があります。