2016-04-19 22 views
4

私はコミットが1つのフィーチャーブランチにあります(私のコミットをすべて潰した対話的なリベースの結果)。Gitコミットからのいくつかの変更を別のコミットに移します。

私は、原点にプッシュしてプルリクエストを作成する前に、そのコミットの変更(ファイルレベルで)のサブセットを取って、それらから2番目のコミットをしたいと決めました論理的に別々の問題ですこれどうやってするの?

私が打ち出したいと思っていた変更は、決して自分のコミットではなく、機能ブランチの作業の一部として最初にコミットされました。 Gitリポジトリからいくつかの変更が別々にコミット

答えて

4

移動一言で言えば

をコミット:リセットし、最後のコミットと2つの新しいコミット

私が正しく理解していれば

は、あなたが最もを維持したい作ります最初のコミットの変更のうちの小さいものを2番目のコミットに入れます。 このような場合は、その後、最初のあなたは、ソフトにしたい(おかげで先端のため@hvd)最後のコミットをリセットします。決してコミットしないかのように

git reset --soft HEAD^ 

これは、変更コミット最後を削除しませんが、起こった、そして変化はすべてステージングされる。 この時点で、最初のコミットでは不要なファイルをステージングしないようにします。

git reset -- path/to/file-or-dir 

今、あなたは(すでに上演)の変更の大半のコミットを行うことができ、その後、残りの二コミット: あなたはこのように、ディレクトリ、ファイルまたはディレクトリでファイルをunstageすることができます。

あなたが二コミットの最初のコミットやその他の変更の変更のいくつかをしたいファイル、 を持っているなら、あなたは、最初にファイル全体をリセット と選択のように、git add -pを使用して変更をステージングすることができます

git add
git reset -- path/to/file 
git add -p path/to/file 

-pオプションでは、ステージにハンクを選択できます。ハンクを分割して、ステージを細かく制御することができます。

最初のコミット後に、まだ保留中の(ステージングされていない)変更を追加することができます。

+1

これは正しいですが、OPが欠落しています:OPがすでにコミットを作成しているため、OPは最初にそのコミットを削除する必要があります。 'git reset --soft @ ^'を使って全ての段階的な変更を利用できるようにしておくか、あるいはlarsの答えが既にunstagingされているようにする。 – hvd

+0

ありがとう@hvd、実際に私は最初に主な意図を誤解しました。あなたのコメント(そして再読)の後、私は答えを修正した – janos

3

まず、作業ディレクトリに保留中の変更がないことを確認します。保存する変更がある場合はgit stashを使用してください。

コミット以前に「後方」リポジトリを移動するために使用git reset

$ git reset HEAD^ 

これは、あなたの作業ファイルに変更を加えるが、それは役割がリポジトリの状態をバックアップ一部であったものとなるようではないだろうそのコミットの変更されたものとして表示されます。

git addを使用して、別のコミットに含める変更を追加します。変更をステージングしたら、git commitで変更をコミットします。

残りの変更はすべて追加してからコミットしてください。

これで、以前の1回のコミットを2回の別々のコミットに分割しました。

関連する問題