मुझे कैसे पता चल सकता है कि एक शाखा को पहले ही मास्टर में मिला दिया गया है?


1139

मेरे पास कई शाखाओं के साथ गिट रिपॉजिटरी है।

मुझे कैसे पता चल सकता है कि कौन सी शाखाएं पहले से ही मास्टर शाखा में विलय हो गई हैं?

जवाबों:


1792

git branch --merged masterसूचियाँ मास्टर में विलीन हो जाती हैं

git branch --mergedसूचियाँ HEAD में विलीन हो गईं (अर्थात वर्तमान शाखा का सिरा)

git branch --no-merged उन शाखाओं को सूचीबद्ध करता है जिनका विलय नहीं किया गया है

डिफ़ॉल्ट रूप से यह केवल स्थानीय शाखाओं पर लागू होता है। -aध्वज को स्थानीय और रिमोट शाखाओं, और दिखाएगा -rझंडा शो केवल दूरस्थ शाखाओं।


2
बस एक साइड नोट, जब मैंने यह देखने की कोशिश की कि क्या किसी दूरस्थ शाखा का विलय हो गया है तो मैंने पहली बार एक स्थानीय ट्रैकिंग शाखा की स्थापना की, स्थिति की पहचान की git branch --mergedऔर फिर स्थानीय और दूरस्थ शाखाओं को हटा दिया।
केनेथ कल्मर

83
जाहिरा तौर पर, git branch -a --merged/no-mergedइस प्रक्रिया में एक स्थानीय ट्रैकिंग शाखा बनाए बिना भी काम करता है।
फ्रेसकोमा जू

70
या सिर्फ git branch -r --merged/--no-mergedदूरस्थ शाखाओं को खोजने के लिए।
असफंद काजी

5
अनमैरिड शाखाओं को हटाने का कोई तरीका जो वास्तव में रिबासिंग के बाद विलय कर दिया गया था?
3

9
ध्यान दें कि --merged/--no-mergedइसके बाद एक वैकल्पिक प्रतिबद्ध तर्क लेता है। कम से कम मेरे संस्करण के git (1.9.1) में, -aया -rझंडे को जोड़ने के बाद यह मुझे एक घातक त्रुटि देता है। -aया -r इससे पहले जोड़ें --(no-)merged
जोनाथन गॉविच 17

113

आप git merge-baseदो शाखाओं के बीच नवीनतम आम प्रतिबद्धताओं को खोजने के लिए कमांड का उपयोग कर सकते हैं । यदि वह प्रतिबद्ध आपकी शाखा प्रमुख के समान है, तो शाखा पूरी तरह से विलय कर दी गई है।

ध्यान दें कि git branch -d बात इस तरह की पहले से ही करता है, क्योंकि यह एक शाखा है कि नष्ट करने के लिए मना कर देगा नहीं किया गया है पहले से ही पूरी तरह से विलय कर दिया गया।


3
@ हरि का उत्तर इस पर अधिक विवरण में है कि इसका उपयोग कैसे किया जाए।
मुहम्मद

हम इसे स्वचालित रूप से / प्रोग्रामेटिक रूप से कैसे कर सकते हैं?
अलेक्जेंडर मिल्स

1
"पहले से ही पूरी तरह से विलय नहीं हुआ है ..." पूरी तरह से किस शाखा में विलय हो गया है?
सिकंदर मिल्स

@AlexanderMills: अपनी वर्तमान शाखा में।
ग्रेग ह्यूजिल

2
@AlexanderMills: git branch -dउस शाखा को हटाने से इंकार कर देगा जिसे वर्तमान शाखा में विलय नहीं किया गया है। वर्तमान शाखा को हटाना नहीं ।
ग्रेग हेवगिल

27

एक ग्राफिकल इंटरफ़ेस समाधान भी है। बस टाइप करो

gitk --all

एक नई एप्लिकेशन विंडो आपके पूरे रेपो के चित्रमय प्रतिनिधित्व के साथ संकेत देगी, जहां यह महसूस करना बहुत आसान है कि क्या पहले से ही एक शाखा को बदला गया था या नहीं


17
जो स्पष्ट होना चाहिए, उस एप्लिकेशन की स्थापना की आवश्यकता है जो gitक्लाइंट का हिस्सा नहीं है । उबंटू पर, apt-get install gitk
12

MacOS पर, अगर आपके पास Homebrew स्थापित है, हो सकता है brew install git-gui, प्राप्त करने के लिए gitkकमांडलाइन पर।
कार्यक्रम 247365

24

मैं निम्नलिखित बैश फ़ंक्शन का उपयोग कर रहा हूं जैसे: git-is-merged develop feature/new-feature

git-is-merged () {
  merge_destination_branch=$1
  merge_source_branch=$2

  merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
  merge_source_current_commit=$(git rev-parse $merge_source_branch)
  if [[ $merge_base = $merge_source_current_commit ]]
  then
    echo $merge_source_branch is merged into $merge_destination_branch
    return 0
  else
    echo $merge_source_branch is not merged into $merge_destination_branch
    return 1
  fi
}

3
यह वास्तव में काम नहीं करता है। यदि स्रोत शाखा को पहले से ही गंतव्य शाखा में विलय कर दिया गया है, और फिर गंतव्य शाखा को कुछ और कमिट मिलता है, तो यह अब काम नहीं करता है लेकिन मुझे पता नहीं क्यों
अलेक्जेंडर मिल्स


18

का उपयोग करें git merge-base <commit> <commit>

यह कमांड दो कमिट के बीच सबसे अच्छा सामान्य पूर्वज (एस) पाता है। और अगर सामान्य पूर्वज एक "शाखा" के अंतिम प्रतिबद्ध के समान है, तो हम सुरक्षित रूप से मान सकते हैं कि "शाखा" को पहले ही मास्टर में मिला दिया गया है।

यहाँ कदम हैं

  1. मास्टर शाखा पर अंतिम प्रतिबद्ध हैश का पता लगाएं
  2. "शाखा" पर अंतिम प्रतिबद्ध हैश खोजें
  3. रन कमांड git merge-base <commit-hash-step1> <commit-hash-step2>
  4. यदि चरण 3 का आउटपुट चरण 2 के आउटपुट के समान है, तो "शाखा" को पहले ही मास्टर में विलय कर दिया गया है।

Git मर्ज-बेस https://git-scm.com/docs/git-merge-base पर अधिक जानकारी ।


2
मुझे लगता है कि यह केवल आपको बताएगा कि क्या टिप्स मर्ज किए गए हैं। उदाहरण के लिए, यह आपको नहीं बताएगा कि क्या masterविलय किया गया था branch, और फिर 4 और कमिट्स को इसमें जोड़ा गया था branch
mkobit

क्यों नहीं git log -1 $(git merge-base base-branch feature-branch)और यदि आप feature-branchआउटपुट में देखते हैं , तो आप जानते हैं कि वे विलय कर रहे हैं?
कार्ल जी

12

सुदूर शाखाओं की सफाई के विषय पर

git branch -r | xargs -t -n 1 git branch -r --contains

इसके बाद प्रत्येक दूरस्थ शाखा को सूचीबद्ध किया जाता है जिसके बाद दूरस्थ शाखाएँ उनके नवीनतम SHAs हैं।

यह पता लगाने के लिए उपयोगी है कि कौन सी दूरस्थ शाखाओं को विलय कर दिया गया है लेकिन हटाया नहीं गया है, और जिसे विलय नहीं किया गया है और इस प्रकार क्षय हो रहा है।

अगर आप 'tig' (इसके gitk जैसे टर्मिनल पर आधारित) का उपयोग कर रहे हैं तो आप कर सकते हैं

tig origin/feature/someones-decaying-feature

चेकआउट को चेक किए बिना किसी शाखा के प्रतिबद्ध इतिहास को देखने के लिए


3
अच्छा किया उस आदमी ने! एक बार जब आप वास्तव में प्रदर्शित हो रहे होते हैं, तो आपके सिर के बहुत उपयोगी होने पर! GitHub ऐप को बिना किसी पदानुक्रम वाली वर्णमाला सूची के बजाय, अपनी शाखाओं के दृश्य प्रदर्शन में शामिल करना होगा!
सीएमश

12

यह सत्यापित करने के लिए कि आपको इन आदेशों का उपयोग किस शाखा में करना चाहिए?

  • git branch <flag[-r/-a/none]> --merged master सभी शाखाओं की सूची मास्टर में विलय कर दी गई।
  • git branch <flag[-r/-a/none]> --merged master | wc -l सभी शाखाओं की संख्या मास्टर में विलीन हो गई।

झंडे हैं:

  • -aझंडा - (सभी) दूरस्थ और स्थानीय शाखाओं को दिखाते हुए
  • -rफ्लैग - (दूरस्थ) केवल दूरस्थ शाखाएं दिखा रहा है
  • <emptyFlag>- केवल स्थानीय शाखाएँ दिखाना

उदाहरण के लिए: git branch -r --merged master आपको मास्टर में विलय किए गए सभी दूरस्थ रिपॉजिटरी दिखाएंगे।


5

यहां मेरी तकनीकें हैं जब मुझे यह पता लगाने की आवश्यकता होती है कि क्या एक शाखा को विलय कर दिया गया है, भले ही यह हमारी मुख्य शाखा के साथ अद्यतित होने के लिए छूट दी गई हो, जो कि सुविधा शाखाओं के लिए एक सामान्य परिदृश्य है।

इन दृष्टिकोणों में से कोई भी मूर्ख सबूत नहीं है, लेकिन मैंने उन्हें कई बार उपयोगी पाया है।

1 सभी शाखाओं के लिए लॉग दिखाएं

Gitk या TortoiseGit जैसे किसी दृश्य उपकरण का उपयोग करना, या बस git लॉग --all के साथ, मुख्य शाखा में सभी मर्ज को देखने के लिए इतिहास के माध्यम से जाना। आपको यह पता लगाने में सक्षम होना चाहिए कि इस विशेष सुविधा शाखा का विलय किया गया है या नहीं।

2 हमेशा एक सुविधा शाखा में विलय करते समय दूरस्थ शाखा को हटा दें

यदि आपके पास एक सुविधा शाखा में विलय होने पर स्थानीय और दूरस्थ शाखा दोनों को हमेशा हटाने की अच्छी आदत है, तो आप बस अपने अन्य कंप्यूटर पर अपडेट और प्रून रीमोट कर सकते हैं और सुविधा शाखाएं गायब हो जाएंगी।

ऐसा करने में याद रखने में मदद करने के लिए, मैं अपनी सुविधा शाखाओं को स्थानीय रूप से बनाने और मर्ज करने के लिए पहले से ही git flow एक्सटेंशन (AVH संस्करण) का उपयोग कर रहा हूं , इसलिए मैंने यह पूछने के लिए निम्न git फ़्लो हुक को जोड़ा कि क्या मैं रिमोट ब्रांच को ऑटो-रिमूव करना चाहता हूं।

उदाहरण बनाएँ / सुविधा शाखा को समाप्त करें

554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'

Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'

Now, start committing on your feature. When done, use:

     git flow feature finish tmp

555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.

[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.

Deleted branch feature/tmp (was 02a3356).

Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'

556 Andreas:ScDesktop (develop)$

.git / हुक / उत्तर प्रवाह सुविधा खत्म

NAME=$1
ORIGIN=$2
BRANCH=$3

# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty

while true; do
  read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'    
  fi
  case $yn in
      [Yy] ) 
        echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
        git push $2 :$3; 
        break;;
      [Nn] ) 
        echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
        break;;
      * ) echo "Please answer y or n for yes or no.";;
  esac
done

# Stop reading user input (close STDIN)
exec <&-
exit 0

3 प्रतिबद्ध संदेश द्वारा खोजें

यदि आप हमेशा दूरस्थ शाखा को नहीं निकालते हैं, तो आप अभी भी इसी तरह के कमिट की खोज कर सकते हैं कि शाखा का विलय हुआ है या नहीं। यहाँ नुकसान यह है कि यदि रिमोट ब्रांच को अस्वीकार्य किया गया है, जैसे कि कमिट करना या कमिट संदेश बदलना।

  • सभी को प्राप्त करें
  • सुविधा शाखा पर अंतिम प्रतिबद्ध का संदेश प्राप्त करें
  • देखें कि क्या एक ही संदेश के साथ एक प्रतिबद्ध मास्टर शाखा पर पाया जा सकता है

उदाहरण मास्टर शाखा पर आदेश:

gru                   
gls origin/feature/foo
glf "my message"

मेरे बैश में .profile config

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}

@anjdeas - चरण 1 - आप कैसे जानते हैं कि किन शाखाओं को मुख्य रूप से मिला दिया गया है। मैं लॉग और गुई औजारों को देख रहा हूं - और कहीं भी नहीं मिल सकता है जहां यह स्पष्ट रूप से दिखाता है ???
हफ

@ यह प्रयास करें:git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
कोणीय १५'१५

@ हॉफ इन कछुआगेट, यदि आप मुख्य शाखा पर हैं, तो इसे सभी मर्जों को मुख्य रूप से दिखाना चाहिए।
कोणीयसेन

धन्यवाद - लेकिन मुझे कैसे पता चलेगा कि मर्ज क्या है? मैं मान रहा हूं कि वे सभी कमिट हैं - क्या यह सही है?
हफ

@ TheHuff: आपको नेत्रहीन दो धाराओं / रास्तों को एक साथ एक ही कमिट "डाउनस्ट्रीम" (लॉग व्यू में उच्चतर) में मिलाना चाहिए। वह कमिट एक मर्ज कमिट है। इसके अलावा, git logआप --mergesकेवल मर्ज कमिट दिखाने के लिए जोड़ सकते हैं । stackoverflow.com/a/25986615/134761
कोणीय १६'१५

4

यहाँ एक छोटा सा लाइनर है जो आपको बताएगा कि आपकी वर्तमान शाखा सम्मिलित है या दूरस्थ मूल / मास्टर शाखा के डेटा से बाहर है:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

मुझे यह सवाल तब आया जब मैं एक फीचर ब्रांच में काम कर रहा था और बार-बार यह सुनिश्चित करना चाहता था कि मेरे पास सबसे अलग काम मेरी अपनी अलग वर्किंग ब्रांच में शामिल हो।

इस परीक्षण को सामान्य बनाने के लिए मैंने निम्नलिखित उपनाम अपने ~ / .gitconfig में जोड़ दिए हैं:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

तब मैं कॉल कर सकता हूं:

$ git current origin/master

जाँच करने के लिए कि क्या मैं चालू हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.