2017-08-30 111 views
0

我怎樣才能安全地刪除我的本地特性分支的副本時,它的重訂到原點/主,而不是合併。我知道我可以git branch -D,但我想避免盲目地做,讓git告訴我哪些分支可以安全移除。任何方式安全地刪除一個功能分支後重新綁定到另一個?

例如: - 我有特性分支my-feature,我把它推到origin/my-feature,做PR,並origin/my-feature被重訂到origin/master,然後刪除。當地的my-feature仍然存在。*是否有任何方法可以檢測到origin/master中有效的變化?

git diff origin/master...my-feature不起作用,因爲origin/master共同的祖先並沒有改變。檢查git diff origin/master..my-feature是空的工作,但只有在重新綁定後。如果其他更改在我的頂部進行重新設置,則會顯示這些更改。

有沒有辦法刪除本地分支,其遠程版本已被刪除? (但是不是從未擁有遠程版本的本地分支)。或者,如果我避免刪除origin/my-feature,那麼我是否可以在本地安全地刪除origin/my-featuremy-feature

*如果我不夠有紀律,我試圖永遠記得立即刪除我的本地分支遠程分支被刪除之後,但有時我忘記了。

+2

使用git櫻桃:

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" 

一點點其可讀性 –

回答

0

git cherry是完美的,從來不知道這一點。我做了一個別名,清理已合併到upstream/master所有分支:在這種情況下

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和merge」clicky按鈕時會發生什麼。這將複製的提交(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'的祖先,並C不是C'的祖先。 (令人煩惱的是,GitHub的「rebase and merge」clicky按鈕似乎將提交重新複製到新的哈希ID,即使在不應該有必要的情況下也可以這樣做,這可能會使作者和提交者分離,其中一個沒有直接訪問原始存儲庫,無論如何,結果是您的推拉請求分支的提示(例如C)不是目標分支的提示的祖先,例如master。)

檢查git diff origin/master..my-feature是否爲空作品,但僅在重新綁定後立即生效。

不僅如此,但DIFF一般只如果沒有額外的提交,即,如果整體圖形看起來就像空:

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

由於Andrew C comments,你可以使用git cherry,看看所有提交(在這裏,A-B-C)被複制。如果有人將這個腳本捆綁到一個腳本中可能會很好。

相關問題