Відповіді:
git branch --merged master
перелічує гілки, об'єднані в головний
git branch --merged
перелічує гілки, об'єднані в HEAD (тобто кінчик поточної гілки)
git branch --no-merged
перелічує гілки, які не були об'єднані
За замовчуванням це стосується лише місцевих відділень. На -a
прапорі будуть відображатися як локальні, так і віддалені гілки, а -r
прапор - лише віддалені гілки.
git branch -a --merged/no-merged
це також працює, не створюючи локальну гілку відстеження в процесі.
git branch -r --merged/--no-merged
знайти лише віддалені гілки.
--merged/--no-merged
після нього береться необов'язковий аргумент. Принаймні, у моїй версії git (1.9.1), додавання -a
або -r
прапор після нього дає мені фатальну помилку. Додайте -a
або -r
раніше --(no-)merged
.
Ви можете скористатися git merge-base
командою, щоб знайти останню спільну послідовність між двома гілками. Якщо ця фіксація збігається з головою вашого відділення, то гілка була повністю об'єднана.
Зауважте, що
git branch -d
це робиться вже тому, що він відмовиться видалити гілку, яка вже не була повністю об'єднана.
git branch -d
відмовиться видалити гілку, яка не була об'єднана в поточну гілку. Не видаляється поточна гілка.
Також є рішення графічного інтерфейсу. Просто введіть
gitk --all
У новому вікні програми з’явиться графічне зображення всього вашого репо, де дуже легко зрозуміти, чи була філія вже об’єднана чи ні
git
клієнта. В Ubuntu apt-get install gitk
.
brew install git-gui
потрапити gitk
на командний рядок.
Я використовую таку функцію 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
}
Використовуйте git merge-base <commit> <commit>
.
Ця команда знаходить найкращі спільні предки між двома комітами. І якщо спільний пращур тотожний останньому комітету "гілки", то можна сміливо припустити, що "гілка" вже була об'єднана в господаря.
Ось етапи
git merge-base <commit-hash-step1> <commit-hash-step2>
. Більше інформації про git merge-base https://git-scm.com/docs/git-merge-base .
master
було об’єднано branch
, а потім додано ще 4 коміти branch
.
git log -1 $(git merge-base base-branch feature-branch)
і ні, якщо ви бачите feature-branch
на виході, то ви знаєте, що вони злиті?
На тему прибирання віддалених гілок
git branch -r | xargs -t -n 1 git branch -r --contains
Тут перераховано кожну віддалену гілку, за якою віддалені гілки знаходяться в останніх SHA.
Це корисно для визначення того, які віддалені гілки були об'єднані, але не видалені, а які не були об'єднані і, таким чином, занепадають.
Якщо ви використовуєте 'tig' (це як gitk, але заснований на терміналі), ви можете
tig origin/feature/someones-decaying-feature
щоб побачити історію філій філій, не вимагаючи прийом
Щоб перевірити, які гілки об'єднані в master, слід скористатися цими командами:
git branch <flag[-r/-a/none]> --merged master
список усіх гілок, об'єднаних у головний.git branch <flag[-r/-a/none]> --merged master | wc -l
підраховувати кількість усіх гілок, об'єднаних у головний.Прапори:
-a
прапор - (усі) із зображенням віддалених та місцевих гілок-r
flag - (віддалений), що показує лише віддалені гілки<emptyFlag>
- показ лише місцевих гілокнаприклад: git branch -r --merged master
покаже всі віддалені сховища, об'єднані в майстер.
Ось мої методи, коли мені потрібно з’ясувати, чи була галузь об'єднана, навіть якщо вона, можливо, була перезавантажена, щоб бути в курсі нашої основної гілки, що є загальним сценарієм для функціональних гілок.
Жоден із цих підходів не є дурним доказом, але я багато разів вважав їх корисними.
Використовуючи такий наочний інструмент, як gitk або TortoiseGit, або просто git log with --all, пройдіть історію, щоб побачити всі злиття до основної гілки. Ви можете мати змогу помітити, чи було об'єднано цю галузь функції чи ні.
Якщо у вас є звичка завжди видаляти і локальну, і віддалену гілку, коли ви об’єднуєтесь у гілку функцій, тоді ви можете просто оновити та підрізати віддалені на іншому комп'ютері, і гілки функцій зникнуть.
Щоб запам'ятати це, я вже використовую розширення потоку 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
Якщо ви не завжди видаляєте віддалену гілку, ви все одно можете шукати подібні комісії, щоб визначити, чи було гілка об'єднана чи ні. Проблема тут полягає в тому випадку, якщо віддалене відділення було перетворене на невпізнанний характер, наприклад, скасування комісій або зміна повідомлень про фіксацію.
Приклад команд на головній гілці:
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"
}
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]"
git log
ви можете додавати --merges
до показу лише об'єднання об'єднань. stackoverflow.com/a/25986615/134761
Ось невеликий однолінійний вклад, який повідомить вам, чи ваша поточна філія містить чи немає даних із віддаленого походження / основної гілки:
$ 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
щоб перевірити, чи я поточний.
git branch --merged
і потім видалив локальну та віддалену гілки.