ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更をリセット/元のバージョンに戻したいと思います。
私が行っているgit log
と一緒にgit diff
、私は必要な改正を見つけることが、ちょうど過去に元の状態にファイルを取り戻すためにどのようには考えています。
ファイルのグループの一部として数回コミットされたファイルにいくつかの変更を加えましたが、その変更をリセット/元のバージョンに戻したいと思います。
私が行っているgit log
と一緒に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
余談ですが、このコマンドは通常のこと(ブランチ間の変更)と異常で破壊的なもの(作業ディレクトリの変更を破棄すること)の両方に使用されるため、私は常にこのコマンドに不快でした。
develop
あなたが欲しいよ)git checkout develop -- file/to/restore
(ダブルダッシュに注意してください)
diffコマンドを使用して、ファイルに加えられた変更をすばやく確認できます。
git diff <commit hash> <filename>
次に、特定のファイルをそのコミットに戻すには、resetコマンドを使用します。
git reset <commit hash> <filename>
--hard
ローカルの変更がある場合は、このオプションを使用する必要がある場合があります。
ウェイポイントを管理するための適切なワークフローは、タグを使用してタイムラインのポイントを明確にマークすることです。私はあなたの最後の文を完全に理解することはできませんが、あなたが望むかもしれないのは、前の時点からブランチを分岐させることです。これを行うには、便利なチェックアウトコマンドを使用します。
git checkout <commit hash>
git checkout -b <new branch name>
これらの変更をマージする準備ができたら、メインラインに対してリベースできます。
git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
git checkout <commit hash> <filename>
方が私にとってはうまくいきましたgit reset
git checkout <commit hash> <filename>
私のために働いた。これは受け入れられた答えではありません、私見。 git reset
しませんでした。
git reset
して単一のファイルをリセットすることはできません。エラーが発生しますfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
。これは、fatal: Cannot do hard reset with paths.
Motti Stromの発言に誤りがあります。使用git checkout <commit hash> <filename>
SHA-1を含めて、gitコミットへの参照を使用できます。ポイントは、コマンドが次のようになることです。
git checkout [commit-ref] -- [filename]
--
ていない受け入れられた答えの違いは何ですか?
rm
コマンドはgetopt(3)を使用して引数を解析します。getopt
コマンド引数を解析するコマンドです。gnu.org/software/libc/manual/html_node/Getopt.html
git checkout -- foo
これはfoo
HEADにリセットされます。あなたもすることができます:
git checkout HEAD^ foo
1つのリビジョンのバックなど
git checkout -- foo
場合foo
は、間違いを避けるために構文を使用することをお勧めします-f
。gitでは、不明な場合は、常にすべてのファイルとディレクトリの前に特別な引数を付けます--
。
--
gitコマンドではなく、gitに特別ではありません。これは、コマンドオプションの終わりを示すbashビルトインです。他の多くのbashコマンドでも使用できます。
--
ありません bashの中に組み込み、特別な言葉。しかし、これは多くのコマンドラインパーサーでサポートされ、gitを含む多くのCLIで使用される一般的な規則です。
そして、最も頻繁に必要とされる最後にコミットされたバージョンに戻すには、この単純なコマンドを使用できます。
git checkout HEAD file/to/restore
私はそれを見つけたと思います...... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.htmlから
すべてが間違っているため、特定の時点を過ぎたすべての変更を忘れてしまいたい場合があります。
皮切りに:
$ git log
最近のコミットとそのSHA1ハッシュのリストが表示されます。
次に、次のように入力します。
$ git reset --hard SHA1_HASH
状態を特定のコミットに復元し、新しいコミットをすべてレコードから完全に消去します。
git push --force
「ロールバック」と言うときは注意が必要です。コミット$ Aで1つのバージョンのファイルを使用していて、後で2つの異なるコミット$ Bと$ Cで2つの変更を行った場合(表示されているのはファイルの3番目の反復です)、「最初のロールバックに戻したい」という意味ですか?
2番目と3番目の両方の変更を取り除きたい場合は、非常に簡単です。
$ git checkout $A file
そして結果をコミットします。コマンドは、「コミット$ 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
git checkout -- 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 v2.23.0以降、新しいgit復元メソッドがあり、原因となっているものの一部を引き受けることになってgit checkout
います(受け入れられた回答でさえ、git checkout
かなり混乱していると述べています)。githubブログで変更点のハイライトをご覧ください。
このコマンドのデフォルトの動作は、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
ターゲットファイルの最初のリセットヘッド
git reset HEAD path_to_file
そのファイルの2番目のチェックアウト
git checkout -- path_to_file
git-aliases、awk、shell-functionsが役に立ちます!
git prevision <N> <filename>
ここ<N>
で、fileに対してロールバックするファイルのリビジョンの数です<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を選択し、
git checkout
指定されたファイルのcommit-idに対してa を実行します。
基本的に、この状況で手動で行うことはすべて、1
つの美しく効率的なgitエイリアスにまとめられます-git-prevision
私はここにEasyGitを接続する必要があります。これは、熟練したユーザーを混乱させることなく、初心者がgitをより親しみやすくするためのラッパーです。それが行うgit revert
ことの一つは、より多くの意味を与えることです。この場合、次のように言うだけです。
eg revert foo/bar foo/baz
ここでは、ほとんどがに沿った多くの提案があります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 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
からパスを元に戻すことを意味します。追加HEAD
することで、Gitに、インデックス内のそのパスをHEAD
リビジョンに戻すように指示します
。
私にとって返事は本当にはっきりしているようには見えなかったので、とても簡単に思える私のものを追加したいと思います。
私はコミットしていてabc1
、その後、ファイルにいくつか(または1つの変更)を加えましたfile.txt
。
今、私はファイルの何かを台無しにしたfile.txt
ので、以前のコミットに戻りたいと言いますabc1
。
1 git checkout file.txt
.:ローカルの変更が不要な場合は、これを削除します
2.:git checkout abc1 file.txt
これにより、ファイルが必要なバージョンになります
3 git commit -m "Restored file.txt to version abc1"
.:これにより、復帰がコミットされます。
git push
:これはすべてをリモートリポジトリにプッシュします もちろん、ステップ2と3の間で、git status
何が起こっているのかを理解することができます。通常は、file.txt
すでに追加されているはずgit add
です。そのため、の必要はありません。
多くのここでの回答の請求に使用するgit reset ... <file>
か、git checkout ... <file>
そうすることによって、あなたは上のすべての変更を失うことになる<file>
あなたは戻したいコミット後にコミット。
あなたは1から変更を元に戻したい場合のみ、単一のファイルにコミットし、同じようにgit revert
やるだけ一つのファイル(またはファイルをコミットのサブセットを言う)のためでしょう、私は両方を使用することをお勧めgit diff
してgit apply
(その等と<sha>
の=ハッシュ元に戻したいコミット):
git diff <sha>^ <sha> path/to/file.ext | git apply -R
基本的には、元に戻したい変更に対応するパッチを最初に生成し、次にパッチを逆適用してそれらの変更を削除します。
もちろん、元に戻された行が<sha1>
and 間のコミットHEAD
(競合)によって変更された場合は機能しません。
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
代わりに使用できます<sha>^ <sha>
使用git log
後、特定のバージョンおよび使用のためのハッシュキーを取得しますgit checkout <hashkey>
注:最後のハッシュの前にハッシュを入力することを忘れないでください。最後のハッシュは現在の位置(HEAD)を指し、何も変更しません。
あなたは4つのステップでそれを行うことができます:
端末に入力する必要があるもの:
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&& git commit -m 'reverting file'
git checkout .
幸運を
git-revert
リポジトリ全体でしか機能しないため、それを補うために他のすべてを元に戻す必要があるということです。
git revert --no-commit <commit_hash>
2. git reset HEAD
これにより、余分なコミットが回避され、すべての変更が作業ディレクトリでのみ行われます。
git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
。新しいブランチのヒントには、元に戻したファイルを除くすべての変更が反映されていました。
これは非常に簡単な手順です。ファイルを必要なコミットIDにチェックアウトします。ここでは前に1つのコミットIDを使用し、次にgit commit amendを実行するだけです。
# git checkout <previous commit_id> <file_name>
# git commit --amend
これはとても便利です。コミットの先頭にある以前のコミットIDにファイルを移動したい場合は、簡単に実行できます。
--cached
、確認するときに忘れないでくださいgit diff
。 リンク