2017-08-30 13 views
0

安全にフィーチャーブランチのローカルコピーを、マージされずにオリジン/マスターにリベースしたときに削除できます。私はgit branch -Dを知ることができると知っていますが、私はそのことを盲目的に避けて、どのブランチを削除するのが安全か教えてください。フィーチャブランチを別のフィーチャブランチにリベースした後、フィーチャブランチを安全に削除する方法はありますか?

例えば:私はorigin/my-featureにそれをプッシュし、機能ブランチmy-featureを持って、PRを行い、origin/my-featureorigin/master上にリベースし、その後削除されます。ローカルmy-featureはまだ残っています。*変更が有効にorigin/masterに含まれていることを検出する方法はありますか? origin/masterの共通祖先が変更されていないため、

git diff origin/master...my-featureは機能しません。 git diff origin/master..my-featureが空であることを確認することは動作しますが、リベースの直後にのみ実行されます。他の変更が私の上でリベースされた場合、これらの変更が表示されます。

リモートバージョンが削除されているローカルブランチを削除する方法はありますか? (しかし、ではなく、リモートバージョンを持たないローカルブランチ)。または、origin/my-featureの削除を避けると、origin/my-featuremy-featureの両方をローカルに削除して安全に削除できますか?

*十分に訓練されていれば、リモートブランチが削除された直後に自分のローカルブランチを削除することを忘れないでください。

+2

使用gitの桜を –

答えて

0

git cherryは完全であり、それについては決して知らなかった。私はupstream/masterにマージされているすべてのブランチをクリーンアップするためにエイリアスを作った:

branch-cleanup = "!f(){ for b in $(git for-each-ref refs/heads --format=\"%(refname:short)\"); do if [[ ! $(git cherry -v upstream/master $b | grep \"^+\") ]]; then git branch -D $b; fi; done };f" 

もう少し読み出し可能に:このような状況で

for b in $(git for-each-ref refs/heads --format="%(refname:short)"); do # Go through each branch 
    # git cherry prefixes each commit with "+" if it's not included and "-" if it is, so check if there are no "+" lines: 
    if [[ ! $(git cherry upstream/master $b | grep "^+") ]]; then 
    git branch -D $b 
    fi 
done 
0

最初に背景情報を挿入してみましょう。誰かがGitHubの "rebase and merge"ボタンを使うとどうなるか話していると思います。このコピーは、ターゲットの枝の先端に追加コミットの新しいセットに(S)コミット:

...--o--o--*--o <-- master 
      \ 
      A--B--C <-- pullrequested 

次のようになります。

...--o--o--*--o--A'--B'--C' <-- master 
      \ 
      A--B--C <-- pullrequested 

これはgit branch --mergedは役に立たないことを意味します。それはかどうかをテストしますコミットCはコミットC'の祖先であり、CC'の祖先ではありません。

(いいえ、GitHubの "rebase and merge"のclickyボタンは、必要ではない場合でもコミットを新しいハッシュIDに再コピーしているようです。元のリポジトリに直接アクセスできない場合は、Cなどのプルリクエストブランチの先端が、masterのようにターゲットブランチの先祖ではありません。

git diff origin/master..my-featureが空であることを確認しますが、リベースの直後にのみ有効です。

それだけでなく、diffは余分なコミットがなかった場合、全体のグラフのように見える場合、すなわち、一般的にのみ空である:Andrew C commentsとして

...--o--o--*--A'--B'--C' <-- master 
      \ 
      A--B--C <-- pullrequested 

、あなたがどうかを確認するためにgit cherryを使用することができますすべてのコミット(ここではA-B-C)がコピーされました。これをスクリプトにバンドルするといいかもしれません。

関連する問題