2011-12-10 26 views
1

私はmy copy of the perl repository on githubに取り組んでいて、いくつかのコミットをコミットしたいくつかの変更を行うために "perl-d-add-tests-2"というブランチを作成しました。私はこれらのコミットを上流に提出し、それらは "blead"(主なPerl開発ブランチ)に適用されました。私は上流のリポジトリから引っ張り出し、ブリーダーから "perl-d-add-tests-2"に "git merge"を行って、今度は "git format-patch blead"をもう一度実行しようとしましたが、ここで何が起こるのですか:git format-patch:すでにマージされたコミットを無視するにはどうすればよいですか?

[email protected]:~/Download/unpack/perl/p5/git/perl$ git st 
# On branch perl-d-add-tests-2 
nothing to commit (working directory clean) 
[email protected]:~/Download/unpack/perl/p5/git/perl$ git diff blead | cat 
[email protected]:~/Download/unpack/perl/p5/git/perl$ git format-patch blead 
0001-Made-c-line_num-working-again.patch 
[email protected]:~/Download/unpack/perl/p5/git/perl$ 

「git format-patch」は、まだ適用済みのコミットを生成しています。 WTF?

どうすれば "git format-patch"がそれを行うのを防ぐことができますか?私はユニークな変更だけが必要で、以前は別のブランチを開き、そこから "git cherry-pick"をコミットするように言われましたが、明らかにこのソリューションはスケールできません。

答えて

2

単純なオプションの1つとして、既に適用されている古いコミットが含まれていない方法でどのコミットを使用するかを指定することができます。コミットを参照する一般的な構文は、git help rev-parseにあります。この場合には、例えば、と言って、「私の現在のブランチ上の最後の5つのコミットは、」別の可能性は、現在のbleadブランチに対するあなたのperl-d-add-tests-2機能ブランチをリベースするだろう

git format-patch HEAD~5 

ようになります。 IIRCの場合、このブランチでの以前の作業は、bleadに適用されたときに誤って1つのコミットになってしまいました。この場合は、手動クリーンアップを予想以上に行う必要があります。このアプローチを試してみたいと思うなら、私は使い捨てブランチでやってみることをお勧めします。ひどくなったら何も失うことはありません。

# pull in upstream changes: 
git checkout blead 
git pull 

# create and switch to a new branch "tmp": 
git checkout -b tmp perl-d-add-tests-2 

# rebuild this branch against your current "blead" branch: 
git rebase blead 

あなたは結果を好きなら、あなたは機能ブランチの代わりに一時的なブランチを使用することができます。git rebase bleadステップであなたはまた、対話形式で指定する、-iオプションを使用することができることを

# delete current feature branch: 
git branch -d perl-d-add-tests-2 

# rename the temporary branch back to the feature branch's name 
git branch -m tmp perl-d-add-tests-2 

# switch to the recreated feature branch: 
git checkout perl-d-add-tests-2 

# generate patches against blead: 
git format-patch blead 

注意をこれは現在のチップbleadに再適用することを約束します。それはあなたの$EDITORをコミットのアジェンダに開いて再適用します。このルートを下った場合は、おそらく上流のbleadに既に適用されているそのアジェンダのコミットを明示的に削除したいと思うでしょう。

最後に、このために新しいブランチを作成すると、不要なブランチをリポジトリに散らすことになるので、スケールすることはできません。しかし、Gitはいつでもブランチ(git branch -m)の名​​前を変更したり、ブランチ(git branch -d)を削除してくれてうれしいです。問題を引き起こす唯一の方法は、あなたの下流の他のリポジトリが削除されたブランチまたは名前を変更したブランチに依存しているかどうかです。しかし、ローカルフィーチャブランチの一般的なケースでは、誰も引き出しておらず、上流に提出する予定がある場合、それは心配することはありません。だからチェリーピッキングの提案がうまく聞こえたら、それを行い、古いバージョンのフィーチャーブランチを削除することができます。

関連する問題