私は2つの支店devel
とを持っていnext
ます。開発では、多かれ少なかれ膨大な量のコミットがあります。コミットの一部はで厳選されていnext
ます。また、にマージされる次のコミットをいくつか追加しましたdevel
。
次に、に何が欠けているのかを確認したいnext
ので、変更をもたらす前に変更を詳細にテストできnext
ます。私の質問は今、どのコミットがdevel
次のコミットではないのかをどのように確認できますか?
私は2つの支店devel
とを持っていnext
ます。開発では、多かれ少なかれ膨大な量のコミットがあります。コミットの一部はで厳選されていnext
ます。また、にマージされる次のコミットをいくつか追加しましたdevel
。
次に、に何が欠けているのかを確認したいnext
ので、変更をもたらす前に変更を詳細にテストできnext
ます。私の質問は今、どのコミットがdevel
次のコミットではないのかをどのように確認できますか?
回答:
ほとんど使用されgit cherry
ていないコマンドは、まだ選択されていないコミットを表示します。のドキュメントgit cherry
はこちらですが、簡単に言うと次のことができるはずです。
git checkout devel
git cherry next
...そして、次のような出力が表示されます。
+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9
で始まるコミットは、まだ選択していない+
ものになります。この場合、私はこれまでに1つのコミットのみを厳選しました。コマンドにパラメータを追加すると、各コミットの件名行も出力されるようになります。next
-v
git cherry
git checkout devel
、あなたはただすることができますgit cherry next devel
。
-v
」?なしのチェリー-v
は、ls
なしのようなもの-la
です。; -J
cherry
、同等のコミットをマークまたは除外する方法を知らないでしょうか? cherry
配管コマンドのように見えますが、(多くの場合)多くのオプションを提供していません。私が現在真ん中にいるものについては、git cherry
偽陽性を与えますが、@ sehe git log --cherry-pick
は以前に選択/リベースされたコミットを正しく除外します。
また、あなたは使うことができます
git log --left-right --graph --cherry-pick --oneline devel...next
ブランチ間で共有されていない実際の異なるコミットの一覧を取得する。
手術の言葉は --cherry-pick
--cherry-pick
コミットのセットが対称的な違いで制限されている場合は、「反対側」で別のコミットと同じ変更を導入するコミットを省略します。たとえば、AとBの2つのブランチがある場合、それらの片側だけですべてのコミットをリストする通常の方法は、そのオプションの説明の上記の例のように、--left-rightを使用することです。ただし、他のブランチからチェリーピックされたコミットを示しています(たとえば、「3rd on b」はブランチAからチェリーピックされている可能性があります)。このオプションを使用すると、そのようなコミットのペアは出力から除外されます。
更新コメントで述べたように、最近のバージョンのgitが追加されました--cherry-mark
:
--cherry-mark
--cherry-pick(下記参照)に似ていますが、同等のコミットを省略せずに=でマークし、同等でないコミットを+でマークします。
あなたはgit logのサブセットを試すことができます:
git log --oneline devel ^next
--left-only
た方がよかったでしょう)。ただし、--no-merges
マージコミットを省略して追加することで、これを少し改善できます(たとえば、機能またはホットフィックスブランチがdevelとnextの両方に(個別に)マージされた場合)。もちろん、厳密に言うと、マージでの競合解決により他の違いが生じる可能性がありますが、通常はそうではありません。この--no-merges
オプションは、他の回答にも有効に適用できます。
リリースブランチに統合されていないコミットのリストを取得するには(次)、次のコマンドを使用できます。
git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt
詳細については、git-rev-listを確認してください。
next...devel
@Mark Longairは彼の答えでここに釘付けにしましたが、もう少し洞察を加えたいと思います。
私の状況:30回のコミットで
ビッグを作成し、feature_branch
GitHubでプルリクエスト(PR)を開いてにマージしましたmaster
。ブランチmaster
は私の下でトンを変え、私のfeature_branch
持っていなかった200のコミットを受け取りました。解決の競合に私がやったgit checkout feature_branch
とgit merge master
マージするmaster
私にの変更をfeature_branch
。私は最新のマスターmerge
ではなく選択したrebase
ので、潜在的に30回ではなく1回だけ競合を解決する必要があります(コミットごとに1回)。最初に30のコミットを1に押しつぶし、次に最新のものにリベースしたくありませんでしたmaster
これは、PRのGitHubレビューコメント履歴を消去する可能性があるためです。そこで、masterを機能ブランチにマージし、競合を1回解決しました。すべてが順調でした。しかし、私のPRは大きすぎて同僚がレビューするには大きすぎました。分割する必要がありました。私は30のコミットとOH NO!彼らはどこにいる?それらはすべて混在にしているmaster
私がマージされているため、今の200回の最近のコミットmaster
私にfeature_branch
!私は何をしますか?
git cherry
git cherry-pick
個々のコミットを試したい場合の使用法:git cherry
救助に(一種)!
あるすべてのコミットを参照するにfeature_branch
はありませんでmaster
、私が行うことができますが。
git checkout feature_branch
git cherry master
または、feature_branch
次のgit cherry [upstream_branch] [feature_branch]
ようにすることで、最初にオンになっていることを確認せずに、任意のブランチからのコミットをチェックできます。繰り返しますが、これは、どのコミットfeature_branch
が含まれているのかupstream_branch
(master
この場合は含まれていないのか)を確認します。
git cherry master feature_branch
追加する-v
と、コミットメッセージの件名も表示されます。
git cherry -v master
「word count」「-lines」(wc -l
)へのパイプは、コミットの数をカウントします。
git cherry master | wc -l
この数をGithHub PRに表示されるコミット数と比較して、実際に機能していることをよりよく理解できますgit cherry
。gitハッシュを1つずつ比較して、git cherry
とGitHubが一致することを確認することもできます。注git cherry
あなたがマージされた任意のマージコミットはカウントされませんmaster
にしfeature_branch
ますが、GitHubのWILL。したがって、カウントにわずかな不一致が見られる場合は、GitHub PRコミットページで「マージ」という単語を検索すると、おそらくそれがに表示されていない原因であることがわかりますgit cherry
。例:「Merge branch 'master' into feature_branch」というタイトルのコミットはGitHub PRに表示されますが、を実行すると表示されませんgit cherry master feature_branch
。これで問題ありません。
だから、今私はこの差分を分割するために新しい機能ブランチにチェリーピックしたいかもしれないdiffを見つける手段を持っています:git cherry master feature_branch
ローカルで使うか、GitHub PRでコミットを見ることができます。
ただし、私の大きな差分を分割する別の方法は、30のコミットすべてを1つにまとめ、新しい機能ブランチにパッチを適用し、パッチコミットをソフトリセットしてgit gui
から、ピースをファイルごとに、チャンクごとに追加するか、または1行ずつ。サブ機能を1つ取得したら、追加した内容をコミットし、新しいブランチをチェックアウトし、さらに追加し、コミットし、新しいブランチをチェックアウトするなどして、大きな機能をいくつかのサブ機能に分割します。 。問題は、私の30回のコミットが原因私に他の人から他の200のコミットと混在していることであるgit merge master
私にfeature_branch
、私は再注文に230回のコミットを取捨選択し、私の30回のコミットをつぶす必要があるだろうと、そうリベースは、したがって、非現実的です。
回避策は、30のコミットすべての「スカッシュ相当」を含むパッチファイルを取得し、それをmaster
(新しいサブ機能ブランチ)の新しいフォークにパッチして、そこから次のように作業することです。
git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch
これで、30コミットパッチがすべてローカルに適用されましたが、ステージングもコミットもされていません。
git gui
ファイル、チャンク、および/または行を追加し、大きなPRまたは「差分」を分割するために使用します。がない場合はgit gui
、Ubuntuに簡単にインストールできますsudo apt install git-gui
。
git gui
(git GUIプログラムで右クリックして)ファイル、チャンク、および/または行を実行して追加を開始し、上記のように30のコミット機能ブランチをサブブランチに分割し、繰り返し追加、コミット、フォークすることができます。すべての変更がサブ機能ブランチに追加され、30コミット機能が3つまたは4つのサブ機能に正常に分割されるまで、新しい機能ブランチとこのサイクルを繰り返します。ここで、これらのサブ機能ごとに個別のPRを開くことができます。これにより、私のチームが簡単に確認できるようになります。