summaryrefslogtreecommitdiff
path: root/doc/gitlab-basics/start-using-git.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/gitlab-basics/start-using-git.md')
-rw-r--r--doc/gitlab-basics/start-using-git.md216
1 files changed, 160 insertions, 56 deletions
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index 439032f39b3..d767bee4cf1 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -1,7 +1,7 @@
---
type: howto, tutorial
description: "Introduction to using Git through the command line."
-last_updated: 2020-04-22
+last_updated: 2020-06-30
---
# Start using Git on the command line
@@ -104,68 +104,134 @@ repository.
You can read more on how Git manages configurations in the
[Git Config](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration) documentation.
-## Basic Git commands
+## Git authentication methods
-Start using Git via the command line with the most basic commands as described below.
+To connect your computer with GitLab, you need to add your credentials to identify yourself.
+You have two options:
-### Initialize a local directory for Git version control
+- Authenticate on a project-by-project basis through HTTPS, and enter your credentials every time
+ you perform an operation between your computer and GitLab.
+- Authenticate through SSH once and GitLab won't ask your credentials every time you pull, push,
+ and clone.
-If you have an existing local directory that you want to *initialize* for version
-control, use the `init` command to instruct Git to begin tracking the directory:
+To start the authentication process, we'll [clone](#clone-a-repository) an existing repository
+to our computer:
-```shell
-git init
-```
+- If you want to use **SSH** to authenticate, follow the instructions on the [SSH documentation](../ssh/README.md)
+ to set it up before cloning.
+- If you want to use **HTTPS**, GitLab will request your user name and password:
+ - If you have 2FA enabled for your account, you'll have to use a [Personal Access Token](../user/profile/personal_access_tokens.md)
+ with **read_repository** or **write_repository** permissions instead of your account's password.
+ Create one before cloning.
+ - If you don't have 2FA enabled, use your account's password.
-This creates a `.git` directory that contains the Git configuration files.
+NOTE: **Note:**
+Authenticating via SSH is GitLab's recommended method. You can read more about credential storage
+in the [Git Credentials documentation](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
-Once the directory has been initialized, you can [add a remote repository](#add-a-remote-repository)
-and [send changes to GitLab.com](#send-changes-to-gitlabcom). You will also need to
-[create a new project in GitLab](../gitlab-basics/create-project.md#push-to-create-a-new-project)
-for your Git repository.
+## Git terminology
-### Clone a repository
+If you're familiar with the Git terminology, you may want to jump directly
+into the [basic commands](#basic-git-commands).
+
+### Namespace
+
+A **namespace** is either a **user name** or a **group name**.
+
+For example, suppose Jo is a GitLab.com user and they chose their user name as
+`jo`. You can see Jo's profile at `https://gitlab.com/jo`. `jo` is a namespace.
+
+Jo also created a group in GitLab, and chose the path `test-group` for their
+group. The group can be accessed under `https://gitlab.com/test-group`. `test-group` is a namespace.
+
+### Repository
+
+Your files in GitLab live in a **repository**, similar to how you have them in a folder or
+directory in your computer. **Remote** repository refers to the files in
+GitLab and the copy in your computer is called **local** copy.
+A **project** in GitLab is what holds a repository, which holds your files.
+Often, the word "repository" is shortened to "repo".
+
+### Fork
+
+When you want to copy someone else's repository, you [**fork**](../user/project/repository/forking_workflow.md#creating-a-fork)
+the project. By forking it, you'll create a copy of the project into your own
+namespace to have read and write permissions to modify the project files
+and settings.
+
+For example, if you fork this project, <https://gitlab.com/gitlab-tests/sample-project/> into your namespace, you'll create your own copy of the repository in your namespace (`https://gitlab.com/your-namespace/sample-project/`). From there, you can clone it into your computer,
+work on its files, and (optionally) submit proposed changes back to the
+original repository if you'd like.
+
+### Download vs clone
-To start working locally on an existing remote repository, clone it with the command
-`git clone <repository path>`. By cloning a repository, you'll download a copy of its
-files to your local computer, automatically preserving the Git connection with the
-remote repository.
+To create a copy of a remote repository files on your computer, you can either
+**download** or **clone** it. If you download it, you cannot sync it with the
+remote repository on GitLab.
-You can either clone it via [HTTPS](#clone-via-https) or [SSH](#clone-via-ssh). If you chose to
-clone it via HTTPS, you'll have to enter your credentials every time you pull and push.
-You can read more about credential storage in the
-[Git Credentials documentation](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
-With [SSH](../ssh/README.md), you enter your credentials only once.
+On the other hand, by cloning a repository, you'll download a copy of its
+files to your local computer, but preserve the Git connection with the remote
+repository, so that you can work on the its files on your computer and then
+upload the changes to GitLab.
+
+### Pull and push
+
+After you saved a local copy of a repository and modified its files on your computer, you can upload the
+changes to GitLab. This is referred to as **pushing** to GitLab, as this is achieved by the command
+[`git push`](#send-changes-to-gitlabcom).
+
+When the remote repository changes, your local copy will be behind it. You can update it with the new
+changes in the remote repo.
+This is referred to as **pulling** from GitLab, as this is achieved by the command
+[`git pull`](#download-the-latest-changes-in-the-project).
+
+## Basic Git commands
+
+For the purposes of this guide, we will use this example project on GitLab.com:
+[https://gitlab.com/gitlab-tests/sample-project/](https://gitlab.com/gitlab-tests/sample-project/).
+
+To use it, log into GitLab.com and fork the example project into your
+namespace to have your own copy to playing with. Your sample
+project will be available under `https://gitlab.com/<your-namespace>/sample-project/`.
+
+You can also choose any other project to follow this guide. Then, replace the
+example URLs with your own project's.
+
+If you want to start by copying an existing GitLab repository onto your
+computer, see how to [clone a repository](#clone-a-repository). On the other
+hand, if you want to start by uploading an existing folder from your computer
+to GitLab, see how to [convert a local folder into a Git repository](#convert-a-local-directory-into-a-repository).
+
+### Clone a repository
+
+To start working locally on an existing remote repository, clone it with the
+command `git clone <repository path>`. You can either clone it via [HTTPS](#clone-via-https) or [SSH](#clone-via-ssh), according to your preferred [authentication method](#git-authentication-methods).
You can find both paths (HTTPS and SSH) by navigating to your project's landing page
and clicking **Clone**. GitLab will prompt you with both paths, from which you can copy
and paste in your command line.
-As an example, consider this repository path:
+For example, considering our [sample project](https://gitlab.com/gitlab-tests/sample-project/):
-- HTTPS: `https://gitlab.com/gitlab-org/gitlab.git`
-- SSH: `git@gitlab.com:gitlab-org/gitlab.git`
+- To clone through HTTPS, use `https://gitlab.com/gitlab-tests/sample-project.git`.
+- To clone through SSH, use `git@gitlab.com:gitlab-tests/sample-project.git`.
-To get started, open a terminal window in the directory you wish to clone the
+To get started, open a terminal window in the directory you wish to add the
repository files into, and run one of the `git clone` commands as described below.
Both commands will download a copy of the files in a folder named after the project's
-name. You can then navigate to the new directory and start working on it locally.
+name and preserve the connection with the remote repository.
+You can then navigate to the new directory with `cd sample-project` and start working on it
+locally.
#### Clone via HTTPS
-To clone `https://gitlab.com/gitlab-org/gitlab.git` via HTTPS:
+To clone `https://gitlab.com/gitlab-tests/sample-project/` via HTTPS:
```shell
-git clone https://gitlab.com/gitlab-org/gitlab.git
+git clone https://gitlab.com/gitlab-tests/sample-project.git
```
-You'll have to add your password every time you clone through HTTPS. If you have 2FA enabled
-for your account, you'll have to use a [Personal Access Token](../user/profile/personal_access_tokens.md)
-with **read_repository** or **write_repository** permissions instead of your account's password.
-
-If you don't have 2FA enabled, use your account's password.
-
TIP: **Troubleshooting:**
On Windows, if you entered incorrect passwords multiple times and GitLab is responding `Access denied`,
you may have to add your namespace (user name or group name) to clone through HTTPS:
@@ -179,16 +245,44 @@ To clone `git@gitlab.com:gitlab-org/gitlab.git` via SSH:
git clone git@gitlab.com:gitlab-org/gitlab.git
```
-### Switch to the master branch
+### Convert a local directory into a repository
-You are always in a branch when working with Git. The main branch is the master
-branch, but you can use the same command to switch to a different branch by
-changing `master` to the branch name.
+When you have your files in a local folder and want to convert it into
+a repository, you'll need to _initialize_ the folder through the `git init`
+command. This will instruct Git to begin to track that directory as a
+repository. To do so, open the terminal on the directory you'd like to convert
+and run:
```shell
-git checkout master
+git init
```
+This command creates a `.git` folder in your directory that contains Git
+records and configuration files. We advise against editing these files
+directly.
+
+Then, on the next step, add the [path to your remote repository](#add-a-remote-repository)
+so that Git can upload your files into the correct project.
+
+#### Add a remote repository
+
+By "adding a remote repository" to your local directory you'll tell Git that
+the path to that specific project in GitLab corresponds to that specific
+folder you have in your computer. This way, your local folder will be
+identified by Git as the local content for that specific remote project.
+
+To add a remote repository to your local copy:
+
+1. In GitLab, [create a new project](../gitlab-basics/create-project.md#push-to-create-a-new-project) to hold your files.
+1. Visit this project's homepage, scroll down to **Push an existing folder**, and copy the command that starts with `git remote add`.
+1. On your computer, open the terminal in the directory you've initialized, paste the command you copied, and press <kbd>enter</kbd>:
+
+ ```shell
+ git remote add origin <git@gitlab.com:username/projectpath.git
+ ```
+
+After you've done that, you can [stage your files](#add-and-commit-local-changes) and [upload them to GitLab](#send-changes-to-gitlabcom).
+
### Download the latest changes in the project
To work on an up-to-date copy of the project (it is important to do this every time
@@ -219,16 +313,16 @@ git remote -v
The `-v` flag stands for verbose.
-### Add a remote repository
+## Branching
-To add a link to a remote repository:
+If you want to add code to a project but you're not sure if it will work properly, or you're
+collaborating on the project with others, and don't want your work to get mixed up, it's a good idea
+to work on a different **branch**.
-```shell
-git remote add <source-name> <repository-path>
-```
-
-You'll use this source name every time you [push changes to GitLab.com](#send-changes-to-gitlabcom),
-so use something easy to remember and type.
+When you create a branch in a Git repository, you make a copy of its files at the time of branching. You're free
+to do whatever you want with the code in your branch without impacting the main branch or other branches. And when
+you're ready to bring your changes to the main codebase, you can merge your branch into the main one
+used in your project (such as `master`).
### Create a branch
@@ -240,6 +334,16 @@ use a hyphen or underscore):
git checkout -b <name-of-branch>
```
+### Switch to the master branch
+
+You are always in a branch when working with Git. The main branch is the master
+branch, but you can use the same command to switch to a different branch by
+changing `master` to the branch name.
+
+```shell
+git checkout master
+```
+
### Work on an existing branch
To switch to an existing branch, so you can work on it:
@@ -279,7 +383,7 @@ git add <file-name OR folder-name>
git commit -m "COMMENT TO DESCRIBE THE INTENTION OF THE COMMIT"
```
-### Add all changes to commit
+#### Add all changes to commit
To add and commit (save) all local changes quickly:
@@ -293,10 +397,6 @@ The `.` character means _all file changes in the current directory and all subdi
### Send changes to GitLab.com
-NOTE: **Note:**
-To create a merge request from a fork to an upstream repository, see the
-[forking workflow](../user/project/repository/forking_workflow.md)
-
To push all local commits (saved changes) to the remote repository:
```shell
@@ -309,6 +409,10 @@ For example, to push your local commits to the _`master`_ branch of the _`origin
git push origin master
```
+NOTE: **Note:**
+To create a merge request from a fork to an upstream repository, see the
+[forking workflow](../user/project/repository/forking_workflow.md).
+
### Delete all changes in the branch
To delete all local changes in the branch that have not been added to the staging
@@ -353,7 +457,7 @@ git checkout <name-of-branch>
git merge master
```
-### Synchronize changes in a forked repository with the upstream
+## Synchronize changes in a forked repository with the upstream
[Forking a repository](../user/project/repository/forking_workflow.md) lets you create
a copy of a repository in your namespace. Changes made to your copy of the repository