Фишки IDEA. Часть 2
Продолжаем разговор о фишках IDEA по мотивам внутренних митапов Максилекта. В прошлый раз обсудили интерфейс, а сегодня речь пойдет об удобных средствах отладки и инструментах совместной работы с кодом.

Scratch-файлы
Если нужно быстро что-то проверить или рассчитать, используя зависимости рабочего проекта, можно воспользоваться временными скретч-файлами IDEA. У них масса возможностей — посылать SQL-запросы, создавать временные JSON и т.п. Сюда же можно временно импортировать части проекта. Подробности в документации.
Shelve
IDEA Shelve по аналогии с git stash позволяет не смешивать контексты при переключении с одной задачи на другую.
Предположим, вы занимались одной задачей, но вынуждены были быстро перескочить на другую. В этом случае мы откладываем контекст текущей задачей (через New changelist -> Shelve change, чистим контекст), работаем над другой задачей, потом возвращаем отложенный контекст с помощью Unshelve (с сохранением всех старых переходов) и продолжаем работать над первой задачей. Подробно работа с shelve описана в документации к IDEA.
Кстати, IDEA многое отправляет в shelve автоматически.
Если собственный механизм IDEA почему-то не нравится, можно переключиться на git stash.
Закачка на удаленный хост
Следующая рекомендация для тех, кто любит все выполнять только в IDEA.
Командой Tools -> Deployment -> Browse Remote host можно активировать закладку Remote host. Здесь можно подключиться к удаленному хосту и перетаскиванием загружать на сервер файлы прямо из IDEA.

Инструмент позволяет даже создавать файлы на сервере.
Интеграция с Docker

У IDEA есть интерфейс для работы с docker’ом. Здесь можно запускать контейнеры, просматривать логи, подключаться к контейнеру через терминал, расшаривать порты и т.д.
Changelist
Changelist — это набор изменений кода, которые еще не попали в коммит. Текущие изменения попадают в тот changelist, который сейчас активен. Так что переключение между листами позволяет разделить изменения, относящиеся к разным задачам (даже если один и тот же файл с кодом меняется в разных changelist-ах).
Изменения можно перетаскивать из одного changelist-а в другой. Также changelist-ы можно разбивать или объединять.
Подробное описание работы с Changelist есть в документации.
Альтернативный механизм коммитов (при использовании Git) — Git staging. Но оба механизма сразу использовать нельзя. При переключении на Staging area собственные списки изменений IDEA (changelist-ы) будут удалены.
Дерево коммитов
Это удобный инструмент, позволяющий вносить изменения в различные ветки проекта. Здесь отлично видно, кто что сделал, что с чем и куда было смержено.
В дереве коммитов есть поиск по commit message, имени задачи и хэшу коммита.

Дерево коммитов показывает несколько проектов, если ранее вы подключили их в одно окно. Чтобы не запутаться, можно показать дерево только для одного репозитория (для этого в Paths надо выбрать, какой репозиторий сейчас актуален).
Дерево открывает широкие возможности для манипулирования коммитами. В частности, оно позволяет:
- откатывать коммит (Undo commit), после чего он попадает обратно в Change list;
- перетаскивать ветку с одного коммита на другой;
- сравнивать два разных коммита между собой.
Breakpoints
В процессе отладки IDEA позволяет устанавливать Breakpoint-ы. В этот момент можно, например, выводить информацию в лог.
Можно установить Breakpoint с условием (conditional breakpoints). Это удобно, когда точка остановки оказывается в цикле и нет желания 100 раз нажимать F9, пока не доберешься до нужной итерации. Вместо этого в настройках можно поставить условие — точку остановки делать только, если верно выражение:

В настройках можно также указать, что точка остановка должна сработать только один раз. Или она должна быть неактивна, пока мы не достигли определенной точки (Disable until hitting the following breakpoint).

А если поджимает время выполнения запроса, можно выбрать Evaluate and log. Выполнение не остановится, но данные будут выводиться в консоль.
Останавливаясь на breakpoint, можно воспользоваться кнопкой Evaluate Expression (горячая клавиша Alt + Shift + 8). Она открывает окно, в котором можно исполнять код прямо в рантайме в точке остановки, где будут доступны все зарезервированные объекты. Так можно модифицировать запросы из кода, проверяя быстрые гипотезы.
Evaluate Expression экономит много времени — не нужно перезапускать тесты и т.п.
Тестирование в IDEA
У тестирования непосредственно через IDEA есть одно важное преимущество. Если запускать тесты сторонним инструментом, в консоли появится индекс запускаемого теста. Если же тесты запускать через IDEA, она выведет названия тестов.
IDEA позволяет настраивать запуск тестов — как запускать, сколько раз запускать, останавливать ли повторы после падения (или запускать, пока не упадут) и т.п. Таким образом можно отлавливать любые нестабильные тесты.
Профайлер IDEA
В IDEA предусмотрена интеграция с инструментами для профилирования. Из коробки доступны Async Profiler и Java Flight Recorder. Выбрать, какой будет использоваться в данный момент, можно через Preferences в секции Profiler.

Преимущество использования профайлера непосредственно из под IDEA в том, что при изучении результатов можно перемещаться не только по этой картинке, но и по исходному коду.
Кстати, у некоторых коммерческих профайлеров тоже есть интеграция с IDEA. Если установить соответствующие плагины, их можно будет выбрать из списка в Preferences.
Анализ stack trace
IDEA умеет анализировать сторонние стектрейсы. Для этого стектрейс надо вставить в окно Analyze stack trace, доступное из меню Analyze -> Stack trace (или Thread Dump). Если в этом окне отметить настройку Automatic detect, то IDEA будет выводить анализ автоматом, как только обнаружит стектрейс в буфере обмена. Просматривая результаты анализа, можно будет переходить на нужные строки кода.
Лайфхак для код-ревью
В ходе обсуждения возможностей IDEA всплыл интересный лайфхак, который помогает лучше ориентироваться в чужом коде во время ревью. Это не отдельный инструмент, но все же мы решили его здесь упомянуть.
Если изменений в коде много, для ревью удобно вытянуть всю ветку к себе, откатить все коммиты этого реквеста (Reset soft) до того, как он был влит в мастер, и выполнить git reset master. Все изменения в этом реквесте останутся в рабочей копии и будут отображаться, как будто они внесены собственными силами. Изменения попадут индекс Git и будут там подсвечиваться (сами они при этом не изменяются). Можно будет перемещаться по зависимостям.
В отличие от Git-> Compare with branch, который просто показывает список изменения, здесь будет более удобная навигация. Правда, можно случайно что-то поправить в коде, и новые изменения не будут выделяться на фоне остальных.
Безусловно, функционал IDEA намного шире. Но мы надеемся, что наша выжимка опыта будет вам полезна.
Статья написана по материалам внутренних митапов Максилект.
P.S. Мы публикуем наши статьи на нескольких площадках Рунета. Подписывайтесь на наши страницы в VK, FB, Instagram или Telegram-канал, чтобы узнавать обо всех наших публикациях и других новостях компании Maxilect.
git stash
Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.
- git stash
- Откладывание кода
- Применение отложенных изменений
- Откладывание неотслеживаемых или игнорируемых файлов
- Управление несколькими наборами отложенных изменений
- Просмотр различий между наборами отложенных изменений
- Частичное откладывание изменений
- Создание ветки из отложенных изменений
- Удаление отложенных изменений
- Принцип работы команды git stash
Откладывание кода
Команда git stash сохраняет неподтвержденные изменения (индексированные и неиндексированные) в отдельном хранилище, чтобы вы могли вернуться к ним позже. Затем происходит откат до исходной рабочей копии. Например:
$ git status
On branch main
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
$ git stash
Saved working directory and index state WIP on main: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage
$ git status
On branch main
nothing to commit, working tree clean
Связанные материалы
git branch
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Теперь вы можете вносить изменения, создавать новые коммиты, переключаться между ветками и выполнять другие операции Git. По необходимости отложенные изменения можно будет применить позже.
Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.
Применение отложенных изменений
Чтобы применить ранее отложенные изменения, воспользуйтесь командой git stash pop :
$ git status
On branch main
nothing to commit, working tree clean
$ git stash pop
On branch main
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@ (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)При извлечении отложенных изменений они удаляются из набора и применяются к рабочей копии.
Вы также можете применить изменения к рабочей копии, не удаляя их из набора отложенных изменений. Для этого воспользуйтесь командой git stash apply :
$ git stash apply
On branch main
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlЭто полезно, если вам нужно применить одни и те же отложенные изменения к нескольким веткам.
Теперь вы умеете выполнять основные операции с отложенными изменениями. Однако необходимо помнить о следующей особенности команды git stash : по умолчанию Git не создает отложенные изменения для неотслеживаемых или игнорируемых файлов.
Откладывание неотслеживаемых или игнорируемых файлов
По умолчанию команда git stash создает следующие отложенные изменения:
- изменения, добавленные в раздел проиндексированных файлов (индексированные изменения);
- изменения в файлах, отслеживаемых Git в настоящее время (неиндексированные изменения).
При этом следующие файлы отложены не будут:
- новые файлы в рабочей копии, которые еще не были проиндексированы;
- игнорируемые файлы.
Поэтому если в приведенный выше пример добавить третий файл — неиндексированный (т. е. без выполнения команды git add ), при выполнении команды git stash этот файл не будет отложен.
$ script.js
$ git status
On branch main
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Untracked files:
script.js
$ git stash
Saved working directory and index state WIP on main: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage
$ git status
On branch main
Untracked files:
script.jsЗапуск git stash с параметром -u (или —include-untracked ) позволяет отложить неотслеживаемые файлы:
$ git status
On branch main
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Untracked files:
script.js
$ git stash -u
Saved working directory and index state WIP on main: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage
$ git status
On branch main
nothing to commit, working tree cleanМожно также отложить изменения, внесенные в игнорируемые файлы. Для этого используйте параметр -a (или —all ) при запуске команды git stash .
Управление несколькими наборами отложенных изменений
Вы можете создать несколько наборов отложенных изменений. Команду git stash можно выполнить несколько раз, после чего можно будет просмотреть список созданных наборов с помощью команды git stash list . По умолчанию отложенные изменения имеют пометку WIP (незавершенная работа) наверху ветки или коммита, в которых они были отложены. Возможно, со временем вам будет трудно вспомнить содержимое каждого набора:
$ git stash list
stash@: WIP on main: 5002d47 our new homepage
stash@: WIP on main: 5002d47 our new homepage
stash@: WIP on main: 5002d47 our new homepageРекомендуем добавлять к отложенным изменениям описание в качестве подсказки. Для этого используется команда git stash save «сообщение» :
$ git stash save "add style to our site"
Saved working directory and index state On main: add style to our site
HEAD is now at 5002d47 our new homepage
$ git stash list
stash@: On main: add style to our site
stash@: WIP on main: 5002d47 our new homepage
stash@: WIP on main: 5002d47 our new homepageПо умолчанию команда git stash pop применяет последний набор отложенных изменений: stash@
Если вам нужно применить определенный набор ранее отложенных изменений, укажите его идентификатор в качестве последнего аргумента. Это можно сделать так:
$ git stash pop stash@
Просмотр различий между наборами отложенных изменений
Выполните команду git stash show , чтобы просмотреть сводные данные по набору отложенных изменений:
$ git stash show
index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Или укажите параметр -p (или —patch ), чтобы просмотреть разницу между наборами изменений:
$ git stash show -p
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* + text-decoration: blink;
+>
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+Частичное откладывание изменений
При желании можно отложить один файл, несколько файлов или отдельные изменения в файлах. Если передать команде git stash параметр -p (или —patch ), она будет выполняться для каждого измененного участка кода в рабочей копии, запрашивая подтверждение на откладывание:
$ git stash -p
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* + text-decoration: blink;
+>
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+
Stash this hunk [y,n,q,a,d,/,e,?]? nНажмите ?, чтобы увидеть полный список команд для работы с участками кода. Часто используются следующие команды:
Команда
Описание
искать участок кода по регулярному выражению
не откладывать участок кода
выйти (все выбранные участки будут отложены)
разделить участок кода на меньшие части
отложить участок кода
Специальной команды для прерывания не предусмотрено, но прекратить процесс откладывания можно, нажав CTRL-C (сигнал SIGINT).
Создание ветки из отложенных изменений
Если изменения в ветке отличаются от отложенных изменений, операции извлечения или применения последних могут привести к конфликтам. Вместо этого вы можете создать новую ветку с помощью команды git stash branch и применить отложенные изменения к ней. Это можно сделать так:
$ git stash branch add-stylesheet stash@
Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@ (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Новая ветка создается на основе коммита, изменения в котором использовались при создании набора. Затем к этой ветке применяются извлеченные изменения.
Удаление отложенных изменений
Удалить определенный набор отложенных изменений можно с помощью команды git stash drop :
$ git stash drop stash@
Dropped stash@ (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Следующая команда удаляет все наборы отложенных изменений:
$ git stash clearПринцип работы команды git stash
Если вы просто хотели получить информацию о том, как использовать команду git stash , то дальше читать необязательно. Однако если вам необходимо узнать о принципах работы Git (и git stash ) — продолжайте чтение!
Наборы отложенных изменений шифруются в репозитории в виде коммитов. Специальная ссылка в .git/refs/stash указывает на последний созданный набор отложенных изменений, а для ранее созданных наборов изменений используются ссылки из журнала ссылок stash . Именно поэтому для просмотра наборов отложенных изменений используется ссылка stash@ : при этом вы ссылаетесь на n-ю запись в журнале ссылок stash . Поскольку набор отложенных изменений представляет собой обычный коммит, его можно просмотреть с помощью команды git log :
В зависимости от отложенных элементов выполнение команды git stash создает два или три новых коммита. На приведенной выше схеме создаются следующие коммиты:
- stash@ — новый коммит для хранения отслеживаемых файлов, которые находились в рабочей копии при запуске команды git stash ;
- первый родитель stash@ — существующий коммит, который при запуске команды git stash находился в ветке, на которую указывал HEAD;
- второй родитель stash@ — новый коммит, выступавший в роли индекса при запуске команды git stash ;
- третий родитель stash@ — новый коммит, представляющий неотслеживаемые файлы, которые находились в рабочей копии при запуске команды git stash . Третий родитель создается, только если:
- рабочая копия действительно содержит неотслеживаемые файлы, и
- вы указали параметр —include-untracked или —all при вызове команды git stash .
Ниже показано, как команда git stash шифрует рабочий каталог и раздел проиндексированных файлов в виде коммитов:
- Перед откладыванием изменений в рабочем каталоге могут находиться изменения отслеживаемых, неотслеживаемых и игнорируемых файлов. Часть этих изменений также может быть проиндексирована в разделе проиндексированных файлов.
- При выполнении команды git stash все изменения отслеживаемых файлов шифруются в виде двух новых коммитов в ориентированном ациклическом графе. При этом один коммит используется для неиндексированных изменений, а другой — для индексированных изменений, добавленных в раздел проиндексированных файлов. Для указания на них используется специальная ссылка refs/stash .
- Параметр —include-untracked позволяет также зашифровать все изменения неотслеживаемых файлов в виде дополнительного коммита.
- Параметр —all позволяет включить изменения игнорируемых файлов в один коммит с изменениями неотслеживаемых файлов.
При выполнении команды git stash pop изменения из описанных выше коммитов применяются к рабочей копии и разделу проиндексированных файлов, извлеченный коммит удаляется из журнала ссылок на отложенные изменения, и ссылки в журнале сдвигаются. Извлеченные коммиты не удаляются сразу, но помечаются к удалению в будущем при сборе мусора.
Scratch-файлы

Если нужно быстро что-то проверить или рассчитать, используя зависимости рабочего проекта, можно воспользоваться временными скретч-файлами IDEA. У них масса возможностей — посылать SQL-запросы, создавать временные JSON и т.п. Сюда же можно временно импортировать части проекта. Подробности в документации.
Shelve
IDEA Shelve по аналогии с git stash позволяет не смешивать контексты при переключении с одной задачи на другую.
Предположим, вы занимались одной задачей, но вынуждены были быстро перескочить на другую. В этом случае мы откладываем контекст текущей задачей (через New changelist -> Shelve change, чистим контекст), работаем над другой задачей, потом возвращаем отложенный контекст с помощью Unshelve (с сохранением всех старых переходов) и продолжаем работать над первой задачей. Подробно работа с shelve описана в документации к IDEA.
Кстати, IDEA многое отправляет в shelve автоматически.
Если собственный механизм IDEA почему-то не нравится, можно переключиться на git stash.
Закачка на удаленный хост
Следующая рекомендация для тех, кто любит все выполнять только в IDEA.
Командой Tools -> Deployment -> Browse Remote host можно активировать закладку Remote host. Здесь можно подключиться к удаленному хосту и перетаскиванием загружать на сервер файлы прямо из IDEA.


Дерево коммитов показывает несколько проектов, если ранее вы подключили их в одно окно. Чтобы не запутаться, можно показать дерево только для одного репозитория (для этого в Paths надо выбрать, какой репозиторий сейчас актуален).
Дерево открывает широкие возможности для манипулирования коммитами. В частности, оно позволяет:
- откатывать коммит (Undo commit), после чего он попадает обратно в Change list;
- перетаскивать ветку с одного коммита на другой;
- сравнивать два разных коммита между собой.
Breakpoints
В процессе отладки IDEA позволяет устанавливать Breakpoint-ы. В этот момент можно, например, выводить информацию в лог.
Можно установить Breakpoint с условием (conditional breakpoints). Это удобно, когда точка остановки оказывается в цикле и нет желания 100 раз нажимать F9, пока не доберешься до нужной итерации. Вместо этого в настройках можно поставить условие — точку остановки делать только, если верно выражение:

Останавливаясь на breakpoint, можно воспользоваться кнопкой Evaluate Expression (горячая клавиша Alt + Shift + 8). Она открывает окно, в котором можно исполнять код прямо в рантайме в точке остановки, где будут доступны все зарезервированные объекты. Так можно модифицировать запросы из кода, проверяя быстрые гипотезы.
Evaluate Expression экономит много времени — не нужно перезапускать тесты и т.п.
Тестирование в IDEA
У тестирования непосредственно через IDEA есть одно важное преимущество. Если запускать тесты сторонним инструментом, в консоли появится индекс запускаемого теста. Если же тесты запускать через IDEA, она выведет названия тестов.
IDEA позволяет настраивать запуск тестов — как запускать, сколько раз запускать, останавливать ли повторы после падения (или запускать, пока не упадут) и т.п. Таким образом можно отлавливать любые нестабильные тесты.
Оставайтесь на связи.
Мы в соцсетях:Профайлер IDEA
В IDEA предусмотрена интеграция с инструментами для профилирования. Из коробки доступны Async Profiler и Java Flight Recorder. Выбрать, какой будет использоваться в данный момент, можно через Preferences в секции Profiler.

Преимущество использования профайлера непосредственно из под IDEA в том, что при изучении результатов можно перемещаться не только по этой картинке, но и по исходному коду.
Кстати, у некоторых коммерческих профайлеров тоже есть интеграция с IDEA. Если установить соответствующие плагины, их можно будет выбрать из списка в Preferences.
Анализ stack trace
IDEA умеет анализировать сторонние стектрейсы. Для этого стектрейс надо вставить в окно Analyze stack trace, доступное из меню Analyze -> Stack trace (или Thread Dump). Если в этом окне отметить настройку Automatic detect, то IDEA будет выводить анализ автоматом, как только обнаружит стектрейс в буфере обмена. Просматривая результаты анализа, можно будет переходить на нужные строки кода.
Лайфхак для код-ревью
В ходе обсуждения возможностей IDEA всплыл интересный лайфхак, который помогает лучше ориентироваться в чужом коде во время ревью. Это не отдельный инструмент, но все же мы решили его здесь упомянуть.
Если изменений в коде много, для ревью удобно вытянуть всю ветку к себе, откатить все коммиты этого реквеста (Reset soft) до того, как он был влит в мастер, и выполнить git reset master. Все изменения в этом реквесте останутся в рабочей копии и будут отображаться, как будто они внесены собственными силами. Изменения попадут индекс Git и будут там подсвечиваться (сами они при этом не изменяются). Можно будет перемещаться по зависимостям.
В отличие от Git-> Compare with branch, который просто показывает список изменения, здесь будет более удобная навигация. Правда, можно случайно что-то поправить в коде, и новые изменения не будут выделяться на фоне остальных.
Безусловно, функционал IDEA намного шире. Но мы надеемся, что наша выжимка опыта будет вам полезна.
Статья написана по материалам внутренних митапов Максилект.
Наши статьи по теме:
- Как быстро и безболезненно закрыть регресс в API из связки PyTest + JSON Schema
- Как выглядит техсобес в современном мире и нужно ли к нему готовиться?
- Как моя 9-месячная дочь заработала больше 1000 долларов в программе bug bounty
- Как мы мигрировали сервера в новый дата-центр и, кажется, не сошли с ума
- “Кем вы себя видите в нашей компании через 5 лет” и другие надоевшие вопросы HR — откуда они взялись и как мешают найму
Как обновлять проект с репозитория?

Кто-то может расстолковать какая разница:
- Merge
- Rebase
- Branch Default
- Using Stash
- Using Shelve
Что в каких случаях используется?
Отслеживать
34k 25 25 золотых знаков 130 130 серебряных знаков 222 222 бронзовых знака
задан 28 апр 2016 в 7:21
helloWorld helloWorld
1,045 3 3 золотых знака 8 8 серебряных знаков 21 21 бронзовый знак
Вот что об этом говорит IntelliJ
28 апр 2016 в 8:022 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для начала git stash или git shelve. Когда Вы подтягиваете новые изменения, в Вашем рабочем каталоге могут быть измененные (незакоммиченные) файлы. Естественно, что эти файлы при слиянии изменений могут потерятся. Поэтому гит предлагает их «спрятать в карман». Это называется git stash. После того, как новый код будет получен с удаленного репозитория, изменения с stash можно накатить назад (естественн, при этом возможно нужно будет решить конфликты). В «кармане» можно хранить сколько угодно изменений (логично — ограничены своим диском) и карман не передается на сервер. Детальнее о git stash на русском.
git shelve — это древний проект (2008 года), который не поддерживается на данный момент. Как и git shash, умеет прятатть изменения, только в отдельные ветки. Зачем оно в студии — не ведомо.
Теперь о первой колонке. При накатывании чужих коммитов может произойти две ситуации — в ветке есть Ваши коммиты и чужие и когда есть только с одной стороны. Понятно, что когда есть только коммиты одной стороны, то принять изменения очень просто — их нужно просто «скопировать себе» и поправить указатели на ветки.
В том случае, если есть и свои коммиты и чужие, нужно их «сложить вместе». Для этого есть две технологии — merge и rebase. При merge происходит слияние файлов. Там, где файлы одинаковые, проблем нет, там где файлы разные, гит пытается сложить вместе. Иногда у него это не выходит и он просит пользователя «разрешить конфликт» — так как только программист знает, что он хочет.
Но есть второй способ — это rebase. Некоторые люди любят этот способ, а некоторые под страхом разрушить репозиторий боятся его использовать. Работает он очень просто. Сравниваются две ветки и ищется общий предок-коммит. Дальше, с локальной ветки откатываются все коммиты до общего коммита. Естественно, что теперь добавить коммиты с удаленного репозитория просто. После этого локальные коммиты «накатываются поверху». Если в процессе накатки возникают конфликты, их нужно решать.
А вот что такое Branch default — я не знаю, возможно, студия запоминает последний выбор и применяет его.