This is not really related to main purpose of this blog, but I had to write this article anyway, so I though I might as well publish it.
Git is becoming more and more popular collaborative programming tool. It main purpose is version control, so you can always revert to previous versions of your code and so on.
The problem is many people get really confused by it and there is no really good tutorial that would describe how proper workflow should look like. I know this can be really confusing, so I created this article.
Initial setup:
If you don't have vim you have to install it. In ubuntu type (if no ubuntu, I assume you are geeky enough to be able to google that).:
Setting up a repository
To get the local copy of repo
local directory - for example:
Convention: In all the commands described it is assumed that you are inside your local repo.
To work with code:
To understand branches better imagine, you are to add new feature to a project without git. What you would do is copy a directory with your project and work on a copy, because you will be worried that you will screw up the original. That is exactly what branches do. You can have many branches to work on many features in parallel.
There is one special branch - master - it is a useful convention to keep this one unchanged. That way you can always keep the newest set of changes committed to master repository there.
Observe the star near currently used branch. We want to change it to our newly created branch, so:
Now is the time do actual coding. Write whatever you want and once you are sure a logical part of your code is done clean up the code (what you commit will be shared with your friends and you don't want to make mess on their computer, do you?). Now type
Now that you saved your work on your computer, it's time to share with your friends, but first...
make sure you are not conflicting with newest changes (made by your friends):
Now, if there were any changes that you merged with, make sure that merging didn't break anything. If it did, see and try if you can fix it by yourself, or consult a friend with whose changes you were merging.
All the changes that you made have to be committed again. Sensible thing to do is to add them as a part of your last commit. You can quickly do that by using
Now share it! Push your code from your local branch awesome_feature to branch master on master repository.
git push origin awesome_feature:master
This will push where ever your origin is (remote or local).
Working with server-side code
Some people think that it is impossible to work on local repository if you are working on server side code, as you need to have access to server resources. This is only partially true. In most cases you can run local copy of server and access resources with hard state like SQL database remotely. Using PHP+MySQL as an example you can have separate file locally and on server specifying how to connect to database. You include in PHP files. Just gitignore that file, so that git does not change it around. Run apache at your local computer to execute PHP code.
Make sure you gitignore all your local configurations.
That is the end of this simple git usage tutorial. In general you have lot more interesting problems and features with git, but this actually covers more of the cases for small and medium sized projects.
Good luck and remember - with great power comes great responsibility.
Also don't be afraid to experiment with git - you always can use reflog to repair your mess.
Please comment if you find any bug in this tutorial. It is one of the longest things I ever wrote, so it probably has some.
Git is becoming more and more popular collaborative programming tool. It main purpose is version control, so you can always revert to previous versions of your code and so on.
The problem is many people get really confused by it and there is no really good tutorial that would describe how proper workflow should look like. I know this can be really confusing, so I created this article.
Initial setup:
You need to update git variables. Type: git config --global user.email "YOUREMAIL@gmail.com" git config --global user.name "YOURNICKINGIT" git config --global core.editor vimThis is so that other people can associate your changes to code with you. You will understand later on when we get to git log.
If you don't have vim you have to install it. In ubuntu type (if no ubuntu, I assume you are geeky enough to be able to google that).:
sudo apt-get install vim
Setting up a repository
- Use github - this is a really nice website and I really recommend using it as it has a really nice interface and allows incredibly easy sharing. The downside of that that they make you pay if your project is not public.
- DIY - you can set up a repository on ssh server that other people would be able to fork on their own computers and edit it. In this tutorial I follow a model of single master repo and multiple edit repos, which is very simple and powerful. So steps are:
- Log in to your ssh server and go to directory where you want to set up a master git repository.
- type
git init --shared=group project
This will create a directory named project. Inside this directory there is a hidden folder .git which keeps all of the git state. All files in project folder are subject to version control by git.
- There is some necessary initialization work that needs to be done. Don't worry about it for now (for curious: to be able to successfully clone git repository and be able to push, it has to be nonempty; it also must not be checked out to branch to which you are pushing; we will be pushing to branch master, so it is going to be checkout to devs branch).
cd project/ && touch TODO && git add TODO && git commit -a -m"Initial commit" && git checkout -b dev
- Now this is your master repo. Ideally you should never explicitly modify it from the inside. Instead you should take your own local copy and push to it. Also make sure that all your friends have rights to modify it (if they use different user to log in to the server - this is advanced if you do not know unix permissions yet; if you know it you will be able to do it).
- Log in to your ssh server and go to directory where you want to set up a master git repository.
To get the local copy of repo
git clone <address>where address can be for example:
local directory - for example:
/home/memyselfandi/projects/massdestructionofbananaloversremote directory on ssh server - it has to be structured like this:
ssh://username@server:pathtorepofor example:
ssh://friendofmemyselfandi@secretgovermentorganisation.gov:/home/memyselfandi/projects/massdestructionofbananaloversThis will create a folder with the name of your project containing the repository.
Convention: In all the commands described it is assumed that you are inside your local repo.
To work with code:
git branch awesome_featureCreates a new branch copying a contents of current one. Branch can be thought of as a new direction in which project is going (≈feature or set of features). If you type
git branch
you will see list of all the branches that you have on your local repo.To understand branches better imagine, you are to add new feature to a project without git. What you would do is copy a directory with your project and work on a copy, because you will be worried that you will screw up the original. That is exactly what branches do. You can have many branches to work on many features in parallel.
There is one special branch - master - it is a useful convention to keep this one unchanged. That way you can always keep the newest set of changes committed to master repository there.
Observe the star near currently used branch. We want to change it to our newly created branch, so:
git checkout awesome_feature- changes branch to awesome_feature. Branches are meant to develop logically independent changes. If you are working on two features in parallel, create additional branch. Be careful not to create it from awesome_feature, because it would make a copy of it rather than master (unless your branch diverged into two different directions - but even in this case you would be probably better of first pushing your change to master, possibly disabled with a boolean flag and then starting two new copies of updated master).
Now is the time do actual coding. Write whatever you want and once you are sure a logical part of your code is done clean up the code (what you commit will be shared with your friends and you don't want to make mess on their computer, do you?). Now type
git status
. What you will see will look something like:# On branch awesome_feature # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: TODO # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # bananalover_decapitator.cpp # banana_poisoner.cppWhile TODO is file that already existed and you modified it, bananalover_decapitator.cpp is completely new file. By default git will just ignore new files, so you have to add them to git's consideration.
git add <files>- adds a file to gits consideration. Make sure you add all the files you want to share with your friends. Make sure it worked by typing
git status
again and checking files is listed under new files. Also you can add entire directories to git in one go. This is a sensible thing to do if you start version control of a previously uncontrolled project. Sometimes however that would also add some files you would prefer to ignore. This a actually really common situation, so git let's you specify, things to be ignored. They are located in a specific file in located in your repository:$ cat .gitignore # Can ignore specific files photo_of_red_banana # Use wildcards as well *~ *.swp # Can also ignore all directories and files in that directory. build/**/*
git commit -aCommits your changes as a part of current branch (awesome_feature). It will open your file editor - in this case vim. You will be asked to type a short message describing your set of changes. Make sure is descriptive enough for your friends to understand what you did. Editor you are using is vim, so hit i (letter 'i' on keyboard) to start typing. Type your message normally. Hit esc and then ":wq" + enter (without quotes) to save your text file (if you need to know more on vim, just google it). Now if you type
git log
you should see your change on top (q to exit if list of changes is long). Now it is crucial to understand what just happened. Your modifications used to be only saved as changes to local directory. But committing them you you added them to your branch on your local computer. One commit is a smallest unit that git can manage. You can merge your commits with commits of your friends, revert to the state after a particular commit etc. Now that you saved your work on your computer, it's time to share with your friends, but first...
make sure you are not conflicting with newest changes (made by your friends):
git checkout master # go to branch master git pull # download the newest changes from master branch git checkout awesome_feature # back to your branch git rebase master # magically merge newest updates by your friends with your code.conflict resolution: Sometimes it might happen that you and your friend were editing the same file in a similar place. Should that happen you will have to resolve a conflict. Git makes resolving conflicts really easy! In fact most of them are just resolved automatically. If that didn't happen git will output a message. To fix it: type
git status
to see which files include conflicts. For each of them individually you have to open them and merge the changes. Git will list two different versions it found in this file:<<<<<<< HEAD:banana_bomb.cpp kill_banana_lovers(); ======= kill_banana_lovers_and_their_families(); >>>>>>> 7b08cdcedc68edc6c5e87d7dc5ed7:banana_bomb.cppOnce you resolved conflicts, you have to git add again all the files that use to include conflict. Once this is done you may continue your rebase:
git rebase --continue
Now, if there were any changes that you merged with, make sure that merging didn't break anything. If it did, see and try if you can fix it by yourself, or consult a friend with whose changes you were merging.
All the changes that you made have to be committed again. Sensible thing to do is to add them as a part of your last commit. You can quickly do that by using
git commit -a --amend
Now share it! Push your code from your local branch awesome_feature to branch master on master repository.
git push origin awesome_feature:master
This will push where ever your origin is (remote or local).
Additional features
git blame <file>Displays names of people who last modified each line in a given files.
git diffDisplays uncomitted changes. You can also compare files between different revisions (states after different commits).
git reset --hard <commit_hash>Resets current branch to given commit. In case smb screwed up. In case the change that is bad was not the last change, you are most probably better off writing new commit undoing the changes.
git stashWhen you want to switch to different branch, but don't want to commit changes or want to transfer small set of changes between branches without committing and rebasing, just stash them - use responsibly.
git bisectNo sure which commit caused the failure? Use git bisect to binary search for it.
git reflogGit is so meta - it even version controls what happens with itself. To display recent actions in git use
git reflog
. Each action also has its own hash, to which you can reset but using git reset --hard <action_hash>
Working with server-side code
Some people think that it is impossible to work on local repository if you are working on server side code, as you need to have access to server resources. This is only partially true. In most cases you can run local copy of server and access resources with hard state like SQL database remotely. Using PHP+MySQL as an example you can have separate file locally and on server specifying how to connect to database. You include in PHP files. Just gitignore that file, so that git does not change it around. Run apache at your local computer to execute PHP code.
Make sure you gitignore all your local configurations.
That is the end of this simple git usage tutorial. In general you have lot more interesting problems and features with git, but this actually covers more of the cases for small and medium sized projects.
Good luck and remember - with great power comes great responsibility.
Also don't be afraid to experiment with git - you always can use reflog to repair your mess.
Please comment if you find any bug in this tutorial. It is one of the longest things I ever wrote, so it probably has some.
شركة كشف تسريبات الخزانات بمكة
ReplyDeleteشركة كشف تسربات المياه بالرياض
شركة عزل اسطح بالرياض
شركة رش مبيدات بخميس مشيط
شركة تنظيف مجالس بمكة
رش دفان مكة
شركة مكافحة الفئران في مكة
شركة مكافحة الصراصير بمكة
شركة مكافحة بق الفراش بمكة
شركة تنظيف مساجد بمكة
تنظيف الكنب بالبخار بمكة
تنظيف ستائر بمكة
شركة تنظيف الاثاث بمكة
شركة تخزين الاثاث بمكة
شركات رش حشرات بمكة
شركة رش المبيدات بمكة
Al-Safwa House offers Cheaper pest control company in Riyadh The finest services and cheaper prices at the same time, which made us a great place among other companies and make us gain the trust and respect of many valued customers, diverse and comprehensive services and countless features and huge offers and huge unique work by Al-Safwa House In Riyadh let's talk about it through this topic.افضل شركة مكافحة حشرات
ReplyDeleteشركة مكافحة النمل الابيض بالجبيل
شركة مكافحة حشرات بالجبيل
شركة رش مبيدات بالجبيل
Bookmarked this website, This site contains valuable information
ReplyDeleteThanks a lot for this great stuff here. I am very much thankful for this site.
ReplyDeleteHappy I observed this website. The site is fantastic and has a lot a good points
ReplyDeleteI would like to bookmark the page I come to read again. Wonderful job
ReplyDeleteVery nice blog and i am really very happy to visit your blog.
ReplyDeleteNow I fianlly found which I actually want.
ReplyDelete
ReplyDeleteI will check your blog everyday to learn something new from your blog.
ReplyDeleteIt is always so interesting to visit your site.
All your hard work is much appreciated.
ReplyDelete
ReplyDeleteGreat Post for Beginner to understand.
Fastidious piece of writing
ReplyDeleteGreat article you show us here
ReplyDeleteSimple but very precise info
ReplyDeleteIt was definitely informative
ReplyDeleteVery wonderful info can be found on website.
ReplyDeleteAbsolutely indited subject matter, Really enjoyed reading through.
ReplyDeleteTerrific article! That is the type of information that are meant to be shared across the net.
ReplyDeleteI am continually browsing online for tips that can facilitate me. Thank you!
ReplyDeleteIts an amazing website, really enjoy your articles.
ReplyDeleteKeep doing this in future. I will support you.
ReplyDeleteYour weblog is definitely worth a read if anyone comes throughout it
ReplyDeleteThat is a good tip especially to those new to the blogosphere. Brief but very accurate info…
ReplyDeleteGreat post! Thanks for sharing this helpful information about Assignment Help Pro, a reliable service provider for assignment writing in Australia. It's comforting to know that there's a dedicated team of experts available to assist with academic challenges. If you find yourself struggling with assignment writing services in Australia, worry not—simply reach out to the expert team at Assignment Help in Australia. Their support and expertise can be a valuable resource in navigating complex assignments. I appreciate the recommendation and will certainly keep Assignment Help in Australia in mind for future academic assistance. Thanks again for highlighting this excellent service provider.
ReplyDeleteI have a lot of spray lining knowledge but always learn something new.
ReplyDeleteI think you made some good points in Features also.
ReplyDeleteWow, fantastic weblog structure! How long have you evver been running a blog for?
ReplyDeleteI’m really enjoying the design and layout of your site.
ReplyDelete
ReplyDeleteThank you for the good story. Considered a great and very useful content
ReplyDeleteI am glad to see that your site share valued information that can help to many readers.
ReplyDeleteNice information, you write very nice articles, I visit your website for regular updates
I like what you guys are up also. Such clever work and reporting.
ReplyDeleteGreat site. Plenty of helpful info here. I am sending it to several buddies.
ReplyDeleteExcellent information Providing by this Article thank you for sharing.
ReplyDeleteHello there, You have performed an excellent article..Goodjob!
ReplyDeleteReally nice post. Thank you for posting something like this. Keep it up!
ReplyDelete
ReplyDeleteYou are providing wonderful information, it is very useful to us.