156

What is the difference between git add, push and commit?

Just a little confused coming from SVN, where "update" will 'add' stuff, and commit does a "push" and will 'add' as well

There are all different functions within git. Hoping for some explanation from your experience.

nbro
  • 15,395
  • 32
  • 113
  • 196
CQM
  • 42,592
  • 75
  • 224
  • 366

9 Answers9

204
  1. git add adds your modified files to the queue to be committed later. Files are not committed

  2. git commit commits the files that have been added and creates a new revision with a log... If you do not add any files, git will not commit anything. You can combine both actions with git commit -a

  3. git push pushes your changes to the remote repository.

This figure from this git cheat sheet gives a good idea of the work flow

enter image description here

git add isn't on the figure because the suggested way to commit is the combined git commit -a, but you can mentally add a git add to the change block to understand the flow.

Lastly, the reason why push is a separate command is because of git's philosophy. git is a distributed versioning system, and your local working directory is your repository! All changes you commit are instantly reflected and recorded. push is only used to update the remote repo (which you might share with others) when you're done with whatever it is that you're working on. This is a neat way to work and save changes locally (without network overhead) and update it only when you want to, instead of at every commit. This indirectly results in easier commits/branching etc (why not, right? what does it cost you?) which leads to more save points, without messing with the repository.

Community
  • 1
  • 1
abcd
  • 41,765
  • 7
  • 81
  • 98
  • So does push commit locally and then push to remote server or does one have to commit first then push to get work to the remote repository? – Andrew S Jul 22 '15 at 22:23
  • 3
    You first have to commit ("git commit") which update your local repository (a.k.a on your local machine) then you have to push to the server ("git push") which update the remote repository (on the github server for eg.) – Romain Sep 08 '15 at 00:37
  • I would love a "mentally add" function in Git! – Junchen Liu Oct 05 '15 at 15:27
  • 1
    It is adviced to not only commit often, but also to push often. This protects your work when your hard drive crashes. – CCC Jun 29 '16 at 09:42
115

git add selects changes

git commit records changes LOCALLY

git push shares changes

CoderOfTheNight
  • 944
  • 2
  • 8
  • 21
Dustin
  • 89,080
  • 21
  • 111
  • 133
33
  • git add adds files to the Git index, which is a staging area for objects prepared to be commited.
  • git commit commits the files in the index to the repository, git commit -a is a shortcut to add all the modified tracked files to the index first.
  • git push sends all the pending changes to the remote repository to which your branch is mapped (eg. on GitHub).

In order to understand Git you would need to invest more effort than just glancing over the documentation, but it's definitely worth it. Just don't try to map Git commands directly to Subversion, as most of them don't have a direct counterpart.

Adam Byrtek
  • 12,011
  • 2
  • 32
  • 32
  • Someone should explain the difference between local and remote github. What you have in local and remte. This is the key that you need to find – Mahdi Amrollahi Dec 15 '19 at 08:00
30

I find this image very meaningful :

enter image description here

(from : Oliver Steele -My Git Workflow (2008) )

Malick
  • 6,252
  • 2
  • 46
  • 59
14

I was confused about what 'add' really does. I just read a very enlightening paragraph from the book Git Pro that I'd like to add here, because it clarifies things

It turns out that Git stages a file exactly as it is when you run the git add command. If you commit now, the version of benchmarks.rb as it was when you last ran the git add command is how it will go into the commit, not the version of the file as it looks in your working directory when you run git commit. If you modify a file after you run git add, you have to run git add again to stage the latest version of the file

Excerpt From: Chacon, Scott. “Pro Git.” Springer, 2009-08-19T00:00:00+00:00. iBooks. This material may be protected by copyright.

aSaffary
  • 793
  • 9
  • 22
8

add tells git to start tracking a file.

commit commits your current changes on your local repository

push pushes you local repo upstream.

hvgotcodes
  • 118,147
  • 33
  • 203
  • 236
5

Very nice pdf about many GIT secrets.

Add is same as svn's add (how ever sometimes it is used to mark file resolved).

Commit also is same as svn's , but it commit change into your local repository.

josliber
  • 43,891
  • 12
  • 98
  • 133
pmaruszczyk
  • 2,157
  • 2
  • 24
  • 49
  • 2
    Now I have to go look up svn add and commit. My big fear: their docs will then refer me to git add and commit. And lord_t is the author of said docs. – eric Jul 16 '17 at 03:11
  • The question author has had knowledge of SVN, so I assumed he know svn's commands. – pmaruszczyk Apr 26 '18 at 10:24
0

add -in git is used to tell git which files we want to commit, it puts files to the staging area

commit- in git is used to save files on to local machine so that if we make any changes or even delete the files we can still recover our committed files

push - if we commit our files on the local machine they are still prone to be lost if our local machine gets lost, gets damaged, etc, to keep our files safe or to share our files usually we want to keep our files on a remote repository like Github. To save on remote repositories we use push

example Staging a file named index.html git add index.html

Committing a file that is staged git commit -m 'name of your commit'

Pushing a file to Github git push origin master

Herbert
  • 75
  • 8
0

The add and commit are co-related to each other.

add allows us to continue in making changes to the local repository, and when we want to share these changes to the remote repository, commit allows us to record these changes.

push command can be considered as a tool that transfers commits from local repository to remote repository.