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/master
ook niet precies. Ik vermoed dat dat alleen maar betekent dat git fetch
de 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 fetch
haalt 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/config
bekijkt, 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/master
zou 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 merge
wordt 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 fetch
gevolgd 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 pull
te negeren als je het niet leuk vindt.
Antwoord 2, autoriteit 6%
git fetch
downloadt alle wijzigingen die nodig zijn om de gegeven remote branch te vertegenwoordigen. Meestal is dit origin/master
of iets dergelijks.
git merge
voegt 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 reset
of git checkout
).
Merk op dat git pull
git fetch
is, gevolgd door git merge
(of git rebase
als --rebase
wordt gegeven).