Episode: 2512 Title: HPR2512: Intro to git remote Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr2512/hpr2512.mp3 Transcribed: 2025-10-19 04:26:56 --- This in HPR episode 2,512 entitled Intro to Get Remote, it is hosted by Klaatu and in about 27 minutes long and Karina Cleanflag, the summer is all about Get Remote. This episode of HPR is brought to you by AnanasThost.com. Get 15% discount on all shared hosting with the offer code HPR15, that's HPR15. Better web hosting, that's Honest and Fair, at AnanasThost.com. Hi everyone, this is HPR15, my name is Klaatu and this episode is going to be a continuation of my Get Basics series, I guess is what I'll call it. In the previous episode we did a paper exercise to illustrate some of the principles of Get. Namely the way that a project that two people are working on can diverge and create what we would call a fork in a road if we were traveling along a real-life path. And what we generally do call forks in Get and we also call more often than not just branches because for whatever reason in computers we use trees or plants as an analogy a lot. So there's this idea of there being a master branch and then from that branch there are these other branches that diverge much like on a tree branch and you have different files within each branch. And then at the end of the episode last time we created a very basic kind of rudimentary Get repository just locally on our own machine. In this episode I want to set up a little bit of an exercise environment so that we can play around and experience all kinds of fun problems that you might expect to find in the real world. And in order to do that we can recycle the one that we created initially but I'm just going to create a new set with simpler names to be honest. So I'm going to make a repository called Dev, well let's call one Alice, make their Alice, make their Bob and then we're going to make their remote server. So we've got three directories, we've got Alice Bob and remote server. Cool. So Alice and Bob live far apart and then remote server is somewhere else. We can imagine it's a cloud hosting service like GetLab or not a bug.org or get hub.com or whatever you happen to use. Now we need to make all of these get repositories but they need to be get repositories of a different sort. Two of them can be the same but one of them needs to be a special kind of get repository. And the one that needs to be a special kind is the remote server, that's the one that no one really touches directly, it's off in the cloud somewhere, we don't interact with it directly, we just push and pull to and from it. So let's just go into the alphabetically here, let's go into Alice's directory and we'll do, we did this last time, it was a get in it, get space INIT. And it tells you, hey, you've got to get repository now. And you might recall if you do an LS-A, you see that there's a hidden folder called .get. And if you're really mischievous, you could do a get list and LS.get and look inside of that hidden directory. Of course, you'd never go inside that directory, you'd never mess around with any of the files inside of that directory, but you could look. Okay, so Alice is pretty much set up for now, she's as set up as we can get her set up until we do some other things. So we're going to CD back out into our main directory, we'll go over to Bob and we'll do the same thing, get in it, done, LS-A, yep, there's the get folder, great. So we have two empty get repositories, we're going to CD back out one more time and go into the remote server directory, sorry, you know what, I'm going to change that name because that could get to confusing, I thought it would be helpful. I'm going to move remote server to fake remote, there we go, that's better. Now I'm changing into fake remote and then I'm going to do a, now don't do this before I do because this is, this will be different, you'll think it's the same, it's different. I'm doing a get in it, space dash dash bear, B-A-R-E and if you do that, it tells you initialized empty get repository in this current directory. Okay, so and now if you do an LS, you might be surprised at what you see. Now if you're really astute, you'll notice that the contents of this directory are awfully similar to the contents of the .get directory in Allises and Bob's local repositories and in fact, it's exactly the same, they are, it's the same frame, this skeletal framework as the hidden directory in a get repository. So this is a directory, this would be the back end to your geto light server or to your get lab account or whatever, that's, this is the stuff that nobody interacts with directly, it's the stuff that is tracking the information that you push out to the world, okay? So what we've just set up are two local repositories for two imaginary developers and one bear repository on some remote server of some kind. It could be someone's pie in their bedroom, it could be someone's cloud in a data center, doesn't matter, point is it's a remote server. Okay, so now that all of that exists, we'll go back over into Allises directory and we will create a file and we did this last time but we're going to do it again really quick and we'll just put in the classic hello world. So we'll echo quote, hello space world, close quote, redirect to zero one dot TXT and now there's a file there, it's called zero one dot TXT and now if we do a get status of course we should see that there is, there is one untracked file, it is called zero one dot TXT and it tells us that we can add that file if we want to commit it. So we can do a get add oh one dot TXT and get status again and it tells us yep there's going to be a commit if you unless you uncash, if you unstage it, it won't be committed but otherwise this is going to be committed. So let's go ahead and commit it then. So that's a get commit space dash M for message and then in quotes I'll put added a text file and it tells me that a file has changed and there was one insertion and that's good. So essentially for the local work, if all I'm doing is working locally I'm done, that's all I had to do. Now of course we're not working locally anymore, we want to start sharing our code with our friend Bob. So in order to share it with Bob we want to push it to some common location and that is of course the fake remote. So what we're going to do is we're going to kind of expand gets world here and the way that we do that right now get only is aware of itself is get as far as get knows it's a local repository. There's no outside world and you can prove that to yourself by doing a get remote that's get space remote space dash V for verbose and you'll get nothing back. There's nothing there. That's fine because we can tell it about remotes. We can add a remote to our get repository. Now when we say that we're going to add a remote all we're doing is we're entering some stuff in the terminal here and into essentially a config file just through a command. So we're going to do a get remote and the very sort of default canonical way of doing this is get space remote space add space origin space and in the address of the origin server. Now I don't know why exactly they they chose origin for the default name but that's what everyone defaults to. I mean the get developers just decided that the remote server that you consider your sort of centralized repository in this un in this famously decentralized version control system is going to be called origin. Now that might confuse you if you're from SVN I think maybe the equivalent would be trunk possibly I could be wrong about that because I've never really I've used SVN like once or well now about 15 times but but I'm not really super into the culture so I don't know or the history but but that's what it's called it's origin so when you hear origin chances are what you're really thinking is the remote server the one that is not in my room right now the one that's out there somewhere unless of course your remote server is a Raspberry Pi in your bedroom in which case it's just right over there in the corner but assuming you know sort of pretending that everything remote is out there in the world then that's what the origin would be now you don't have to call it origin but I guarantee you if you do that if you call it something other than origin people will be confused and by people I mean you so get remote ad origin and then for our purposes in this in this exercise we're just going to do it we're going to we're faking get out we're relying to it so we're not actually telling it about a server anywhere we're telling it about a directory so I'm just going to do origin dot dot slash H no fake fake remote and there it goes it's created now an origin point called dot dot slash fake remote so if I do a get remote dash v for verbose then it tells me that the origin is dot dot slash fake remote for fetch and dot dot slash fake remote for push and that is what we once okay so now what we really we can do so if we do a get log we see that we we've got that one commit that we made just five minutes ago and three minutes ago whatever it is and then we can do a get remote nope we can do a get push dash U and the dash U stands for set up stream so you could even do a get push dash dash set dash up stream origin so we're pushing into our remote server our fake remote and then what what are we pushing we're pushing the current state of our repository the current committed state of our repository and the term for that the shorthand the the the the designator for that is head all in capitals so capital H capital E capital A capital D for Delta and and why do we call it head it's like a playhead on one of them old time cassette players you might have might have seen them somewhere and get will use phrases from that like fast forwarding and rewinding and things like that so that's that the head designator means whatever has been committed on your local computer right now will get pushed to the origin hit return and it tells you to dot dot slash fake remote new branch head master branch master set up to track remote branch master from origin which is telling you from now on your master branch on your local computer is tied a kind of mirrored linked to the master branch on the origin on that remote server called origin so now we're going to go back over or not back over we're going to go over to Bob's computer and I think we've got nothing here yeah empty and if we do a get remote dash V for remote we'll find that there's no remote set up so so Bob needs to grab this information from the server now he can do that a couple of different ways but the easiest most direct way then I and I think the normal way would be to clone the repository you may have cloned a repository before or you might have heard the term certainly if you've ever been to one of those public get hosts you've probably seen buttons or encouragements that you can clone a repository no actually I think they use fork anyway get cloning is how you grab a repository from someone else's server and bring it down to your local computer so we'll do a get clone and then normally you would do something like maybe get at get lab dot com colon slash blah blah or not colon slash but just colon not clad to whatever but we're not doing that this is all local so we're just going to do dot dot slash fake remote and then we'll tell it that we want to clone that the data that it finds there at fake remote we want to clone it to the current directory so I'm going to just put a dot so get clone dot dot slash fake remote dot and there you go I've made my first mistake and probably if you've been following along so have you it tells me that it's a fatal error the destination path dot already exists and is not an empty directory well so what's that what that is telling me is that Bob should not have made his folder a get repository yet so what I'm going to do is I'm going to trash dot get and now I'm doing an LS-A and now I've got an empty empty repository in in Bob's directory or an empty folder rather in Bob's directory now I'm going to do the get clone dot dot slash fake remote dot and it says it's cloning into dot and it's done and now if I do an LS in fact an LS-A I see that there's a new dot get directory that's the one from Alice's repository plus the text file cat or zero one dot txt which I'm going to now cat and it says hello world so Bob is now mirroring essentially the the repository from our remote our fake remote and in fact we can get more information if we do a get remote dash v for verbose and it tells us that the origin is slash home slash clatu slash hpr get slash bob slash dot dot slash fake remote for fetch and the same thing for push that's a little bit ugly that's a bit verbose I mean we could set the we could reset the the origin to just being dot dot slash fake remote in fact it's not that hard to do you can do it with a get remote command so get I mean we don't have to but I'm just going to tell tell you how to do it just so you'll get familiar with these kinds of operations so get space remote space set dash url url origin so we want to we're basically resetting the url for the origin to I'm just going to put dot fake remote or I mean dot dot slash fake remote so I do that and now if you do a get remote dash v you'll see that the fetch address oh both of the addresses okay I thought I would had to do it again for push but apparently not so get remote set url origin dot dot slash fake remote resets the origin address to just dot dot slash I mean the other one is perfectly valid but it's kind of ugly and kind of clunky I mean going all the way into this directory only to go back one and then into the fake remote seems a little bit silly so I'm just I'm pointing it straight to the my fake remote so setting setting urls and and and and even adding new remotes is completely possible it's something that I do quite frequently to be to be honest and I've I've done it a lot for a lot of different purposes so it's something to get it's something to not be afraid of I guess you don't necessarily need to get familiar with it because maybe that's not your workflow but it's something to kind of get familiar with in terms of at least demystifying how get knows magically where to send all of your data or how to get the updates speaking of getting updates we should we should we should we should mess around with that a little bit we should we should do some some interesting branch operations but I think for this episode I think the job has been done and the job has been to set up repositories locally for for future episodes and it has been to familiarize you with the get space remote command I guess I guess we could at least do a proof of concept because this is running a bit short I feel it's only been a couple of almost 20 minutes not even 20 minutes yet I don't think so yeah let's do a quick proof of concept just to prove that yes Bob is now on board so first what we'll do just this is a kind of a little bit of a taste of next episode but first what we're going to do is do a get branch command which is simply get space branch and it tells us that we have one branch and it's called master and I think I mentioned this in the previous episode master is just the default name for for your primary branch it's the one that gets created for you by default and we've already done a cat of zero one dot txt so it's got the string hello world so let's say that Bob is a little bit pedantic and he believes that that hello world should be capitalized hello capital H world and then it should have a full stop at the end so we'll add that and then just to populate this file a little bit more we'll add a second line we'll keep that blank and then on the third line we'll we'll put something like welcome to get full stop there so now we've got three lines in this file so he is just he has just changed a file in the master branch now what he might do because Bob and Alice are apparently kind of new to get because if they weren't new to get they would be using branches already but they're new to new to get and they're fearless and so they say okay that's fine let's let's Bob can just push that straight to master so we'll do a get add and then we'll do a get get add either dot for adding everything in his current directory which is zero dot txt zero one dot txt or you can do a get add zero one dot txt whatever you feel more most comfortable with and then get commit dash m for message quote quote and in the quotes we'll add corrected syntax corrected let's just do Bob's first commit there okay there we go Bob's first commit and now we'll do a get push now here's the thing about actually no that's this is because this is master so we're going to do a get push origin head now online you will see a lot of people just doing a get push and technically speaking that's perfectly valid I am just urging you not to do that I I favor a verbosity sometimes an explicitness and this is one of the cases where I really really do encourage it because if you've got a bunch of branches with a bunch of stuff in them and you just type in get push surprise surprise you have you've pushed all kinds of things to your remote that you maybe you didn't really mean to so I like to be very explicit get push origin so we're pushing stuff to the origin which is fake remote and what are we pushing to origin we're pushing the state of our of our committed repository right now which is of course represented by the designated head return oops I hit the up here and said return and there it goes it says writing objects three of three blah blah blah okay so now we'll change directory back over to Alice's directory we do an LS we still have just the one file that's good we do a cat of zero one dot txt and it's just hello world all lowercase no punctuation so how does she get those changes from the remote repository well there are a couple of different ways there's a shorthand way which as you can probably guess I'm not going to use and there's the actual way like there's the thing that's actually happening behind the scenes of that shorthand command so the shorthand command just so you'll know is get pull and you will use get pull and I'm I use get pull all the time but to begin with I think get pull is a little bit of a again it's got a little bit of magic to it because it does two separate actions kind of all at once so what it does actually is it does a get fetch and then it does a get merge of something okay so what we're going to do then is we're going to do a get fetch and when I say get fetch when I type that in and hit return it gives me some feedback and it says counting objects three done total three delta zero unpacking objects 100% three of three done from dot dot slash fake remote that's my remote server so that's good and then it gives me some hashes it tells me that the D52 to E1 E4 and and then it tells me master and then a little arrow to origin slash master okay so that's just something to keep in mind you'll you'll see those phrase those terms again very soon so now if I do a get log I see that I still only have one one log entry and that was added a text file which I did earlier in this episode so nothing from Bob yet as far as we can tell so how do I get the information that I know that you and I both know is should be there we as Bob just pushed some information to fake remote so how do we get the information that we know we've just surely received how do we get it into our workspace well I like to think of this in terms a little bit of if you've ever used GIMP then you'll know that when you when you select something and you copy something like you let's say you've got a picture you select it to select a space a portion of a new copy or you cut maybe and then you paste it back in when you paste it it comes in as this floating layer and that floating layer you can see you can interact with you can move it around but until you anchor it to something it's just a floating layer it's kind of a metal layer or a temporary plane of existence so that's kind of how I think of what we got from fetch fetch is this stuff and it it's there on our repository but it hasn't been merged into any branch yet and in fact you can even kind of you can technically see this information I mean not exactly but but you can get some insight into this by doing a get space branch space dash dash all and that shows you where where if you want to call when we just do it get branch it's just master yeah but if we do a get branch all dash dash all then we see that there's master but then there's like the secret hidden repository the branch called remotes slash origin slash master so that's that's more or less where that stuff is is residing the stuff that we fetched is kind of hiding away in that origin slash master branch so the way to get that stuff into our master branch is we do a get merge and then the word master and then origin slash master I told you you were going to see that term again the syntax for the actual merge is a little bit a little bit flexible to be honest you the the way that I was taught to do it was get space merge space master which is the name of your current branch and then space origin slash master which is the the source of the thing that you are merging so you can do it that way honestly you can also just do get merge origin slash master because it defaults to merging that to your current branch and since we are currently on the master branch it'll just get merged into where we are right now I'm a creature of habit and I like explicit commands so I'm going to do get merge master origin slash master now understand of course I think you do understand but understand that our master branch here is our local master branch and we are therefore merging the master branch in a different name space as it were to this one so origin slash master is distinct from just master all right I'm going to hit return on this and it shows media that it is merging updating d52 to e14 fast forward 0 1 dot txt four additions one file changed three insertions and one deletion and if I do a cat 0 1 dot txt now Alice's file is is matching bobs it's hello world full stop blank line welcome to get full stop there you go that was two different repositories pushing and fetching and merging such that they are now in sync again in the next episode we will do a bunch more stuff with branches lots of get branch work that we will even do a get conflict which usually sends shivers down down users spines so that'll be cool tune in it'll be amazing you've been listening to hecka public radio at hecka public radio dot org we are a community podcast network that releases shows every weekday Monday through Friday today's show like all our shows was contributed by an hbr listener like yourself if you ever thought of recording a podcast then click on our contributing to find out how easy it really is hecka public radio was founded by the digital dog pound and the infonomican computer club and it's part of the binary revolution at binwreff.com if you have comments on today's show please email the host directly leave a comment on the website or record a follow-up episode yourself unless otherwise stated today's show is released under creative comments attribution share 3.0 license