web-dev-qa-db-ja.com

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

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

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

3954
Hates_

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

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

git checkout manページに詳しい情報があります。

c5f567の前のコミットに戻したい場合は、~1を追加してください(任意の番号で動作します)。

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

ちなみに、このコマンドは普通のこと(ブランチ間での変更)と変わって破壊的なもの(作業ディレクトリ内の変更を破棄)の両方に使用されるため、このコマンドにはいつも不快でした。

5187
Greg Hewgill

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>
545
Chris Lloyd

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

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

323
foxxtrot
git checkout -- foo

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

git checkout HEAD^ foo

1つ前の改訂版など.

258
Greg Hewgill

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

git checkout HEAD file/to/restore
114
CDR

私は今同じ問題を抱えていました、そして私は見つけました この答え 理解するのが最も簡単です(commit-refは戻りたいログの変更のSHA値です)

git checkout [commit-ref] [filename]

これはその古いバージョンをあなたの作業ディレクトリに置き、そこからあなたが望むならそれをコミットすることができます。

103
bbrown

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

git checkout master~5 image.png

これはあなたがmasterブランチにいて、あなたが望むバージョンが5コミット前であると仮定しています。

88
Ron DeVera

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

時にはあなたはただ戻って、それらがすべて間違っているので、ある点を過ぎたすべての変化について忘れたいと思うことがあります。 

皮切りに:

$ git log

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

次に入力します。

$ git reset --hard SHA1_HASH

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

78
jdee

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

git checkout <commit hash> file

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

git commit -a
61
v2k

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

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

$ git checkout $A file

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

一方、2番目のイテレーション(つまり、$ Bのコミット)でもたらされた変更を取り除き、$ Cがファイルに対して行った処理を維持しながら、$ Bを元に戻したい

$ git revert $B

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

54
gitster

作業コピーがfooという名前のディレクトリにあると、git checkout 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
36
Aaron Maenpaa

これが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>の最初のコミットの親は、もはやmaster履歴の前のコミットではなく、現在のmasterの先頭です。 2つのコマンドは以下と同じです。

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>
32
cmcginty

git-aliases、awk、Shellなどの機能が助けになります。

git prevision <N> <filename>

<N>は、ファイル<filename>に対してロールバックするファイルのリビジョン数です。
たとえば、1つのファイル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

21
TheCodeArtist

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

git reset HEAD path_to_file

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

git checkout -- path_to_file
21
Gulshan Maurya

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

git checkout HEAD^1 path/to/file

または

git checkout HEAD~1 path/to/file

それからステージングして "新しい"バージョンをコミットしてください。

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

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

20

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

eg revertfoo/bar foo/baz

20

ただし、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はファイルをインデックスにステージングしますが、not get commitは行いません。)

Git checkout ./fooは、 index からパス./fooを元に戻すことを意味しますHEADを追加することは、Gitにその前の HEADリビジョンにそのパスを元に戻すよう指示します。

19
Damien Diederen

ここにたくさんの提案がありますが、そのほとんどは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
14
Peter V. Mørch

私にとって返信はどれも本当にはっきりしていないように見えたので、私は非常に簡単に思えるように私に追加したいと思います。 

私はコミットabc1を持っています、そしてそれから私はファイルfile.txtへのいくつかの(または1つの修正)をしました。

ファイルfile.txtで何かがめちゃくちゃになったので、前回のコミットabc1に戻りたいとします。

1 .git checkout file.txt:これが必要でなければローカルの変更を削除します

2 .git checkout abc1 file.txt:これはあなたのファイルをあなたの Want versionに持ってくるでしょう。

3 .git commit -m "Restored file.txt to version abc1":これはあなたの復帰を確定します。

  1. git Push:これは全てをリモートリポジトリにプッシュします 

ステップ2と3の間にはもちろん、何が起こっているのかを理解するためにgit statusを実行できます。通常、あなたはfile.txtがすでに追加されているのを見るべきです、そしてそれがgit addの必要がない理由です。

11

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

git checkout eb917a1 YourFileName

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

git reset HEAD YourFileName
git checkout YourFileName

これは単にファイルの最後にコミットされた状態にあなたを連れて行くでしょう

11
shah1988

git checkout ref | commitHash - ファイルパス

例えば 

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

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

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

8
mustafakyr

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

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

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

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

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

8
Vince

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

cd <working copy>
git revert master

最後に行ったコミットを元に戻します。

イアン

7
Ian Davis

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

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

open source tree

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

enter image description here

  1. そのコミットの変更点の一覧を見ることができます list of files in the source tree
  2. それを選択してから...右側のボタンをクリックしてください...リバースファイルをクリックしてください
  3. それからあなたはそれをファイルステータスタブの左下の左側に見ることができます。

file status tab

  1. あなたのビジュアルスタジオコードを開き、あなたの削除されたファイルをコミットすることによって元に戻ります
  2. 結局のところ、あなたはソースツリーの最後のコミットの結果を見ることができます。

enter image description here

git revert <hash>

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

特定のファイルの変更を元に戻して、そのコミットがそのファイル以上に変更された場合は、これで問題は解決しません。

4
Otto

あなたは4つのステップでそれをすることができます:

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

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

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

がんばろう

3
Nir M.

これはとても簡単なステップです。必要なコミットID、ここでは1つ前のコミットIDまでファイルをチェックアウトし、git commit amendを実行するだけで完了です。

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

これはとても便利です。コミットの先頭にあるファイルを以前のコミットIDに移動したい場合は、簡単に実行できます。

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

git checkout Last_Stable_commit_Number - ファイル名

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

git checkout branchName_Which_Has_stable_Commit fileName
1

これが私のやり方です。

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

b)git - > Show History、元に戻したいコミットを見つけます。 commit_id(コミットハッシュ)を取得します。

c)git checkout commit_id file_path

1
Francis Bacon

Git Extensionsを使用していてファイルの親コミットのみに戻す場合は、元に戻す変更を含むコミットを選択してから、詳細ペインの[差分]タブを選択して右クリックします。元に戻すファイル、[ファイルをリセット]、[A](親)

1
Chris Halcrow

Git v2.23.0の時点で、新しい git restore メソッドがあります。これは、git checkoutが担当したことの一部を引き受けることになっています(受け入れられた回答でさえgit checkoutは非常に紛らわしいと述べています) )。 github blog の変更点のハイライトをご覧ください。

このコマンドのデフォルトの動作は、sourceパラメーター(この場合はコミットハッシュ)からのコンテンツで作業ツリーの状態を復元することです。

したがって、Greg Hewgillの回答に基づいて(コミットハッシュがc5f567であると仮定して)、コマンドは次のようになります。

git restore --source=c5f567 file1/to/restore file2/to/restore

または、c5f567より前の1つのコミットの内容に復元する場合:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
0
mjarosie