私はブランチで作業しており、作業コピーを取得しましたが、それは本当に汚れています。コミットする変更を調べたとき、いくつかのワンライナー修正をブランチにコミットしたかったのmasterです。
この場合、使用git stashは実際には役に立ちません。なぜなら、私の作業コピーには、マスターとまだマージされない他の変更がたくさんあるからです。
この状況を修正するためのより効率的な方法はありますか? (例: コミットを作成し、その親を移動しますか?)
git add -i対話モードを使用するために使用できます。そこで、何をコミットし、何をスキップするかを指定できます。
このようにして、個別のコミットとしてワンライナーをコミットできます。を使用git cherry-pickすることで、後でそれらをマスターにマージできます。
を使用git add -iしてこのブランチにコミットするものを選択し、次に master に変更して残りをコミットします。
を使用add -iすると、コミットの準備をするファイルの部分を選択してコミットし、同じファイルの他の部分をコミットから除外することができます。
git add -p@arkaitz-jimenezが正しく推奨するプロセスに従うために、パッチモードに直接ドロップします。
以前の提案に基づいて、これは私が思いついた解決策です:
チェリーピックを使用したソリューション1
ブランチ自体で単一の変更をコミットするだけです。
git add --patch <files> # record every change to move to master
git commit
マスターに移動し、チェリーピック
git stash
git checkout master
git cherry-pick <commitid>
ブランチに戻ると、リベースできます。
git checkout <branch>
git rebase master
重複するコミットごとに、次のように入力するように求められます。
git rebase --skip
重複するコミットはブランチのパッチセットから除外され、履歴はクリーンです。結局、決勝戦git mergeはまだ早送りすることができます。
解決策2、最初にブランチにコミットする必要はありません
まず、すべてを抽出してマスターに移動します。
git add --patch <files> # record every change to move to master
次に、マスターに切り替えてコミットします。
git stash --keep-index # clear the working copy only
git checkout master -m # merge the index.
git commit
そしてブランチに戻ると、マスターの先端に直接リベースできます。
git checkout <branchname>
git rebase master # move to branch start to the tip of master.
git stash apply # restore working copy, auto merges the changes
解決策3、現在のマスターブランチのクローンを作成します
複数の作業コピーを持っていてもかまわない場合(私は常に実際にSVNでこれを行いました)、3番目の解決策があります:
mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master # fetch remote master to local remotes/origin/master
git checkout -t origin/master # make new "master" branch, link to remote, checkout.
git commit
git push origin master # inject the change in the original repository.
git clone現在アクティブなブランチを常にクローンするため、クローンのセットアップはここで手動で行われます。
より複雑な状況では、とを使用した追加の安全ガードが常にgit diff > to-master.patchありgit apply to-master.patchます。これにより、すべてをリセットし、問題が解決するまでやり直すことができます。
この状況では、両方のブランチに存在するファイルの1行の修正を処理しています。これにより、マージの競合が発生せず、のようないくつかのショートカットが可能になりますcheckout -m。
これがあなたが望むものかどうかはわかりませんが、他のブランチ (コミットされていない変更を失うことはありません) をチェックアウトし、コミットする変更を選択的にチェックインします。
git add -i/を使用する代わりに、git add -pインタラクティブな追加モードを使用することもできますgit gui
(おそらく、QGit などのコミット ツールに含まれる他の git グラフィカル インターフェイスには、この機能があります)。