git fetch begrijpen en dan mergen

Vanuit een svn-achtergrond had ik deze vraag:

git-equivalent van svn status -u

(wat is het git-equivalent van svn status -u)

En ik begrijp het, u doet:

git fetch
git log ..origin/master

Maar ik vermoed dat het origin/master-gedeelte afhangt van de branch? Het zou niet per se master zijn als ik een remote branch volg?

Ik begrijp de git merge origin/masterook niet precies. Ik vermoed dat dat alleen maar betekent dat git fetchde wijzigingen van de afstandsbediening heeft gepakt en ze in het git-databasesysteem heeft geplaatst als origin/master en dat ik gewoon master ben? Wat als ik wijzigingen heb opgehaald, controleer wat er is gedaan, geschokt ben door de wijzigingen en niet wil samenvoegen? Hoe laat ik ze eigenlijk in de steek?


Antwoord 1, autoriteit 100%

git fetch

git fetchhaalt wijzigingen uit de externe repository en plaatst deze in de objectdatabase van uw repository. Het haalt ook vertakkingen op uit de externe repository en slaat ze op als vertakkingen voor het op afstand volgen.

Als je aan het ophalen bent, vertelt git je waar het elke vertakking opslaat in de externe repository die het ophaalt. U zou bijvoorbeeld iets als

. moeten zien

  7987baa..2086e7b  master -> origin/master

bij het ophalen. Dit betekent dat ‘origin/master’ opslaat waar ‘master’ in de ‘origin’ repository staat.

Als je het bestand .git/configbekijkt, zou je het volgende fragment zien:

[externe "oorsprong"]
    url = git://git.example.com/repo.git
    ophalen = +refs/heads/*:refs/remotes/origin/*

Dit betekent (onder andere) dat elke tak ‘A’ (‘refs/heads/A’) in origin remote (repository waaruit je hebt gekloond) wordt opgeslagen als ‘origin/A’ (‘refs/remotes/origin/ A’).

git log ..origin/master

Zoals je kunt zien is ‘origin/master’ van oorsprong ‘master’. Als je in de (standaard) ‘master’ branch zit, dan git log ..origin/master, wat gelijk is aan git log HEAD..origin/master, wat wanneer on ‘master’ branch is gelijk aan git log master..origin/masterzou een lijst geven van alle commits die in de ‘master’ branch in de remote repository staan ​​en niet in de lokale ‘master’ branch waar u uw werk.

De meer generieke versie in moderne git (ervan uitgaande dat upstream / tracking-informatie bestaat) zou zijn om eenvoudig te gebruiken

$ git log ..@{u}

(Hier is @{u}synoniem voor @{upstream}, zie gitrevisionsmanpage).

git merge origin/master

git mergewordt gebruikt om twee regels geschiedenis samen te voegen. Als een van de partijen geen werk heeft gedaan sinds het laatste vertakkingspunt (sinds de samenvoegbasis), is de situatie of snel vooruit(de vertakking waar je je op bevindt wordt eenvoudigweg bijgewerkt naar de punt van de vertakking die je zijn aan het mergen), of up-to-date(er is niets nieuws om samen te voegen, en de branch waar je op zit blijft ongewijzigd).

git fetchgevolgd door git merge origin/master, indien op ‘master’ branch, is gelijk aan uitgeven

$ git pull

Als je niet wilt samenvoegen, hoeft dat ook niet. Merk op dat u b.v. git reset --hard HEAD@{1}om terug te gaan en het resultaat van git pullte negeren als je het niet leuk vindt.


Antwoord 2, autoriteit 6%

git fetchdownloadt alle wijzigingen die nodig zijn om de gegeven remote branch te vertegenwoordigen. Meestal is dit origin/masterof iets dergelijks.

git mergevoegt twee branches samen door nieuwe commits te maken of snel vooruit te spoelen (of een combinatie). Het verandert niets aan commits die je hebt gemaakt, en je kunt altijd teruggaan naar je oude branch (met behulp van git resetof git checkout).

Merk op dat git pullgit fetchis, gevolgd door git merge(of git rebaseals --rebasewordt gegeven).

Other episodes