Gitを使用して特定のファイルを特定のリビジョンにリセットまたは元に戻しますか?
-
03-07-2019 - |
質問
ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更を以前のバージョンにリセット/元に戻したいと思います。
必要なリビジョンを見つけるために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 foo
とgit 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
:これにより復帰がコミットされます。
-
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 diff
とgit apply
そのような(<sha>
=戻すコミットのハッシュ):
git diff <sha>^ <sha> path/to/file.ext | git apply -R
基本的に、元に戻す変更に対応するパッチを最初に生成し、次にパッチを逆適用してそれらの変更をドロップします。
もちろん、<sha1>
とHEAD
(競合)の間のコミットによって元に戻された行が変更された場合は機能しません。
明らかに、誰かがgitでわかりやすい本を書く必要があるか、ドキュメントでgitの説明をよくする必要があります。この同じ問題に直面して、私は推測した
cd <working copy>
git revert master
実行されたと思われる最後のコミットを元に戻します。
イアン
これは非常に簡単な手順です。ファイルを必要なコミットID(ここでは1つのコミットID)にチェックアウトしてから、git commit amendだけで完了です。
# git checkout <previous commit_id> <file_name>
# git commit --amend
これは非常に便利です。コミットの先頭で以前のコミットIDにファイルを持ち込みたい場合は、簡単に実行できます。
- Gitは特定のコミットにファイルを戻します
git checkout Last_Stable_commit_Number-fileName
2.Gitファイルを特定のブランチに戻す
git checkout branchName_Which_Has_stable_Commit fileName
git revert <hash>
特定のコミットを元に戻します。 git revert
は最新のコミットにのみ影響すると思われるようです。
特定のファイルの変更を元に戻したい場合、そのコミットがそのファイルよりも多く変更された場合、問題は解決しません。
4つの手順で実行できます:
- 具体的に元に戻すファイルを使用してコミット全体を元に戻します。ブランチに新しいコミットが作成されます
- そのコミットをソフトリセット-コミットを削除し、変更を作業領域に移動します
- ファイルをハンドピックして元に戻し、コミットします
- 他のすべてのファイルを作業領域にドロップします
端末で入力する必要があるもの:
-
git revert <commit_hash>
-
git reset HEAD~1
-
git add <file_i_want_to_revert>
<!> amp; <!> amp;git commit -m 'reverting file'
-
git checkout .
幸運
こちらが私の方法です。
a)Android Studioでファイルを開きます。
b)git-<!> gt;履歴を表示し、元に戻したい以前のコミットを見つけます。 commit_id(つまり、コミットハッシュ)を取得します。
c)git checkout commit_id file_path