2017-03-21 4 views
0

記録のためにgEDAスイートで私の電子プロジェクトを維持するのにgitを使用しています。現在のプロジェクトには、rev-Arev-Bという2つのブランチがあります。私は現在、リビジョンBに取り組んでいます。私は最近、古いリビジョンA(回路図やPDFファイルの改訂番号が間違っています)に間違いを覚えたので、2つのドキュメントを修正し、git reset -hard <ID>git commit -a --amendを使用して変更を修正しました。未知の修正の後にGITツリーが台無しになりました - 並べ替え/クリーニングが必要

私はそのような編集を2回行いましたが、私はこれらの変更に伴う予防措置を知らなかった - 私は歴史を台無しにしてしまったと思っています。

はここ(--date-orderが同じ結果を与える)ツリーがコミットを修正した後、次のようになります。

$ git log --graph --all --oneline --decorate 
* 35945e5 (rev-A) Revision A - Final product 
| * aada926 (HEAD -> rev-B) Revision B - Updated BOM (...) 
| * b88eb61 Revision B - Final product as ordered (...) 
| * 0bda52b Revision B - Reduced to 25.4mm x 35mm 
| * fe2246f Revision A - Final product 
|/ 
* 260eb65 Revision A - Smaller capacitor footprint (...) 

はここ(--date-orderが同じ結果を与える)私が行ったすべてのコミットを持つツリーです:

$ git log --reflog --graph --oneline --decorate 
* 86d6072 Revision A - Smaller capacitor footprint (...) 
* 35945e5 (rev-A) Revision A - Final product 
| * aada926 (HEAD -> rev-B) Revision B - Updated BOM (...) 
| * b88eb61 Revision B - Final product as ordered (...) 
| | * 7ba0df4 Revision B - Final product as order (...) 
| |/ 
| * 0bda52b Revision B - Reduced to 25.4mm x 35mm 
| * fe2246f Revision A - Final product 
|/ 
* 260eb65 Revision A - Smaller capacitor footprint (...) 

git diff私は次のことに気付くことができました:

  • のコミットb88eb617ba0df4変化を示さない、明らかに7ba0df4が冗長である(一つでも、私はそれがメッセージにタイプミスがありますので、取り除くたかったコミットです)
  • 86d6072 260eb65 間と、後者は、後者が、私は維持したいと思い一つであり、私は
  • fe2246f 間と35945e5を維持したいものです

は、ここで私が持っている枝です:

別に私は特に支店名が表示される場所へと、私は両方のツリーを理解していないことから、
$ git branch 
    rev-A 
* rev-B 

。私が望むのは私のリビジョンAコミットのすべてがブランチrev-Aに属し、すべてリビジョンBからrev-Bに属することです。どうすればその木を安全に並べ替え整理できますか?

EDIT:それはリビジョンBは、260eb65の代わりにフォークする必要があり、そこから一つだしながら、さらなる分析の後、私は86d6072 Revision A - Smaller capacitor footprint (...)をコミット推論がどこかに失われています。それはすべてあなたのコミットされていない変更を破棄しますので、そこでどのように私は戻ってrev-Aブランチにそれを持っていると260eb65

+0

どのような_specific_をリセットして修正しましたか?彼らはあなたの木のどこにいますか? – Useless

+0

@Uselessそれは私が迷子になる場所です。私のbashの歴史から、私は '86d6072'にリセットしてそこから修正し、' 35945e5'にリセットしてそこから修正しました。不思議なことに、私が守る必要のある文書を含むコミットです。私はもう何も理解していないし、残念ながら変更IDを書き留めておらず、申し訳ありません。 –

+0

あなたの説明によると、 '260eb65'と' 86d6072'は_siblings_であるべきですが、あなたのグラフは古いバージョンの祖先として新しいバージョンを表示します。それは文字通り不可能なので、あなたの説明から何が起こったのかを理解することは非常に難しいです。おそらく、あなたは '--date-order'を削除し、最後の共通の祖先をツリーに含めることができますか? – Useless

答えて

0

git reset --hard :非常に致命的なコマンドで置き換えることができ、潜在的に危険です。安全のため、使用する前に必ずgit status -sの出力がクリーン(つまり、空)であることを確認する必要があります。REFLOGコマンドを次のようになるまで、git reflog

git reflog,リファレンスログ、または「reflogs」、 支店および他の参考文献の先端がローカルで更新されたレコードを使用しない場合を除き

はまだそれは従うことは容易ではありませんリポジトリ。

リモート原点への変更をプッシュしなかった場合にできることは、squash the redundant commitsです。そう、はい、git rebaseはコミットを並べ替えるそのトリックを行います。あなたはCとBの順序を変更したい場合は

$ git shortlog 
(3): 
     A 
     B 
     C 

:より複雑な例について

git rebase -i HEAD~2 

:最後の二つのコミットの順序を変更する例

$ git rebase -i HEAD~2 
pick 1f9133d B 
pick 33f41be C 

あなたはちょうどそれらを並べ替えますになる:

pick 33f41be C 
pick 1f9133d B 

Rあなたの行って書き込み、参照shortlog:

$ git shortlog 
(3): 
     A 
     C 
     B 
+0

ヒントをありがとう。私はローカルリポジトリのみを使用しています。私はまた、私が何も失っていないように私が保留中のすべての変更を事前にコミットしたことを確かめました。さて、私は「頭」を失ったことを知ったが、私は最新のコミットでそれを見つけることができたので、私はそう言えば、私はその位置を回復した。私はあなたの応答から 'git rebase'が私のコミットを並べ替えるために必要なものだと思いますか? –

0

ないコメント内のコードのようにテキストを編集することができ、それは私が新しい答えを掲載理由です。

ああ、git rebaseはコミットを並べ替えるというトリックを行います。最新の2つのコミットgit rebase -i HEAD〜2を並べ替える例

$ git shortlog 
(3): 
     A 
     B 
     C 
If you want to reorder B with C: 

$ git rebase -i HEAD~2 
pick 1f9133d B 
pick 33f41be C 
You just re-order them to be: 

pick 33f41be C 
pick 1f9133d B 
After your done writing, see the shortlog: 

$ git shortlog 
(3): 
     A 
     C 
     B 
+0

«コメントでコードとしてテキストを編集することはできません。»»ああ、私は助けることができます;-)。私はあなたの答えを両方ともマージしました。このファイルは安全に削除できます。 –

0

以上2日間試した後、私はショートカットを取った:私は今、完全に私のGITツリーを消去している(すなわちrm -rf .git)のtarballアーカイブにリビジョンAとBをバックアップした後。現在は4-5の代わりに2つのコミットしかありませんが、それはローカルのリポジトリなのでうまくいきます。

本当の解決策はまだ見つかっていますが、私はノブの終わりです。何をすべきかを理解するのに失敗したすべての試みよりも、それをすべて取り除き、それを新たに構築する時間が少なくて済みましたが、私はそれにもっと時間を費やす余裕はありません。

+0

私は "古い" GITツリーのバックアップを持っています。 –

関連する問題