В простейшем случае, когда все коммитят и пушат в одну ветку, будет push rejected (пуш отклонён) у второго. Ему придётся сначала сделать git pull и совместить внесённые удалённо изменения, прежде чем отправить свои. По умолчанию Git не позволяет перезаписывать фрагменты дерева коммитов, только дополнять его.
Если они меняли разные проекты, то конфликты малореальны, и хватит просто git pull (чтобы удалённые изменения слились с локальными), а затем повторного git push.
Есть ещё особо суровый приём для сохранения прямой истории, git pull --rebase, но прежде чем им пользоваться, стоит изучить, как он работает и чем может быть опасен.
В нормальном случае, лучше работать в отдельных ветках (которые могут существовать даже в разных репозиториях, в случае форков).
Каждый достигает в своей ветке стабильного состояния и делает pull request (PR) (merge request или MR в некоторых местах) и согласно принятой в команде процедуре (скажем, если хотя бы двое кроме автора проголосовали за) принимают его.
Если изменения второго PR/MR основаны на устаревшем коде, и верхняя версия в главной ветке отличается от того, поверх чего сделаны новые изменения, веб-интерфейс сообщит, что слияние порождает конфликты, которые нужно:
- либо разрулить при ручном слиянии локально
- либо попросить автора кода сделать
rebase на новую версию главной ветки, в результате чего конфликты будет решать автор новой ветки (поэтому это более популярное решение)
Одна из вариаций этого техпроцесса называется Github Flow.