# GIT Basic
## Prerequisite
### Command line basics
Gunakan
- Terminal (Mac dan Linux)
- Git-bash (Windows)
Ganti folder
```bash
cd <nama folder>
cd .. # naik 1 folder
```
Buat folder
```bash
mkdir <nama folder>
```
## Basic
### Config
```bash
git config --global user.name <nama>
git config --global user.email <email>
```
### Intialization
Jika sudah mempunyai repo
```bash
git clone <url> <nama folder>
# Contoh
git clone https://github.com/pemiluhmif/voting-booth.git voting
```
Jika belum
```bash
git init # di folder baru
```
### Add, Commit, Push (ACP)
```bash
git add <nama file>
git commit -m <commit name>
git push <remote> <branch>
```
Contoh
```bash
git add prima.py
git commit -m "Menambah penghitung bilangan prima"
git push origin master
```
### Pull
```bash
git pull <remote> <branch>
```
## Intermediate
### Remote and branch
#### Remote
Remote adalah nama lain dari server untuk git, saat bekerja dengan banyak orang, tentu kode butuh ada di internet (misal: github)
Secara default git (jika clone) akan membuat remote dengan nama `origin` (asal). Hal ini bisa dilihat dengan
```bash
git remote -v
```
Jika kosong, itu hal normal jika membuat git dengan cara `git init` karena defaultnya akan buat git repo offline.
Cara menambahkan
```bash
git remote add origin <url>
# contoh
git remote add origin https://github.com/pemiluhmif/voting-booth.git
```
#### Branch
Branch atau cabang pada git berguna untuk >1 orang mengerjakan kode yang sama dengan efektif.
Secara default branchnya adalah dengan nama `master`
#### Resolve conflict
Jika suatu file conflict
```
CONFLICT (content): Merge conflict in <fileName>
Automatic merge failed; fix conflicts and then commit the result.
```
Maka kita harus betulkan konflik itu, caranya dengan membuka file yang konflik, edit, add, commit, push.
## Advanced
### Collaborative working
Misalkan ada sebuah repository yang ingin kalian edit, kalian tidak punya akses edit ke repo itu. Maka kalian harus `fork` repo tersebut
Nah lalu kalian tambahkan repo aslinya ke remote dengan nama bebas (biasanya `upstream`)
```bash
git remote add upstream https://github.com/bimoadityar/Test-pull-request.git
```
Saat kalian pull, pull lah dari remote yang upstream, contoh
```bash
git pull upstream master
```
Perintah tersebut akan meng-pull dari repo aslinya
Akan tetapi saat push tetap ke origin yang merupakan milik kalian
```bash
git push origin master
```
Barulah setelah itu kalian buka github, ada pilihan, `new pull request`
## User story
Contohnya kamu punya file
```cpp
#include <iostream>
int main(){
std::cout<<"Selamat datang di program ini"<<std::endl;
std::cout<<"1+1 = "<<1+1<<std:endl;
return 0;
}
```
Lalu ada kalian dan teman kalian, ingin menambahkan sapaan di bagian depan, masalahnya kalian kurang berkomunikasi, sehingga jadinya dua-duanya edit file tersebut untuk menambahkan sapaan, tapi kalian tambahkan halo sedangkan teman kalian hai. Teman kalian sudah push, saat kalian mau push, muncul pesan
```
To https://github.com/jrandiny/testTambah.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/jrandiny/testTambah.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
```
Kalian berpikir, "Oh ini error biasa, versi di server lebih baru, tinggal pull"
```bash
git pull origin master
```
Eh tapi malah muncul
```
CONFLICT (content): Merge conflict in tambah.cpp
Automatic merge failed; fix conflicts and then commit the result.
```
Tapi kalian sudah belajar di sekuro, cara resolve conflict
Kalian buka file tambah.cpp
```cpp
<<<<<<< HEAD
std::cout<<"Halo, selamat datang di program ini"<<std::endl;
=======
std::cout<<"Hai, selamat datang di program ini""<<std::endl;
>>>>>>> 4e2b407f501b68f8588aa645acafffa0224b9b78:Menambahkan hai
```
Kalian betulkan dengan cara pilih yang mau dipakai (misalkan kalian mau jadinya halo hai)
```cpp
#include <iostream>
int main(){
std::cout<<"Halo, Hai, Selamat datang di program ini"<<std::endl;
std::cout<<"1+1 = "<<1+1<<std:endl;
return 0;
}
```
Lalu kalian add, commit, dan push
Yay sudah tidak konflik