GIT


# Tài liệu tham khảo

■Cơ chế hoạt động
https://git-scm.com/book/vi/v1/Ph%C3%A2n-Nh%C3%A1nh-Trong-Git-Nh%C3%A1nh-L%C3%A0-G%C3%AC%3F

https://www.atlassian.com/git/tutorials/setting-up-a-repository

http://backlogtool.com/git-guide/vn/
http://git.mikeward.org/

■GUI tool:
http://git-scm.com/downloads/guis

■Tool học qua simulator
https://try.github.io/levels/1/challenges/1
http://pcottle.github.io/learnGitBranching/

## Git Internals: Working directly with Git Objects

git hist
git cat-file -p <hash>
git cat-file -p <treehash>
git cat-file -p <libhash> // lấy 6 số đầu trong dãy hash của blob

## Git Internals: The .git directory

```
ls -C .git
cat .git/config
cat .git/HEAD
```
##lab 1:Kiểm Tra Cấu Hình

```bash
$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
```

##lab 2: Cấu hình

### Config user, email
```bash
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
```

```bash
$ git config user.name
Scott Chacon
```

### Trình Soạn Thảo

```bash
$ git config --global merge.tool vimdiff
```

https://git-scm.com/book/tr/v2/Customizing-Git-Git-Configuration

##lab 3: Tạo dự án

```bash
mkdir sonnh
cd sonnh
git add hello.txt
git commit -m "First Commit"
```

##lab 4: Kiểm tra trạng thái 

```bash
git status
```

##lab 5:Tạo thay đổi 

```bash
echo abc > a.txt
echo xyz >> a.txt // thêm line vào cuối file
```

##lab 6: Xem thay đổi vùng index (Staging Changes)

```bash
git add a.txt
git status
```

##lab 7:Staging and Committing

```bash
git add b.txt
git commit -m "Changes for a and b"
git add c.txt
git commit - m "unretlated to c"
git status
```

##lab 8:Committing Changes

```bash
git commit  -a -m "commit message"
//-a all
//-m message
```
Using Vim for add message


### Amending Commits

Để ko chia thành quá nhiều lần commit thì chúng ta sử dụng lệnh này
giúp cho log sáng sủa

```bash
git add hello.txt
git commit --amend -m "Add the same ticket-number fix"
git commit --amend -m "Nội dung message mới" // chỉ thay đổi message
```

##lab9: HELP

```bash
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
```
Ví dụ:

```bash
$ git help config
```

##lab 10: LOG

```bash
git log --pretty=oneline --max-count=2
git log --pretty=oneline --since='5 minutes ago'
git log --pretty=oneline --until='5 minutes ago'
git log --pretty=oneline --author=<your name>
git log --pretty=oneline --all
git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
```

##lab 11:Aliases

Mở file .gitconfig 

```bash
[alias]
  co = checkout
  ci = commit
  st = status
  br = branch
  hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
  type = cat-file -t
  dump = cat-file -p 
```
 
##lab12: Tạo TAG
 
 ```bash
 git tag v1
 git checkout v1
 ```
 
##lab 13: Removing Commits from a Branch by Tag

```bash
git reset --hard tagName
```

--hard param: Phản ánh tới cả working directory, thay đổi cả những phần chưa commit
--soft: giữ phần chưa commit
	
##lab 14:Delete tag

Remove the oops tag

```bash
git tab -d tagName
```

##lab 15: Xem thay doi

  ![GitDiffSimple.png](https://qiita-image-store.s3.amazonaws.com/0/42643/40e0e7c1-1d6b-080b-8702-7e607af2a5c4.png "GitDiffSimple.png")
 
##lab 16:Undoing Local Changes (before staging)
 
 Xóa bỏ các file chưa được add
 
 ```
 git clean --force 
 // option -d giúp clean các thư mục
 //-n option giúp show xem thay đổi
 
 ```
 
 ```bash
$ git clean -df
$ git checkout -- 

//or chỉ định name  
$ git checkout abc file
 ```
 
##lab 17: Phục hồi ở STAGE (before committing)

```bash
git reset HEAD badfile.txt
	
```

##lab 18: Phục hồi khi đã lỡ COMMITED (chưa push)

```bash
$ git revert HEAD --no-edit
$ git reset --soft HEAD~1 // Bỏ 1 commit và giữ lại thay đổi hiện tại
$ git reset HEAD~1 --hard //bỏ 1 commit cả phần đã commit và cả phần đang thay đổi hiện tại
$ git reset --hard origin/branch //để reset lại local cho khớp với trên remote.
$ git reset --hard <hash>//hoặc chỉ định đến bản hash tường minh
```

##lab 19: Phục hồi khi đã PUSH

```
$ git revert HEAD~1..HEAD

```

![gitPhuchoi.png](https://qiita-image-store.s3.amazonaws.com/0/42643/8dc34451-35e2-ceb0-cbd1-5ae73ba62d0b.png "gitPhuchoi.png")


##lab 20:Moving Files

```bash
mkdir lib
git mv hello.rb lib
git status

// or

mkdir lib
mv hello.rb lib
git add lib/hello.rb
git rm hello.rb
git commit -m "moving file"
```

##lab20: Creating a Branch

```bash
git branch newBranch
git checkout -b greet
```

-b: create branch

List branch:

```bash
git branch -a
git branch -l
git branche -r
```

##lab 21:switch Branches

```bash
git checkout greet
git checkout master
```

##lab 22:Merging

merge development into master

```bash
git checkout master
git merge development
```

##lab 23 Resolving Conflicts

Sau khi giải quyết conflict cần gọi lệnh sau để commit thay đổi

```bash
git add
git commit 
```



##lab 25 Show remote information

```bash
git remote
git remote show origin
git branch -r
```

Show all remote we have

```bash
git remote -v
```
Change name

```bash
git remote rename <old-name> <new-name>
```
origin -> enomemory

git remote add john http://dev.example.com/john.git
git clone URL

##lab 26 FETCH

Lay ve origin/master

```bash
git checkout master
git fetch
```

Merge to local master
git merge origin/master


##lab 27 PULL

Lấy và merge về Working tree

```bash
git pull
```
Bản chất tương đương:

```bash
git fetch
git merge origin/master
```

##lab 28 :TRACKING

```bash
git branch --track localbranchA origin/branchA
git branch -a
git hist --max-count=2
```

CHÚ Ý TRACKING nhầm thì lúc push sẽ bị nhầm
cần dùng lệnh 

```
git branch -vv //để show lại
//sau đó dùng lệnh thay đổi upstream để sửa
git branch -u DectBranch
```

##lab 29: PUSH

$ git push origin --delete serverfix

![PullFetchPush.png](https://qiita-image-store.s3.amazonaws.com/0/42643/deb8e02c-97aa-79bc-fd7a-e3173a2fc770.png "PullFetchPush.png")



##lab 30:Bare Repositories

Không tạo ra vùng working index

```bash
cd ..
git clone --bare hello hello.git
ls hello.git
```

##lab 31: STASH

Đây là một dạng bộ nhớ tạm dùng để lưu các thay đổi đang làm mà chưa commit, sau đó phục hồi code về nguyên trạng ban đầu trước khi có những thay đổi đó.

```
git stash
git stash list
```

Để phục hồi stash mới nhất vừa lưu nhưng không xoá nó:

```
git stash apply
```

Phục hồi và xóa khỏi stack stash

```
git stash pop
```

Để phục hồi một stash bất kì:

```
git stash apply stash@{1} (với stash@{1} là tên của stash đó)
```

Để huỷ bỏ một stash, dùng lệnh:

```
git stash drop stash@{1} (với `stash@{1} là tên stash cần xoá)
```

Xem chi tiết một stash:

```
git stash show -p stash@{0}
```


##lab 32 tạo PATCH file

Patch là một hình thức đóng gói các thay đổi thành 1 file, sau đó gửi đến cho người cần nhận những thay đổi đó.

Ví dụ bạn cần viết một đoạn script để thay đổi một số thứ trong dự án và muốn gửi những thay đổi này cho một người khác mà không muốn commit lên repository (vì có thể đây chưa phải là những thay đổi chính xác, cần thử nghiệm trước,…), giải pháp là tạo ra file patch, và người nhận file chỉ việc apply file patch này vào mà không cần phải thực hiện thao tác pull code.

Để tạo một file patch từ những thay đổi hiện tại trong dự án:

```
git diff > tên-file.patch
```

Nếu những thay đổi của bạn có kèm theo các dữ liệu binary (hình ảnh, blah blah,… không phải text như code), thì phải thêm vào tham số full-index và binary như sau (với SVN hoặc TFS thì chả cần):

```
git diff --full-index --binary > tên-file.patch
```

Ở phía người nhận, nếu muốn apply các thay đổi này vào dự án thì dùng lệnh sau:

```
git apply tên-file.patch
```

##Lab 33 Xem những commit chưa được push

Trong khi làm việc, có thể bạn tạo ra rất nhiều commit (tất nhiên là chưa push), nhưng lại không nhớ rõ là mình đã commit những gì, vào lúc nào, thì có thể dùng lệnh sau để liệt kê các commit đó:

git log origin/master..master

##SQUASH

Nhóm 1 số commit lại thành 1 rồi merge

```bash
git merge --squash --edit
```