Kluczową różnicą między tymi dwoma systemami jest to, że TFS to scentralizowany system kontroli wersji, a Git to rozproszony system kontroli wersji.
Dzięki TFS repozytoria są przechowywane na centralnym serwerze, a programiści sprawdzają kopię roboczą, która jest migawką kodu w określonym momencie. Dzięki Git programiści klonują całe repozytorium na swoich komputerach, w tym całą historię.
Jedną z korzyści posiadania pełnego repozytorium na komputerach programisty jest nadmiarowość na wypadek śmierci serwera. Kolejną zaletą jest to, że możesz przenosić kopię roboczą w obie strony między wersjami bez rozmowy z serwerem, co może być pomocne, jeśli serwer jest wyłączony lub po prostu nieosiągalny.
Dla mnie prawdziwym dobrodziejstwem jest to, że możesz zatwierdzać zestawy zmian w lokalnym repozytorium, nie rozmawiając z serwerem ani nie powodując potencjalnie niestabilnych zmian w zespole (tj. Przerywając kompilację).
Na przykład, jeśli pracuję nad dużą funkcją, kodowanie i testowanie może zająć tydzień. Nie chcę odpisywać niestabilnego kodu w połowie tygodnia i przerywać kompilacji, ale co się stanie, jeśli zbliżam się do końca tygodnia i przypadkowo zepsuję całą kopię roboczą? Jeśli nie zobowiązuję się przez cały czas, narażam się na utratę pracy. To nie jest skuteczna kontrola wersji, a TFS jest na to podatny.
Dzięki DVCS mogę stale zatwierdzać, nie martwiąc się o przerwanie kompilacji, ponieważ dokonuję zmian lokalnie . W TFS i innych scentralizowanych systemach nie ma koncepcji lokalnego odprawy.
Nie zastanawiałem się nawet, o ile lepsze rozgałęzianie i scalanie jest w DVCS, ale można znaleźć mnóstwo wyjaśnień tutaj na SO lub przez Google. Mogę powiedzieć z doświadczenia, że rozgałęzianie i łączenie w TFS nie jest dobre.
Jeśli argumentem przemawiającym za TFS w twojej organizacji jest to, że działa on lepiej w systemie Windows niż Git, sugerowałbym Mercurial, który działa świetnie w systemie Windows - istnieje integracja z Eksploratorem Windows (TortoiseHg) i Visual Studio (VisualHg).