最終ブランチ (他のコミットの親ではない) のみであるブランチのリストを取得するにはどうすればよいですか? つまり、コミット ツリー (最終ノード) のヒントであるブランチです。コマンドで --final または --tips のようなオプションを期待してgit branch
いましたが、--merged、--no-merged、および --contains オプションしかありませんでした。
4 に答える
すでにいくつかの有用な回答がありますが、求められているものを提供していません:リストまたはブランチ(私にとっては、コミットIDではなくブランチ名を意味します)。
先端ブランチ名のリストを取得する
{
echo "** Below is list of tip branches a.k.a. final nodes."
echo "** These aren't reachable from any other branches."
echo "** Removing them is potentially DANGEROUS: it would make some commit unreachable."
TIPS=$( git rev-list --branches --children | grep -v ' ' | sort )
{ while read branchname commitid message
do grep $commitid < <(echo $TIPS) -q && echo $branchname
done
} < <(git branch -v --no-abbrev | sed 's/\*//' )
echo "** end of list"
}
結果は次のようになります。
** Below is list of tip branches a.k.a. final nodes.
** These aren't reachable from any other branches.
** Removing them is potentially DANGEROUS: it would make some commit unreachable.
feature-workingonit
dev
** end of list
非ヒントブランチ名のリストの取得
物事を整理するとき、非先端ブランチを見たいと思うかもしれません。それらのリストを取得する方法を次に示します。唯一の変化は&&
になって||
います。
{
echo "** Below is list of non-tip branches a.k.a. inner nodes."
echo "** These are reachable from other branches."
echo "** If you remove them, all commits would stay reachable, but be careful anyway."
TIPS=$( git rev-list --branches --children | grep -v ' ' | sort )
{ while read branchname commitid message
do grep $commitid < <(echo $TIPS) -q || echo $branchname
done
} < <(git branch -v --no-abbrev | sed 's/\*//' )
echo "** end of list"
}
結果は次のようになります。
** Below is list of non-tip branches a.k.a. inner nodes.
** These are reachable from other branches.
** If you remove them, all commits would stay reachable, but be careful anyway.
feature-alreadymerged
master
** end of list
コミット ID とメッセージを含む非ヒント ブランチ名のリストを取得する
たとえば、次のように変更することで、必要に応じて装飾できます。
echo $branchname
の中へ
echo -e "$branchname\t$commitid\t$message"
結果は次のようになります。
** Below is list of non-tip branches a.k.a. inner nodes.
** These are reachable from other branches.
** If you remove them, all commits would stay reachable, but be careful anyway.
feature-alreadymerged 426ac5186841876163970afdcc5774d46641abc4 Cool feature foo, ref task #1234
master 39148238924687239872eea425c0e837fafdcfd9 Some commit
** end of list
次に、お気に入りのツールでそれらのブランチを確認して、それらを削除する意味があるかどうかを確認できます。
git show -s --oneline --decorate $(
git show-branch --independent -a
)
また
git show -s --format=%d $(
git show-branch --independent -a
)
おそらくsed
味わうことでしょう。たとえば、すべてのrefnameを1行に1つずつ分割し、グループ化の句読点を削除するには
git show -s --format=%d $(git show-branch --independent -a) \
| sed 's/,/\n/g; s/[ ()]//g'
すべての参照のリストを取得すると、別の参照の親ではないすべての参照をリストできます。
refs=`git show-ref -s`
git log --oneline --decorate $refs --not `echo "$refs" | sed 's/$/^/'`
これは、すべての親コミットを除外することで機能します。
ブランチは、作業ディレクトリでアクティブなときに新しいコミットが追加されたときに移動する単なるラベルであるため、すべてのブランチは「定義上」ツリーのリーフノードです。
しかし、他のブランチのリーフコミットと共通の祖先を共有しないブランチを求めていると思います。あなたが望むようなものですが、そうではC
ありE
ませんA
、B
またはD
以下にあります。
-A-o-B-o-C
\
D-o-E
その場合、別のブランチのリーフコミットである共通の祖先を共有しないすべてのブランチのリストを見つけることができます。たとえば、の現在のリーフコミットの共通の祖先を共有しD
ます。E
D
これはスクリプトで実行できる可能性がありますが、すべてのブランチで実行できるgitコマンドはわかりません。しかし、gitは過去に、その(時にはあいまいな)コマンドパラメーターの組み合わせで何ができるかについて私を驚かせました。
私はあなたのコメントの後でもう少し考えました、そして私はあなたの質問がコマンドとして可能にならない(またはおそらく有用ではない)理由をよりよく理解していると思います。これは、のようなコマンドgit merge --squash <branch>
がマージコミットを作成しないためです。作成されたコミットは、別の通常のコミットであり、別のブランチからのものであることを示すものは何も含まれていません。
たとえば、次のように始まります。
-A-o-B-o-C
\
D-o-E
また、コマンドでwithHEAD
を使用すると、インデックスに含まれるすべての変更をコミットできるようになります。コミットすると、ツリーは次のようになります。C
git merge --squash E
E
-A-o-B-o-o-C <== notice branch `C` has moved forward one commit
\
D-o-E
現在のコミットには、それがどこから来たのかは言うまでもなく、 C
からのすべての変更が含まれています。今は必要ないかもしれませんが、それを伝えるにはプロジェクトの知識しかありません。D-o-E
D-o-E
あなたがやりたいことは手動のプロセスになることを理解した上で。ブランチを削除できるかどうかを判断するのに役立つコマンドをいくつか考えました。
このgit log
コマンドは、装飾されたコミット(ブランチ、タグ、およびHEAD)のみのグラフを生成します。
git log --all --graph --oneline --simplify-by-decoration --decorate
これを実行すると、「エンドポイント」ブランチがどこにあるかをすばやく確認できるビジュアルが得られます。>> <filename>.txt
ヒント:鉛筆でマークアップできるテキストファイルにグラフをダンプするために追加します。
また、保持する「エンドポイント」ブランチを特定したら、次のコマンドを実行して、からのブランチの祖先リストを表示し<branch>
ます。これは、(マージコミットを使用して)完全にマージされたブランチを一覧表示してい<branch>
ます。
git branch --merged <branch>
これはあなたが望むものとは正確に一致しないかもしれませんが、上で説明したように、それが可能になるとは思いません。うまくいけば、これらのコマンドが役立つでしょう。