2017-11-24 13 views
0

大きなプロジェクトなので、コミット履歴を膨らませないというポリシーがあります。だから私が通常やっていることは、私のフィーチャーブランチにあります。私はpush -f origin featbranchを毎日しています。終了したら、私はPRを発行します。git:rebaseして強制的に変更を失った場合

このアプローチは今日私を傷つけました。

私の仕事は私のfeatbranchで終わった。すべてのテストなどをうまく実行した後、最初にpush -f origin featbranchを実行しました。 originは私が働いているレポの私自身のクローンで、upstreamはPRが発行されたものです。

git fetch upstream master 
git rebase upstream/master 
git push -f origin featbranch 

んがエラーを:

は、その後、私は私の featbranch最新に保つためになるよう upstream/masterは、すでに変更されていないことが、私はリベースしたかったことを想起しました。私はすべてが大丈夫だったと思った(すべてのテストなどを二重にチェックしただけだが)、恐ろしい恐怖を感じるかもしれないが、私の最新の変更は全て失われていることに気がついた。

私は今、奇妙な状況に陥っています。私は何が起こったのか分かりません。実際には、私はと非常に最初の約束featbranchに残っているように見えます:upstream/masterに間違いなくあるファイルがfeatbranchにあります。だから、私はうんざりして、ここで何が起こったのかわからない、githubは、その支店での約束は、私が実際に昨日押した13日前からだと言います。

-f origin featbranchのため、私の最新のコミットは回復できません - ローカルではなく、githubで回復してください。私は今から上記の方針を無視し、常に毎日押しますが、強制はしません。それにもかかわらず、私はここで何が起こったのか理解したいと思います。

+1

'git reflog'が役に立ちます:) – knittl

+0

はい、あなたも! :) – faboolous

答えて

2

使用

git reflog 

あなたが戻って取得したい状態を見つけます。

https://stackoverflow.com/a/1270608/2738122

+0

男、あなたは私の日を救った!私の一週!!! thaaaaaaank youuuuuuu – faboolous

+0

喜んで助けてください。一度reflogを見ると、gitはまれに_anything_を失いますが、いつかそれを隠す良い仕事をします! –

+1

@faboolousそして今日、あなたの仕事や他人の仕事を決して忘れないように、あなたは常に '-f'の代わりに '--force-with-lease'を使うことを学びます。長すぎると入力するとgitエイリアスが作成されます。 – Philippe

2

Gitが失われたコミットを回収する方法があります:git reflog

をさらに、あなた自身を集めてきたように、Gitのプッシュの-fオプションは、通常のワークフローの一部であってはなりません。コミット履歴をきれいに保つには、thisのようにすることを検討してください。

2

ここで難しい方法を学んだことがあるかもしれませんが、push -fを日常的に使用するワークフローは危険です。そのpush -fはエラーを出さないは安全であることを意味します。これが、リスクやその他の影響を説明することなく強制的にプッシュすることを推奨する回答を定期的に投票している理由です。

しかし、あなたはあなたが思ったほどの迷子ではないかもしれません。

あなたが記述した症状を引き起こすような、公開した手順には何も表示されません。私はここではっきりと綴られていないいくつかのステップが取られたと考えています。しかしどちらの方法でも、強制的に押してもあなたの地域の状態は変わりません。依然としてreflogを使用して作業を回復できます。

git reflog featbranch 

これはあなたのために2つのことを行いfeatbranch REFの歴史が表示されます:

まず、毎回のREF移動し、その結果REFLOGエントリレコードなぜそれが移動し、実際に明らかに仕事の損失をもたらしたものを見ることができます。

第2に、refログには、refが移動されるたびに "前後の"コミットIDも記録されます。つまり、ログからロールオフされていない限り以前の状態を回復できます。実際にREFLOGがref

git checkout [email protected]{3} 

の各以前の状態に便利な名前を与えることが3つの最新の変更の前に見えたとしてfeatbranchに行くことを言います。 reflogコマンドは、そのような各状態に関連付けられた名前を示します。

関連する問題