私はブランチで作業しており、作業コピーを取得しましたが、それは本当に汚れています。コミットする変更を調べたとき、いくつかのワンライナー修正をブランチにコミットしたかったの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 グラフィカル インターフェイスには、この機能があります)。