ファイルのグループの一部としてコミットされたファイルにいくつかの変更を加えましたが、今度は変更を以前のバージョンにリセット/戻したいと思います。
必要なリビジョンを見つけるためにgit log
と一緒にgit diff
を実行しましたが、過去にファイルを元の状態に戻す方法はわかりません。
必要なコミットのハッシュが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
ちなみに、このコマンドは普通のこと(ブランチ間での変更)と変わって破壊的なもの(作業ディレクトリ内の変更を破棄)の両方に使用されるため、このコマンドにはいつも不快でした。
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 commitへの参照を使用できます。重要なのは、コマンドが次のようになっているということです。
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
「ロールバック」と言うときは注意する必要があります。コミット$ Aでファイルの1つのバージョンを使用し、その後2つの別々のコミット$ Bおよび$ Cで2つの変更を行った場合(したがって、表示されるのはファイルの3番目の反復です)、「最初のロールバックに戻したい」と本当に言っているのですか?
2回目と3回目の繰り返しの両方で変更を取り除きたい場合は、非常に簡単です。
$ git checkout $A file
そして結果をコミットします。コマンドは、「コミット$ Aによって記録された状態からファイルをチェックアウトしたい」と尋ねます。
一方、2番目のイテレーション(つまり、$ Bのコミット)でもたらされた変更を取り除き、$ Cがファイルに対して行った処理を維持しながら、$ Bを元に戻したい
$ git revert $B
コミット$ Bを作成した人は、非常に規律がなく、同じコミットでまったく関係のない変更をコミットした可能性があり、このリバートはfile以外のファイルに触れる可能性があることに注意してください。確認後、結果を慎重に確認してください。
作業コピーが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
これが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>
git-aliases、awk、Shellなどの機能が助けになります。
git prevision <N> <filename>
<N>
は、ファイル<filename>
に対してロールバックするファイルのリビジョン数です。
たとえば、1つのファイル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
を実行し、- ファイルの履歴から適切なcommit-idを選び、
- 指定されたファイルのcommit-idに対して
git checkout
を実行します。
基本的に、この状況では手動で行うことすべて
1つの美しい、効率的なgitエイリアスにまとめ - git-prevision
ターゲットファイルの最初のリセットヘッド
git reset HEAD path_to_file
そのファイルの2番目のチェックアウト
git checkout -- path_to_file
ファイルを以前のコミットに戻したい場合(およびすでにコミットしたファイルを元に戻したい場合)は、次のようにします。
git checkout HEAD^1 path/to/file
または
git checkout HEAD~1 path/to/file
それからステージングして "新しい"バージョンをコミットしてください。
マージの場合、コミットは2つの親を持つことができるという知識を持っているので、HEAD ^ 1が最初の親、HEAD〜1が2番目の親であることを知っておくべきです。
ツリーに親が1人しかいない場合もどちらでも機能します。
EasyGit ここにプラグインする必要があります。これは、経験豊富なユーザーを混乱させずに初心者にもgitをより親しみやすくするためのラッパーです。それがすることの一つは、 git revert
にもっと意味を与えることです。この場合、あなたは単に言うでしょう:
eg revertfoo/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
はファイルをインデックスにステージングしますが、not get commitは行いません。)
Git checkout ./foo
は、 index からパス./foo
を元に戻すことを意味しますHEAD
を追加することは、Gitにその前の HEAD
リビジョンにそのパスを元に戻すよう指示します。
ここにたくさんの提案がありますが、そのほとんどは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
を持っています、そしてそれから私はファイル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"
:これはあなたの復帰を確定します。
git Push
:これは全てをリモートリポジトリにプッシュします ステップ2と3の間にはもちろん、何が起こっているのかを理解するためにgit status
を実行できます。通常、あなたはfile.txt
がすでに追加されているのを見るべきです、そしてそれがgit add
の必要がない理由です。
ファイルの以前のコミットバージョンに移動するには、コミット番号を取得します。eb917a1 とします。
git checkout eb917a1 YourFileName
最後にコミットしたバージョンに戻る必要がある場合
git reset HEAD YourFileName
git checkout YourFileName
これは単にファイルの最後にコミットされた状態にあなたを連れて行くでしょう
git checkout ref | commitHash - ファイルパス
例えば
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>
のすべての変更を失います。
git revert
が1つのファイル(またはコミットファイルのサブセット)に対して行うのと同じように、単一のファイルに対する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
最後に行ったコミットを元に戻します。
イアン
最後のコミットで間違ったファイルをコミットした場合は、以下の指示に従ってください。
git revert <hash>
与えられたコミットを元に戻します。 git revert
は最新のコミットにのみ影響すると思うようです。
特定のファイルの変更を元に戻して、そのコミットがそのファイル以上に変更された場合は、これで問題は解決しません。
あなたは4つのステップでそれをすることができます:
端末に入力する必要があるもの :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&& git commit -m 'reverting file'
git checkout .
がんばろう
これはとても簡単なステップです。必要なコミットID、ここでは1つ前のコミットIDまでファイルをチェックアウトし、git commit amendを実行するだけで完了です。
# git checkout <previous commit_id> <file_name>
# git commit --amend
これはとても便利です。コミットの先頭にあるファイルを以前のコミットIDに移動したい場合は、簡単に実行できます。
git checkout Last_Stable_commit_Number - ファイル名
2.ファイルを特定のブランチに戻す
git checkout branchName_Which_Has_stable_Commit fileName
これが私のやり方です。
a)Android Studioでファイルを開きます。
b)git - > Show History、元に戻したいコミットを見つけます。 commit_id(コミットハッシュ)を取得します。
c)git checkout commit_id file_path
Git Extensionsを使用していてファイルの親コミットのみに戻す場合は、元に戻す変更を含むコミットを選択してから、詳細ペインの[差分]タブを選択して右クリックします。元に戻すファイル、[ファイルをリセット]、[A](親)
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