3

私はブランチで作業しており、作業コピーを取得しましたが、それは本当に汚れています。コミットする変更を調べたとき、いくつかのワンライナー修正をブランチにコミットしたかったのmasterです。

この場合、使用git stashは実際には役に立ちません。なぜなら、私の作業コピーには、マスターとまだマージされない他の変更がたくさんあるからです。

この状況を修正するためのより効率的な方法はありますか? (例: コミットを作成し、その親を移動しますか?)

4

6 に答える 6

5

git add -i対話モードを使用するために使用できます。そこで、何をコミットし、何をスキップするかを指定できます。

このようにして、個別のコミットとしてワンライナーをコミットできます。を使用git cherry-pickすることで、後でそれらをマスターにマージできます。

于 2009-12-03T16:10:41.040 に答える
3

を使用git add -iしてこのブランチにコミットするものを選択し、次に master に変更して残りをコミットします。

を使用add -iすると、コミットの準備をするファイルの部分を選択してコミットし、同じファイルの他の部分をコミットから除外することができます。

于 2009-12-03T16:09:15.850 に答える
2

git add -p@arkaitz-jimenezが正しく推奨するプロセスに従うために、パッチモードに直接ドロップします。

于 2009-12-03T17:05:36.827 に答える
1

以前の提案に基づいて、これは私が思いついた解決策です:

チェリーピックを使用したソリューション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

于 2009-12-04T09:53:53.877 に答える
1

これがあなたが望むものかどうかはわかりませんが、他のブランチ (コミットされていない変更を失うことはありません) をチェックアウトし、コミットする変更を選択的にチェックインします。

于 2009-12-03T16:04:55.167 に答える
0

git add -i/を使用する代わりに、git add -pインタラクティブな追加モードを使用することもできますgit gui
(おそらく、QGit などのコミット ツールに含まれる他の git グラフィカル インターフェイスには、この機能があります)。

于 2009-12-03T18:49:58.207 に答える