web-dev-qa-db-ja.com

コミットをマージまたは追加せずに、ブランチbからaに変更を適用する

私のシナリオは、ビルドプロセスに大きな改善を加えたブランチ(ブランチA)と、関連のない機能に取り組んでいるブランチ(ブランチB)があることです。ブランチBをハックしているとき、より速く簡単なビルドが必要なため、ブランチAで書いたものを引き込みたいと思っています。ただし、ブランチBの変更をステージングされていない変更に追加するだけで、ブランチBを「汚染」したくありません。

私が試したもの(branchBに立っているとき):

git merge --no-commit branchA

マージ内に配置されるため、機能しません。そうでなかったら、それは完璧でしょう。

git checkout branchA -- .

変更master..branchAではなく、branchA..branchBの間に変更を適用するため、機能しません。

他に何か?

編集:はい、ブランチAの変更がコミットされます。この例では、ビルドが改善されたブランチは1つしかありませんが、機能ブランチでの作業中に適用したいビルドが改善されたブランチが最大N個ある場合があります。

63

同様のことをする必要があり、--squashをマージコマンドに追加することで修正できました

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
108
guilffer

cherry-pick -nはあなたがしたいことをするべきですが、ビルドの改善をステージングされていない変更として必要とする理由がわかりません-それはいくつかのことを難しくします(たとえば、変更されたファイルへの他の変更をマージするか、何かをリベースします)。

この例では、ビルドが改善されたブランチは1つしかありませんが、機能ブランチでの作業中に適用したいビルドが改善されたブランチが最大N個ある場合があります。

その場合、AとBの両方からマージする新しいブランチCを作成します(ビルドが改善された他のブランチ)。機能ブランチBの変更をコミットしてから、Cブランチにマージします。Cブランチには、ビルドの改善と機能ブランチの変更が含まれているため、一緒にテストできます。 Cではなく適切なブランチでさらに変更を加える必要がある場合は、Cにマージします。Cブランチで何も変更しないで、他のブランチからの変更を統合するために使用します。

つまり、ダーティツリーでコミットされていない変更をジャグリングする代わりに、ブランチCでGitのすべての機能を使用できます。

9
Jonathan Wakely

コミットをチェリーピックできるはずです(-nすぐにコミットしないようにします)。

6
Lucero

私はあなたの要件を理解しているかどうかわかりません。

マージを実行してから、git reset HEAD~1を呼び出すことができます。


次のシーケンスは、masterの上にあるbranchAbranchBの間のすべてのコミットを再生する必要があります。 branchBにすでに適用されているコミットはスキップされます。

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
4
LeGEC

私はそれを明確に理解したとは100%確信していませんが、私の場合はブランチ間で差分パッチを作成し、このパスをBブランチに適用しました。

ブランチA内:

 git diff branchA..branchB > patch.diff
 git apply patch.diff
1
sobi3ch