Як я можу дізнатися, чи гілка вже об'єднана в головний?


1139

У мене є сховище git з декількома гілками.

Як я можу знати, які гілки вже об’єднані в головну гілку?

Відповіді:


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це також працює, не створюючи локальну гілку відстеження в процесі.
fresskoma

70
Або просто git branch -r --merged/--no-mergedзнайти лише віддалені гілки.
Асфанд Казі

5
Будь-який спосіб видалити нерозміщені гілки, які були фактично об'єднані після повторного використання?
Ашфам

9
Зауважте, що --merged/--no-mergedпісля нього береться необов'язковий аргумент. Принаймні, у моїй версії git (1.9.1), додавання -aабо -rпрапор після нього дає мені фатальну помилку. Додайте -aабо -r раніше --(no-)merged .
Джонатан Гаврич

113

Ви можете скористатися git merge-baseкомандою, щоб знайти останню спільну послідовність між двома гілками. Якщо ця фіксація збігається з головою вашого відділення, то гілка була повністю об'єднана.

Зауважте, що git branch -dце робиться вже тому, що він відмовиться видалити гілку, яка вже не була повністю об'єднана.


3
У відповіді @ hari детальніше про те, як це використовувати.
Мухд

як ми можемо це зробити автоматично / програмно?
Олександр Міллс

1
"ще не повністю злився" ... повністю злився в яку галузь?
Олександр Міллс

@AlexanderMills: у вашу поточну галузь.
Грег Хьюгілл

2
@AlexanderMills: git branch -dвідмовиться видалити гілку, яка не була об'єднана в поточну гілку. Не видаляється поточна гілка.
Грег Хьюгілл

27

Також є рішення графічного інтерфейсу. Просто введіть

gitk --all

У новому вікні програми з’явиться графічне зображення всього вашого репо, де дуже легко зрозуміти, чи була філія вже об’єднана чи ні


17
Щоб було зрозуміло, потрібно встановити додаток, який не є частиною gitклієнта. В Ubuntu apt-get install gitk.
метаме

На macOS, якщо у вас встановлений Homebrew, було б brew install git-guiпотрапити gitkна командний рядок.
program247365

24

Я використовую таку функцію bash, як: 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. Знайдіть останній хеш-фікшш в master-галузі
  2. Знайти останній хеш фіксування на "гілці"
  3. Запустити команду git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Якщо вихід кроку 3 такий же, як вихід кроку 2, то "гілка" вже об'єднана в головний.

Більше інформації про git merge-base 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

Тут перераховано кожну віддалену гілку, за якою віддалені гілки знаходяться в останніх SHA.

Це корисно для визначення того, які віддалені гілки були об'єднані, але не видалені, а які не були об'єднані і, таким чином, занепадають.

Якщо ви використовуєте 'tig' (це як gitk, але заснований на терміналі), ви можете

tig origin/feature/someones-decaying-feature

щоб побачити історію філій філій, не вимагаючи прийом


3
Молодці, що чоловік! Дуже корисно, як тільки ви обернетесь головою навколо того, що насправді відображається! Додаток GitHub повинен включати це у візуальне відображення ваших гілок, а не в алфавітному списку без ієрархії!
CMash

12

Щоб перевірити, які гілки об'єднані в master, слід скористатися цими командами:

  • git branch <flag[-r/-a/none]> --merged master список усіх гілок, об'єднаних у головний.
  • git branch <flag[-r/-a/none]> --merged master | wc -l підраховувати кількість усіх гілок, об'єднаних у головний.

Прапори:

  • -aпрапор - (усі) із зображенням віддалених та місцевих гілок
  • -rflag - (віддалений), що показує лише віддалені гілки
  • <emptyFlag>- показ лише місцевих гілок

наприклад: git branch -r --merged master покаже всі віддалені сховища, об'єднані в майстер.


5

Ось мої методи, коли мені потрібно з’ясувати, чи була галузь об'єднана, навіть якщо вона, можливо, була перезавантажена, щоб бути в курсі нашої основної гілки, що є загальним сценарієм для функціональних гілок.

Жоден із цих підходів не є дурним доказом, але я багато разів вважав їх корисними.

1 Показати журнал для всіх гілок

Використовуючи такий наочний інструмент, як gitk або TortoiseGit, або просто git log with --all, пройдіть історію, щоб побачити всі злиття до основної гілки. Ви можете мати змогу помітити, чи було об'єднано цю галузь функції чи ні.

2 Завжди видаляйте віддалену гілку під час об'єднання в гілку функції

Якщо у вас є звичка завжди видаляти і локальну, і віддалену гілку, коли ви об’єднуєтесь у гілку функцій, тоді ви можете просто оновити та підрізати віддалені на іншому комп'ютері, і гілки функцій зникнуть.

Щоб запам'ятати це, я вже використовую розширення потоку git (видання 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"

У моєму файлі bash .profile

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

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

@anjdeas - крок 1 - як дізнатися, які гілки були об'єднані в основні. Я дивився на журнали та інструменти gui - і не можу знайти десь там, де це прямо показано ???
Хафф

@TheHuff Спробуйте це: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]"
angularsen

@TheHuff У TortoiseGit, якщо ви перебуваєте на головній гілці, вона повинна показувати всі злиття в основні.
angularsen

Дякую - але як я можу знати, що таке злиття? Я припускаю, що це все, що відбувається - це правильно?
Хафф

@TheHuff: Вам слід візуально побачити два потоки / контури комірок, що зливаються разом, в одну комісію "вниз за течією" (вище в режимі перегляду журналу). Ця фіксація - це об'єднання. Крім того, git logви можете додавати --mergesдо показу лише об'єднання об'єднань. stackoverflow.com/a/25986615/134761
angularsen

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.