--- title: '🗓️ Git version control: Ultimate Guide' description: 'What is `git`, what are the most used commands, best practices, and tips and tricks. The Ultimate guide to master `git` in your daily workflow.' isPublished: true publishedOn: '2022-09-04T14:33:07.465Z' --- Hello! 👋 Welcome to the Ultimate Guide to master `git` in your daily workflow, we will see what are the most used commands, what are the best practices, and tips and tricks. **Note:** Sources used to write this blog post are available at the [end of this post](#sources). ## Introduction **Git** is a free and open source distributed **version control system** for keeping track of changes across a set of files. Git was originally authored by [Linus Torvalds](https://en.wikipedia.org/wiki/Linus_Torvalds) in 2005 for development of the [Linux kernel](https://kernel.org/). Git allows: - to be able to work with several people on the same codebase. - track changes to know who did what and when. - revert changes. Git is **decentralized**, which means that every developer has a full copy of the repository and the complete history of the project. ## Get started with `git` and `.gitconfig` config file The first thing you should do when you install Git is to set your user name and email address. ```sh git config --global user.name "Username" git config --global user.email "email@example.com" ``` These configurations are stored in the `.gitconfig` file in your home directory (e.g: `~/.gitconfig`) with this format: ```sh [user] name = Username email = email@example.com ``` You can find more information and useful `git` configurations in the official documentation: [git-scm.com/docs/git-config](https://git-scm.com/docs/git-config). ## How `git` works? Each `git` project is called a **repository** (or **repo** for short) and it contains all the files and folders for a project, as well as each file's revision history (**commits**) stored in the `.git` folder. The history of a repository is represented by a graph. Each node is called commit and contains: - an instantaneous view (snapshot) of the state of the repository at a specific moment - metadata: message, author, creation date, etc. ## Commands cheatsheet ```sh # Initialize a new git repository git init # Clone a repository git clone # Add all the files to staging area git add . # Add specific file to staging area git add # Commit changes git commit -m "chore: initial commit" # Add remote repository git remote add origin # Add forked repository git remote add upstream # Sync forked repository git fetch upstream git merge upstream/ # Push changes to remote repository git push # Pull changes from remote repository git pull # Show the status of the working tree git status # Show the commit history git log # Create a new branch git checkout -b # Switch to a branch (or tag or commit) git checkout # Merge a branch into the current branch git merge # Delete a branch git branch -d git push origin --delete # Fetch branches from remote repository and prune git fetch --prune # Revert a commit git revert # Change several past commits (interactive rebase) # HEAD points to the current consulted commit. git rebase -i HEAD~ # Reset the current branch, delete all commits since (without removing the changes) git reset --soft # Apply the changes introduced by some existing commits git cherry-pick ``` ## `.gitignore` file The `.gitignore` file is a text file that tells `git` which files (or patterns) it should ignore. The `.gitignore` file is usually placed in the root directory of the repository. We usually ignore files that are generated by the build process or files that contain sensitive information. Example of `.gitignore` file: ```sh .env build *.exe ``` ## `.gitkeep` file The `.gitkeep` file is a file that is used to keep an empty directory in a Git repository. This is useful when you want to keep an empty directory in your repository but you don't want to commit any file inside it. ## Git remote repositories (GitHub/GitLab) Explain what are the differences, how it works, + basic vocabulary... ### SSH vs HTTPS authentication Explain the differences + quickly setup a SSH key... ### Sign `git` commits with `gpg` Explain, how and why to sign `git` commits... ### Continous Integration/Continuous Delivery GitHub Actions, Vercel, why is it so important... ## Best practices and `git` workflows ### Commit messages and semver ### GitFlow ... ### GitHub Flow ... ### Trunk-based ... ## Conclusion `git` is the tool that every programmer should know to do collaborative work and keeping track of changes across a set of files. ## Sources - [Git official website and documentation](https://git-scm.com/) - [Git Explained in 100 Seconds](https://www.youtube.com/watch?v=hwP7WQkmECE) - [Understand Git in 7 minutes](https://www.jesuisundev.com/en/understand-git-in-7-minutes/) - [How (and why) to sign Git commits | With Blue Ink](https://withblue.ink/2020/05/17/how-and-why-to-sign-git-commits.html?utm_source=tiktok&utm_campaign=codetok-sign) - [Creator of Gitflow blog post](https://nvie.com/posts/a-successful-git-branching-model/) - [What Are the Best Git Branching Strategies](https://www.flagship.io/git-branching-strategies/)