2017-09-12 13 views
1

私はいくつかの実験を実行するたびにコードの現在の状態を自動的に保存する方法を探しています。git:現在のブランチに現在のブランチに影響を与えずに現在のコードの状態をコミットします。

しかし、私は100万の自動作成コミットでメインブランチのコミット履歴を汚染したくありません。私はmy_experimentsブランチを作ることを考えていましたが、実験を実行するたびにコードの現在の状態をプッシュするだけです。

私は現在のブランチにコミットせずに、自分の現在のコードをexperimentsブランチにコミットすることを望んでいると思います。私はまだ自分のコミットされていないコードを私の現在のブランチに残したいと思っています。

gitでこれを行うにはどうすればよい方法がありますか?

編集

私が欲しいものを明確にするよう求め、なぜされてきました。

時々私は何かをテストするためにコードを変更します。変更は通常、醜いハックです。通常、プロセスが行く:

  • ハック変更
  • 実行コードを作成し、私は実行の結果を保存してい
  • CTRL-Z
  • ビュー保存結果

を結果として保存し、私はまた、コードの状態を保存したいと思います。

これらの「ハック」の変更を私の通常の開発サイクルとは別にしたいと思います。ハックを作成したときのコードの状態の記録が必要です。そのため、私のメインブランチのコミット履歴に一連の "make hack" "revert-hack"ペアを持たせるのではなく、すべての "hacky"変更を1つの "experimental"ブランチだけにコミットさせたいと思います。

答えて

0

テンポラリブランチにちょうどチェックアウトし、好きなだけ多くのコミットを行い、実行可能なコードスカッシュを実行するとすべてのコミットが1つになります。

git checkout -b my_experiments 
# Do your "experiments" 
git rebase -i branch # <branch> should be the parent branch i.e. develop/master 

Rewriting git history

# For instance 
>>> git rebase -i master 
pick 8705209 first 
edit 7979797 second # Use edit wherever you want to view and edit commit 
squash 9793757 third # Use squash to squash commits into the previous one. 
+0

ありがとうございます。しかし、私は実験的コミットツリーを私のメインツリーにマージしようとは思っていません。私は、実験が実行されたときにコードの状態の記録として純粋に "実験"ブランチを存在させたい。 – Peter

+1

@Peterあなたが現在のブランチにコミットしたことは、すでにコードの状態のレコードです。本当に、質問を編集して、そのようなワークフローがなぜ必要なのかを教えてください。 –

+0

こんにちは、ありがとうございます。私は質問を更新しました。 – Peter

1

あなたはまだそれらをプッシュしていないと仮定すると、後の時点でそれらを常にダウンスカッシュことができますので、あなたのブランチ上のコミットの多数を作ることには何も問題はありません。たとえば、あなたがあなたのブランチ上の10回の小さなコミットをしたと仮定すると、しかし、あなたは本当にただ単一の論理がコミットプッシュしたかった、あなたは、ソフトリセット使用することができます

git reset --soft HEAD~10 
git commit -m 'single commit with all my changes' 
git push origin master 

あなただけであなたのブランチのスナップショットを取りたい場合は現在の状態では、HEADから新しいブランチを作成することができます。

git branch backup_experiment_1 

通常、Gitは単一のブランチであっても非常に柔軟性があるので、これは必要ありません。

+0

ありがとう、それについては知らなかった。 (1)すべての実験を記録する単一のブランチを作成したい - 私が作業しているブランチにコミットするだけではない。 (2)「大きな」コミットを行うたびにリセットする必要のある「小さな」コミットがいくつあるか心配する必要はありません。 – Peter

+0

@Peter更新情報を確認してください。 –

+0

'git branch backup_experiment_1'は、現在のブランチからの最後のコミットの分岐を作成しているようですが、これは必要ではありません。私はコードの現在の状態(コミットされていない変更を含む)を "実験"ブランチにコミットし、コミットされていない変更をコミットされていない変更を維持しながら現在のブランチに戻す必要があります。 – Peter

2

私は、あなたの現在のブランチにいくつかの変更が加えられており、あなたの現在のブランチを以前と同じように保っている別のブランチでそれらをコミットしたいと考えています。

git stash 
git checkout -b <new_branch> 
git stash pop 
git add . 
git commit -m '<Your Commit Message Here>' 
+0

ニースですが、元のブランチに戻ってフォローアップするときに、(追加されていない)変更をそこに置いておきます。代わりに私は最後のコミットに戻りました – Peter

+0

私はあなたの答えを修正しました私のソリューションに来て、ありがとう。 – Peter

+0

うれしかったよ、私は応募物を投稿しようとしていました:P。 (y) –

1

私は私が必要とするソリューションが(編集:それはかなり右まだありません - コメントを参照)が見つかりです:

  • git stashはの一時的なコピーをコピーします。これは何

    git stash 
    git checkout -B experiments 
    git stash apply 
    git diff --name-only --diff-filter=U | xargs git checkout --theirs 
    git commit -am 'autocommit' 
    git checkout - 
    git stash pop 
    

    作業コード

  • git checkout -B experiments存在しない場合はブランチ実験をチェックアウトします。
  • git stash apply一時コピーを "experimental"ブランチに貼り付けます。すでにこのコマンドを実行している場合、これにより競合が発生します。
  • git diff --name-only --diff-filter=U | xargs git checkout --theirs
  • が貼り付けられたスタッシュの賛成ですべての競合を解決します(それが競合ファイルの(リスト)でX用 git checkout --theirs Xを呼び出す
  • git commit -am 'autocommit'は実験ブランチあなたの前のブランチへ
  • git checkout -返すために、これらの変更をコミットします。
  • git stash pop作業コードの一時的なコピーを貼り付け、およびメモリから保存されたコピーを解放します。

スタッシュを使用するためのインスピレーションのためのRishabh Dugarのおかげで、とすることにより、別の答えCharles Bailey:https://stackoverflow.com/a/10874862/851699

これが機能するには、現在のディレクトリがgit repoのルートである必要があることに注意してください。

+0

ここでいくつかの警告が適用されます:(1) 'git checkout -B experiments'は、以前のコミットを忘れているとしても、現在のコミットを指すように既存の' experimental'ブランチを強制的にリセットしますreflog)。 (2)隠すものがない場合、 'git stash'はノーオペレーションです。中間および最後のstash操作は失敗します(隠されているものはありません)。または、悪いことに、*前のstashを使用します。おそらく保存するものがあることを確認することが賢明でしょう。(3)インデックスにいくつかの変更が保存されていて、作業ツリーにのみ変更がある場合は、物事が乱れることがあります。 – torek

+0

あなたは正しいです。さて、これはまだいくつかの作業が必要です。 – Peter

関連する問題