[解決済み] 特定のコミットを削除する
2022-03-14 21:41:52
質問
あるプロジェクトで友人と一緒に作業していたのですが、彼は編集されてはいけないファイルを大量に編集してしまいました。どういうわけか、私は彼の仕事を私の仕事にマージしてしまいました。私は長い間、これらのファイルへの編集を含むコミットを削除する方法を探して遊んでいました。それはrevertとrebaseの間の投げ合いのようで、簡単な例はありませんし、ドキュメントでは私が私以上に知っていると仮定しています。
というわけで、以下は質問の簡略版です。
次のようなシナリオの場合、コミット2を削除するにはどうすればよいですか?
$ mkdir git_revert_test && cd git_revert_test
$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/
$ echo "line 1" > myfile
$ git add -A
$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 myfile
$ echo "line 2" >> myfile
$ git commit -am "commit 2"
[master 342f9bb] commit 2
1 files changed, 1 insertions(+), 0 deletions(-)
$ echo "line 3" >> myfile
$ git commit -am "commit 3"
[master 1bcb872] commit 3
1 files changed, 1 insertions(+), 0 deletions(-)
期待される結果は
$ cat myfile
line 1
line 3
以下は、私がリバートしようとしている例です。
$ git revert 342f9bb
Automatic revert failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result.
解決方法は?
Git が元に戻すべき差分を計算する際に使用するアルゴリズムでは、以下のことが要求されます。
- 元に戻される行は、それ以降のコミットで変更されていません。
- 歴史上、他の "隣接" コミットが存在しないこと。
隣接する("adjacent") の定義は、コンテキスト差分のデフォルトの行数である 3 に基づいています。
$ cat >myfile <<EOF
line 1
junk
junk
junk
junk
line 2
junk
junk
junk
junk
line 3
EOF
$ git add myfile
$ git commit -m "initial check-in"
1 files changed, 11 insertions(+), 0 deletions(-)
create mode 100644 myfile
$ perl -p -i -e 's/line 2/this is the second line/;' myfile
$ git commit -am "changed line 2 to second line"
[master d6cbb19] changed line 2
1 files changed, 1 insertions(+), 1 deletions(-)
$ perl -p -i -e 's/line 3/this is the third line/;' myfile
$ git commit -am "changed line 3 to third line"
[master dd054fe] changed line 3
1 files changed, 1 insertions(+), 1 deletions(-)
$ git revert d6cbb19
Finished one revert.
[master 2db5c47] Revert "changed line 2"
1 files changed, 1 insertions(+), 1 deletions(-)
すると、すべて期待通りに動作するようになります。
2つ目の回答はとても興味深いものでした。 まだ正式にリリースされていない機能ですが、(Git v1.7.2-rc2では利用可能ですが)Revert Strategyというものがあります。 このようにgitを呼び出すことができます。
git revert --戦略的解決 <commit>
を使えば、より良い仕事ができるはずです。 私は利用可能なストラテジーのリストが何であるか知りませんし、どのストラテジーの定義も知りません。
関連
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] ある特定のコミットのコミット作者を変更する方法は?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】サブモジュールを削除する方法は?
-
[解決済み】Gitでコミットをチェリーピックするというのはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】git revert <hash> not allowed due to a merge but no -m option was given.
-
[解決済み】マージ後のコミットでGitエラー - fatal: マージ中に部分コミットができない
-
[解決済み】マージの競合が発生した git stash pop の取り消し
-
[解決済み】ローカルに変更があるにもかかわらず、git pushが「すべて最新」と言う
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
[gitコミット失敗の解決] 現在のブランチの先端が後ろにあるため、更新が拒否されました。
-
[解決済み】ローカルGitブランチとそのリモートブランチを比較する方法
-
[解決済み] このリポジトリで別の git プロセスが実行されているようです。
-
[解決済み] Gitのエラー「object file ... is empty」はどうすれば直せますか?
-
[解決済み】gitの履歴から特定のリビジョンを削除する方法とは?