ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更をリセット/以前のバージョンに戻したいと考えています。
git log
必要なリビジョンを見つけるために aを実行git diff
しましたが、ファイルを以前の状態に戻す方法がわかりません。
ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更をリセット/以前のバージョンに戻したいと考えています。
git log
必要なリビジョンを見つけるために aを実行git diff
しましたが、ファイルを以前の状態に戻す方法がわかりません。
必要なコミットのハッシュが次のとおりであると仮定しますc5f567
。
git checkout c5f567 -- file1/to/restore file2/to/restore
詳細については、git checkoutのman ページを参照してください。
の前のコミットに戻したい場合はc5f567
、追加します~1
(1 は戻したいコミットの数で、何でもかまいません):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
補足として、このコマンドは通常のもの (ブランチ間の変更) と異常で破壊的なもの (作業ディレクトリの変更を破棄する) の両方に使用されるため、私は常にこのコマンドに不快感を覚えていました。
git restore
変更された作業コピー ファイルを復元するために特別に設計された新しいコマンドもあります。git が十分に新しい場合は、このコマンドを使用できますが、ドキュメントには警告が表示されます。
このコマンドは実験的なものです。動作が変わる場合があります。
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
ワンリビジョンバックなど
そして、最も頻繁に必要とされる最後にコミットされたバージョンに戻すには、この単純なコマンドを使用できます。
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
「ロールバック」と言うときは注意が必要です。コミット$Aにファイルの1つのバージョンがあり、後で2つの別々のコミット$Bと$Cで2つの変更を行った場合(つまり、ファイルの3回目の反復が表示されます)、「最初のものにロールバックしたい」ということですか?
2回目と3回目の反復の両方で変更を取り除きたい場合は、非常に簡単です。
$ git checkout $A file
次に、結果をコミットします。このコマンドは、「commit$Aによって記録された状態からファイルをチェックアウトしたい」と尋ねます。
一方、あなたが意味したのは、2回目の反復(つまり、コミット$ B)によってもたらされた変更を取り除き、コミット$ Cがファイルに対して行ったことを維持しながら、$Bを元に戻すことです。
$ git revert $B
コミット$Bを作成した人は、あまり規律がなく、同じコミットでまったく関係のない変更をコミットした可能性があります。この復帰は、問題のある変更が表示されたファイル以外のファイルに影響を与える可能性があるため、実行後に結果を注意深く確認することをお勧めします。それで。
面白いことに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 つのコマンド ... commit git checkout git rebase master
... ブランチに適用する変更のブランチをチェックアウトしますmaster
。このrebase
コマンドは<my branch>
( にないmaster
) からコミットを取得し、それらを のヘッドに再適用しますmaster
。つまり、 の最初のコミットの親は、履歴<my branch>
の前のコミットではなく、現在の. 2 つのコマンドは次と同じです。master
master
git rebase master <my branch>
「base」ブランチと「modify」ブランチの両方が明示的であるため、このコマンドは覚えやすいかもしれません。
. 最終的な履歴結果は次のとおりです。
---o----o----o----o master \----A'----B' <my branch>
最後の 2 つのコマンドは ...
git checkout master
git merge <my branch>
... 早送りマージを実行して、すべての<my branch>
変更をに適用しますmaster
。この手順がないと、リベース コミットが に追加されませんmaster
。最終結果は次のとおりです。
---o----o----o----o----A'----B' master, <my branch>
master
と<my branch>
両方の参照B'
。また、この時点から<my branch>
参照を削除しても安全です。
git branch -d <my branch>
ファイルを以前のコミット (および元に戻すファイルは既にコミット済み) に戻したい場合は、次を使用できます。
git checkout HEAD^1 path/to/file
また
git checkout HEAD~1 path/to/file
次に、「新しい」バージョンをステージングしてコミットします。
マージの場合、コミットは 2 つの親を持つことができるという知識があれば、HEAD^1 が最初の親であり、HEAD~1 が 2 番目の親であることを知っておく必要があります。
ツリーに親が 1 つしかない場合は、どちらでも機能します。
ここには多くの提案があり、そのほとんどは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
git-aliases、awk、shell-functions が役に立ちます!
git prevision <N> <filename>
ここ<N>
で、 file に対してロールバックするファイルのリビジョンの数です<filename>
。
たとえば、単一のファイルの直前のリビジョンをチェックアウトするには、次x/y/z.c
を実行します。
git prevision -1 x/y/z.c
以下をgitconfig
[alias]
prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
コマンドは基本的に
git log
指定されたファイルに対して a を実行し、- ファイルの履歴から適切な commit-id を選択し、
git checkout
指定されたファイルの commit-id に対してa を実行します。
基本的に、この状況で手動で行うことはすべて、1
つの美しく効率的な git-alias - git-previsionにまとめられます。
ここでEasyGitをプラグインする必要があります。これは、経験豊富なユーザーを混乱させることなく、初心者が git をより親しみやすくするためのラッパーです。それが行うことの 1 つは、により多くの意味を与えることですgit revert
。この場合、次のように簡単に言えます。
eg revert foo/bar foo/baz
ただし、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
はファイルをインデックスにステージングしますが、コミットされません。)
Git checkout ./foo
インデックス./foo
からパスを元に戻すことを意味します; addを追加すると、Gitは、インデックス内のそのパスを
リビジョンに戻すように指示されます。HEAD
HEAD
ここでの多くの回答はgit reset ... <file>
orを使用すると主張していますが、そうすることで、元に戻したいコミットの後にコミットgit checkout ... <file>
されたすべての変更が失われます。<file>
1 つのファイルに対する 1 つのコミットからの変更を元に戻したい場合は、git revert
1 つのファイル (またはコミット ファイルのサブセット) に対してのみ行う場合git diff
とgit apply
同様に、両方を使用することをお勧めします<sha>
。元に戻したいコミット) :
git diff <sha>^ <sha> path/to/file.ext | git apply -R
基本的に、元に戻したい変更に対応するパッチを最初に生成し、次にパッチを逆に適用してそれらの変更をドロップします。
もちろん、元に戻された行が<sha1>
とHEAD
(競合) の間のコミットによって変更された場合は機能しません。
git log
特定のバージョンのハッシュキーを取得してから使用するために使用しますgit checkout <hashkey>
注:最後のハッシュの前にハッシュを入力することを忘れないでください。最後のハッシュは現在の位置(HEAD)を指し、何も変更しません。
明らかに、誰かが git に関するわかりやすい本を書く必要があるか、ドキュメントで git についてよりよく説明する必要があります。この同じ問題に直面して、私はそれを推測しました
cd <working copy>
git revert master
実行しているように見える最後のコミットを元に戻します。
イアン
git revert <hash>
指定されたコミットを元に戻します。git revert
最新のコミットにのみ影響すると思われるようです。
特定のファイルの変更を元に戻したい場合、そのコミットがそのファイルよりも多く変更された場合、それは問題を解決しません。
最後のコミットで間違ったファイルをコミットした場合は、次の指示に従います。
これが私のやり方です。
a) Android Studio でファイルを開きます。
b) git -> 履歴を表示し、元に戻したい以前のコミットを見つけます。commit_id (つまり、コミット ハッシュ) を取得します。
c)git checkout commit_id file_path