Gitを使用して特定のファイルを特定のリビジョンにリセットまたは元に戻しますか?

StackOverflow https://stackoverflow.com/questions/215718

質問

ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更を以前のバージョンにリセット/元に戻したいと思います。

必要なリビジョンを見つけるためにgit logとともにgit diffを実行しましたが、過去にファイルを元の状態に戻す方法がわかりません。

役に立ちましたか?

解決

必要なコミットのハッシュがc5f567であると仮定すると:

git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout のマニュアルページに詳細が記載されています。

~1の前にコミットに戻したい場合は、<=>を追加します(任意の番号で機能します):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

補足として、このコマンドは通常のもの(ブランチ間での変更)と異常な破壊的なもの(作業ディレクトリ内の変更の破棄)の両方に使用されるため、このコマンドは常に不快です。

他のヒント

diffコマンドを使用して、ファイルに加えられた変更をすばやく確認できます。

git diff <commit hash> <filename>

特定のファイルをそのコミットに戻すには、resetコマンドを使用します:

git reset <commit hash> <filename>

ローカルの変更がある場合は、--hardオプションを使用する必要がある場合があります。

ウェイポイントを管理するための適切なワークフローは、タグを使用してタイムライン内のポイントをきれいにマークすることです。私はあなたの最後の文を完全に理解することはできませんが、あなたが望むのは前の時点からブランチを分岐させることです。これを行うには、便利なcheckoutコマンドを使用します。

git checkout <commit hash>
git checkout -b <new branch name>

これらの変更をマージする準備ができたら、メインラインに対してリベースできます:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

最も便利な場合は、SHA-1を含め、gitコミットへの参照を使用できます。ポイントは、コマンドが次のようになることです:

git checkout [commit-ref] -- [filename]

git checkout -- foo

これにより、fooがHEADにリセットされます。次のこともできます。

git checkout HEAD^ foo

1つのリビジョンに戻るなど。

そして、最も頻繁に必要とされる最後にコミットされたバージョンに戻すには、この単純なコマンドを使用できます。

git checkout HEAD file/to/restore

今も同じ問題があり、この回答を理解するのが最も簡単です(commit-refは戻りたいログの変更のSHA値です):

git checkout [commit-ref] [filename]

これにより、その古いバージョンが作業ディレクトリに配置され、必要に応じてそこからコミットできます。

戻る必要があるコミットの数がわかっている場合は、次を使用できます。

git checkout master~5 image.png

これは、あなたがmasterブランチ上にあり、必要なバージョンが5コミット戻ることを前提としています。

見つけたと思う。... httpから://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

すべての変更が間違っているため、特定の時点以降のすべての変更を忘れてしまいたい場合があります。

次で始まる:

$ git log

最近のコミットとそのSHA1ハッシュのリストが表示されます。

次に、入力:

$ git reset --hard SHA1_HASH

特定のコミットに状態を復元し、レコードから新しいコミットをすべて完全に消去するには

これは私のために働いた:

git checkout <commit hash> file

次に変更をコミットします:

git commit -a

<!> quot; rollback <!> quot;と言うときは注意する必要があります。コミット$ Aでファイルの1つのバージョンを使用し、その後2つの別々のコミット$ Bおよび$ Cで2つの変更を行った場合(したがって、表示されるのはファイルの3番目の反復です)、そして< !> quot;最初のものにロールバックしたい<!> quot ;、あなたは本当にそれを意味しますか?

2回目と3回目の繰り返しの両方で変更を取り除きたい場合、それは非常に簡単です:

$ git checkout $A file

そして結果をコミットします。コマンドは、<!> quot; I commit $ A <!> quot;。

によって記録された状態からファイルをチェックアウトします。

一方、2番目の反復(つまり$ Bのコミット)で行われた変更を取り除き、$ Cがファイルに対して行った処理を維持しながら、$ Bを元に戻したいということです

$ git revert $B

コミット$ Bを作成した人は、非常に規律がなく、同じコミットでまったく無関係な変更をコミットした可能性があり、このリバートは問題のある変更を確認した file 以外のファイルに触れる可能性があることに注意してください結果を注意深く確認することをお勧めします。

残念なことに、作業コピーがgit checkout fooという名前のディレクトリにある場合、fooは機能しません。ただし、git checkout HEAD foogit checkout ./fooは両方とも次のことを行います。

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

これはrebaseの仕組みです:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

あなたが持っていると仮定

---o----o----o----o  master
    \---A----B       <my branch>

最初の2つのコマンド... コミット     git checkout     git rebase master

... masterブランチに適用する変更のブランチをチェックアウトします。 <my branch>コマンドは、B'からのコミット(<=>で見つからない)を取得し、それらを<=>の先頭に再適用します。つまり、<=>の最初のコミットの親は、<=>履歴の以前のコミットではなく、<=>の現在のヘッドです。 2つのコマンドは次と同じです:

git rebase master <my branch>

このコマンドは、<!> quot; base <!> quot;および<!> quot; modify <!> quot;ブランチは明示的です。

。最終的な履歴結果は次のとおりです。

---o----o----o----o   master
                   \----A'----B'  <my branch>

最後の2つのコマンド...

git checkout master
git merge <my branch>

...早送りマージを実行して、すべての<=>変更を<=>に適用します。このステップがないと、リベースコミットは<=>に追加されません。最終結果は次のとおりです。

---o----o----o----o----A'----B'  master, <my branch>

<=>と<=>は両方とも<=>を参照します。また、この時点から<=>参照を削除しても安全です。

git branch -d <my branch>

ターゲットファイルの最初のリセットヘッド

git reset HEAD path_to_file

そのファイルの2番目のチェックアウト

git checkout -- path_to_file
  

git-aliases、awk、およびシェル関数が助けになります!

git prevision <N> <filename>

ここで<N>は、ファイル<filename>のロールバックするファイルのリビジョンの数です。
たとえば、単一のファイルx/y/z.cの直前のリビジョンをチェックアウトするには、実行します

git prevision -1 x/y/z.c

git previsionの仕組み

以下をgitconfig

に追加します
[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
  

基本的にコマンド

     
      
  • 指定されたファイルに対してgit logを実行し、
  •   
  • ファイルの履歴から適切なcommit-idを選択し、
  •   
  • 指定されたファイルのcommit-idにgit checkoutを実行します。
  •   

本質的に、この状況では人が手動で行うことはすべて、
1つの美しく効率的なgitエイリアスにまとめられています- git-prevision

ここで EasyGit をプラグインする必要があります。これはgitをより親しみやすいものにするラッパーです経験豊富なユーザーを混乱させることなく初心者に。それが行うことの1つは、 git revertにもっと意味を与えることです。 。この場合、次のように言うだけです。

eg revert foo/bar foo/baz

ファイルを以前のコミット(およびコミット済みに戻すファイル)に戻したい場合は、

を使用できます。
git checkout HEAD^1 path/to/file

または

git checkout HEAD~1 path/to/file

次に、ステージングして<!> quot; new <!> quot;をコミットします。バージョン。

マージの場合、コミットは2つの親を持つことができるという知識を備えており、HEAD ^ 1が最初の親であり、HEAD〜1が2番目の親であることを知っておく必要があります。

ツリー内に親が1つしかない場合はいずれも機能します。

ただし、git checkout ./fooおよびgit checkout HEAD ./foo 正確に同じものではありません。事例:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(2番目のaddはインデックスでファイルをステージングしますが、 not get コミット済み。)

Git checkout ./fooは、インデックスからのパス./fooを元に戻すことを意味します。 HEADを追加すると、インデックス内のそのパスを元に戻すようにGitに指示します <=>変更する前の改訂。

ここでの多くの提案、ほとんどはgit checkout $revision -- $fileの行に沿っています。いくつかのあいまいな選択肢:

git show $revision:$file > $file

また、特定のバージョンを一時的に見るためだけにこれをよく使います:

git show $revision:$file

または

git show $revision:$file | vim -R -

(OBS:$fileは、./が機能するための相対パスである場合、git show $revision:$fileをプレフィックスとして付ける必要があります)

さらに奇妙なこと:

git archive $revision $file | tar -x0 > $file

私にとって、返事はどれも本当に明確に見えなかったので、とても簡単だと思うものを追加したいと思います。

コミットabc1があり、その後、ファイルにいくつかの(または1つの変更)を行ったfile.txt

ここで、ファイル内の何かを台無しにしたgit checkout file.txtと、以前のコミットgit checkout abc1 file.txtに戻りたいと言います。

1。git commit -m "Restored file.txt to version abc1":ローカルの変更が必要ない場合、削除します

2。git push:これにより、ファイルが wanted バージョンになります

3。git status:これにより復帰がコミットされます。

  1. git add:これにより、すべてがリモートリポジトリにプッシュされます

もちろん、ステップ2と3の間で<=>を実行すると、何が起こっているのかを理解できます。通常、既に追加された<=>が表示されるはずです。そのため、<=>は必要ありません。

ファイルの以前のコミットバージョンに移動するには、eb917a1などのコミット番号を取得します

git checkout eb917a1 YourFileName

最後にコミットしたバージョンに戻る必要がある場合

git reset HEAD YourFileName
git checkout YourFileName

これにより、ファイルの最後にコミットされた状態に移動します

git checkout ref | commitHash-filePath

e.g。

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

git logを使用して特定のバージョンのハッシュキーを取得し、git checkout <hashkey>

を使用します

注:最後のハッシュの前にハッシュを入力することを忘れないでください。最後のハッシュは現在の位置(HEAD)を指し、何も変更しません。

ここでの多くの回答はgit reset ... <file>またはgit checkout ... <file>を使用すると主張していますが、そうすることで、元に戻したいコミットの後にコミットされた<file>のすべての変更を失います。

単一のファイルの1つのコミットのみからの変更を元に戻したい場合、git revertが1つのファイル(またはコミットファイルのサブセット)に対してのみ行うように、git diffgit applyそのような(<sha> =戻すコミットのハッシュ):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

基本的に、元に戻す変更に対応するパッチを最初に生成し、次にパッチを逆適用してそれらの変更をドロップします。

もちろん、<sha1>HEAD(競合)の間のコミットによって元に戻された行が変更された場合は機能しません。

明らかに、誰かがgitでわかりやすい本を書く必要があるか、ドキュメントでgitの説明をよくする必要があります。この同じ問題に直面して、私は推測した

cd <working copy>
git revert master

実行されたと思われる最後のコミットを元に戻します。

イアン

最後のコミットで間違ったファイルをコミットする場合は、指示に従ってください:

  1. オープンソースツリー、このコミットに変更

オープンソースツリー

  1. 行を変更し、間違ったファイルがコミットとして送信したコミットを見つけます

ここに画像の説明を入力

  1. そのコミットの変更のリストを見ることができます 「ソースツリー内のファイルのリスト」
  2. それを選択して、...をクリックします。右側のボタン...ファイルの逆引きをクリックします
  3. その後、左下のファイルステータスタブで確認できます 次に、ステージ解除をクリックします。

ファイルステータスタブ

  1. Visual Studioコードを開き、削除したファイルをコミットして元に戻す
  2. それらのすべての後、ソースツリーの最後のコミットで結果を見ることができます

ここに画像の説明を入力

これは非常に簡単な手順です。ファイルを必要なコミットID(ここでは1つのコミットID)にチェックアウトしてから、git commit amendだけで完了です。

# git checkout <previous commit_id> <file_name>
# git commit --amend

これは非常に便利です。コミットの先頭で以前のコミットIDにファイルを持ち込みたい場合は、簡単に実行できます。

  1. Gitは特定のコミットにファイルを戻します
  

git checkout Last_Stable_commit_Number-fileName

2.Gitファイルを特定のブランチに戻す

git checkout branchName_Which_Has_stable_Commit fileName
git revert <hash>

特定のコミットを元に戻します。 git revertは最新のコミットにのみ影響すると思われるようです。

特定のファイルの変更を元に戻したい場合、そのコミットがそのファイルよりも多く変更された場合、問題は解決しません。

4つの手順で実行できます:

  1. 具体的に元に戻すファイルを使用してコミット全体を元に戻します。ブランチに新しいコミットが作成されます
  2. そのコミットをソフトリセット-コミットを削除し、変更を作業領域に移動します
  3. ファイルをハンドピックして元に戻し、コミットします
  4. 他のすべてのファイルを作業領域にドロップします

端末で入力する必要があるもの

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> <!> amp; <!> amp; git commit -m 'reverting file'
  4. git checkout .

幸運

こちらが私の方法です。

a)Android Studioでファイルを開きます。

b)git-<!> gt;履歴を表示し、元に戻したい以前のコミットを見つけます。 commit_id(つまり、コミットハッシュ)を取得します。

c)git checkout commit_id file_path

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top