[解決済み] リベースの後、変更した内容は失われましたか?
質問
最近、私が作業していたブランチをリベースしました。ツリーの履歴は次のようなものでした。
1 = 2 = 3 = 4
\
5 = 6 = 7
\
8
私は自分の変更点(図の8番)をmasterブランチにリベースしたいと思いました(現在、図のコミット4まで)。そこで、次のようにしました。
git checkout my_branch
git rebase master
競合を解決するためにgit mergetool/git rebase --skipを多用する >
実行すると今だけ。
git checkout my_branch
git diff master
差分がゼロになりました。私はブランチを失っていませんが (保存したパッチから私の変更をまだ再作成できます)、私が行ったマージ/リベースが見つかりません。私は何か間違ったことをしたのでしょうか?リベースはまだどこかにあり、私の変更がマスターにマージされているのでしょうか、それとももう一度やらなければならないのでしょうか?
どのように解決するのですか?
何も変化がない場合、変更内容が失われている可能性があります。 おそらく
git reflog
を使ってリベース前のブランチを特定し、そのブランチに対して
git reset --hard <my-branch-tip-before-rebase>
を使って元のブランチを取り戻します。 そして、そうです、もう一度このプロセスを実行する必要があります :-(
でも、どうして同じように見えるようになったのか、よくわかりません。 私は、あなたが与えたコマンドで次のように表示されることを期待していました。
1 = 2 = 3 = 4 (master)
\ \
\ 5' = 6' = 8' (my_branch)
\
5 = 6 = 7
この場合、おそらくは
rebase --onto
:
git rebase --onto master <commit id for 6> my_branch
そうすると、次のようなグラフになったはずです。
1 = 2 = 3 = 4 (master)
\ \
\ 8' (my_branch)
\
5 = 6 = 7
変更を失うことに関しては、特にほとんど同じに見えるいくつかの大きなブロックがある場合、マージの衝突を処理するのに少し練習が必要です。 私はいつも、コミットによってもたらされた実際の差分を見ること、そしてその変更点を見つけ出し、適切な方法ですでにブランチにあるものとマージすることに頼っています。 あなたの変更がそこに紛れ込んでしまったことは容易に想像がつきます。
覚えておくべきことがひとつあります。 ソースが十分に分岐していないと感じるため、多くのマージ競合を期待していない場合、競合を見ることは何か間違ったことをしているという警告フラグです。 バックアップを取るのは良いことです。
git rebase --abort
を行い、ブランチを調査し、衝突が予想される場合は再度チェックするのが良いでしょう。 コンフリクトが発生した場所を必ず記録しておいてください (通常、rebase がコマンドラインにキックする直前に "Applying ..." があります)。 これは通常、開始するのに最適な場所です。
時には、コンフリクトは避けられないものであり、それを解決するのは面倒です。 しかし、練習を重ねれば、この問題に遭遇することは少なくなると思います。
ブランチ間の変更の移植に関するより詳しい情報は git rebase のマニュアルページをご覧ください。 rebase --onto" で検索してください。 最初のヒットで、変更を別のブランチに移植する方法について説明しているセクションにたどり着けるはずです。
関連
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] git rebase の取り消し
-
[解決済み] ステージングされた変更を表示するにはどうしたらいいですか?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み] Gitのプッシュを正しく強制する方法は?
-
[解決済み] git のコミットを削除しても、変更は維持できますか?
-
[解決済み] gitブランチのタグを別のコミットに移動するにはどうすればよいですか?
-
[解決済み】Featureブランチのリベースの後、Gitプッシュが拒否される。
-
[解決済み】Gitのワークフローとrebaseとmergeの質問
-
[解決済み] 別のユーザーでコードをコミットするにはどうすればよいですか?
最新
-
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 push] 解決策: ! [リモート拒否] master -> master (受信前のフックは拒否されました)
-
Gitで「このリポジトリでは別のgitプロセスが実行されているようです...」と表示される問題
-
git を使用してリモートリポジトリを更新する場合、現在のブランチの先端がエラーの背後にあるため、更新が拒否されました。
-
git push issues
-
[解決済み] JenkinsのGitプラグイン。特定のタグをビルドするには?
-
[解決済み] 単一ファイルのマージをやり直す
-
[解決済み] SourceTreeを使用して、ビットバケット上にレポを作成せずに、ローカルレポをビットバケットにプッシュするにはどうすればよいですか?
-
[解決済み] VSCodeからgitの統合を削除する
-
[解決済み] GitHubのウェブサイト上でディレクトリやフォルダの名前を変更するには?
-
[解決済み] Git リベース: コンフリクトで進行が妨げられる