5220

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

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

4

34 に答える 34

7099

必要なコミットのハッシュが次のとおりであると仮定します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 が十分に新しい場合は、このコマンドを使用できますが、ドキュメントには警告が表示されます。

このコマンドは実験的なものです。動作が変わる場合があります。

于 2008-10-18T23:39:35.210 に答える
685

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>
于 2008-12-17T06:59:33.757 に答える
406

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

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

于 2009-04-07T21:48:35.297 に答える
334
git checkout -- foo

fooそれはHEADにリセットされます。あなたもすることができます:

git checkout HEAD^ foo

ワンリビジョンバックなど

于 2008-08-29T20:56:12.433 に答える
137

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

git checkout HEAD file/to/restore
于 2012-01-14T06:15:35.983 に答える
112

私は今同じ問題を抱えていましたが、この回答が最も理解しやすいことがわかりました(commit-ref戻りたいログの変更のSHA値です):

git checkout [commit-ref] [filename]

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

于 2009-05-27T17:52:22.760 に答える
97

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

git checkout master~5 image.png

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

于 2009-04-07T14:03:18.987 に答える
86

私はそれを見つけたと思います.... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.htmlから

場合によっては、過去に戻って、特定のポイントを過ぎたすべての変更を忘れたいと思うことがあります。それらはすべて間違っているからです。

皮切りに:

$ git log

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

次に、次のように入力します。

$ git reset --hard SHA1_HASH

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

于 2008-12-17T06:53:25.157 に答える
68

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

git checkout <commit hash> file

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

git commit -a
于 2011-08-25T22:12:22.210 に答える
57

「ロールバック」と言うときは注意が必要です。コミット$Aにファイルの1つのバージョンがあり、後で2つの別々のコミット$Bと$Cで2つの変更を行った場合(つまり、ファイルの3回目の反復が表示されます)、「最初のものにロールバックしたい」ということですか?

2回目と3回目の反復の両方で変更を取り除きたい場合は、非常に簡単です。

$ git checkout $A file

次に、結果をコミットします。このコマンドは、「commit$Aによって記録された状態からファイルをチェックアウトしたい」と尋ねます。

一方、あなたが意味したのは、2回目の反復(つまり、コミット$ B)によってもたらされた変更を取り除き、コミット$ Cがファイルに対して行ったことを維持しながら、$Bを元に戻すことです。

$ git revert $B

コミット$Bを作成した人は、あまり規律がなく、同じコミットでまったく関係のない変更をコミットした可能性があります。この復帰は、問題のある変更が表示されたファイル以外のファイルに影響を与える可能性があるため、実行後に結果を注意深く確認することをお勧めします。それで。

于 2009-01-11T08:13:39.717 に答える
41

面白いことに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
于 2008-08-29T21:26:35.510 に答える
33

仕組みは次の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 つのコマンドは次と同じです。mastermaster

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>
于 2009-02-24T09:43:49.043 に答える
23

ファイルを以前のコミット (および元に戻すファイルは既にコミット済み) に戻したい場合は、次を使用できます。

git checkout HEAD^1 path/to/file

また

git checkout HEAD~1 path/to/file

次に、「新しい」バージョンをステージングしてコミットします。

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

ツリーに親が 1 つしかない場合は、どちらでも機能します。

于 2014-01-11T00:29:50.133 に答える
21

ここには多くの提案があり、そのほとんどは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
于 2016-01-07T22:19:45.773 に答える
21

git-aliases、awk、shell-functions が役に立ちます!

git prevision <N> <filename>

ここ<N>で、 file に対してロールバックするファイルのリビジョンの数です<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指定されたファイルに対して a を実行し、
  • ファイルの履歴から適切な commit-id を選択し、
  • git checkout指定されたファイルの commit-id に対してa を実行します。

基本的に、この状況で手動で行うことはすべて、1
つの美しく効率的な git-alias - git-previsionにまとめられます。

于 2015-05-01T01:46:58.340 に答える
20

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

eg revert foo/bar foo/baz

于 2008-10-19T00:16:01.937 に答える
18

ただし、git checkout ./foogit 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は、インデックス内のそのパスを リビジョンに戻すように指示されます。HEADHEAD

于 2008-08-31T11:54:16.977 に答える
12

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

1 つのファイルに対する 1 つのコミットからの変更を元に戻したい場合は、git revert1 つのファイル (またはコミット ファイルのサブセット) に対してのみ行う場合git diffgit apply同様に、両方を使用することをお勧めします<sha>。元に戻したいコミット) :

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

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

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

于 2016-12-07T14:43:49.573 に答える
8

git log特定のバージョンのハッシュキーを取得してから使用するために使用しますgit checkout <hashkey>

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

于 2011-12-05T20:09:51.223 に答える
7

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

cd <working copy>
git revert master

実行しているように見える最後のコミットを元に戻します。

イアン

于 2011-12-16T03:03:25.957 に答える
5
git revert <hash>

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

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

于 2008-12-17T18:56:14.260 に答える
5

最後のコミットで間違ったファイルをコミットした場合は、次の指示に従います。

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

オープンソースツリー

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

ここに画像の説明を入力

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

ファイルステータスタブ

  1. Visual Studio コードを開き、削除したファイルをコミットして元に戻します
  2. 最後に、ソース ツリーの最後のコミットで結果を確認できます。

ここに画像の説明を入力

于 2018-08-23T09:53:27.673 に答える
3

これが私のやり方です。

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

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

c)git checkout commit_id file_path

于 2017-03-13T08:10:57.963 に答える