• Thế Giới Giải Mã

    Bí ẩn nhân loại Leonardo Da Vinci

  • Thế Giới Giải Mã

    Anh hùng thầm lặng Nikola Tesla

  • Thế Giới Giải Mã

    Thần đèn Thomas Edison

  • Thế Giới Giải Mã

    Người thôi miên Adolf Hitler

Showing posts with label Git. Show all posts
Showing posts with label Git. Show all posts

25 July 2021

Git basic

Bạn có thể tự hỏi rằng tại sao mỗi commit id trong Git lại là một chuỗi ký tự lằng nhằng khó nhớ. Bởi vì đó là cách mà Git nhận biết thay đổi khi chúng ta sửa một file nào đó, git sẽ tiến hành chạy giải thuật hash lại tất cả content và chỉ cần thay đổi một ký tự trong một file thì một hash mới sẽ được tạo (giải thuật SHA1), mỗi hash như là một commit id, nó là duy nhất trong history.


Những commit trong Git như là một danh sách liên kết, mỗi commit chứa thông tin về: commit id, tree, parent (trỏ về commit trước đó), author, ..

Một git model điển hình


Chúng ta sẽ tìm hiểu kỹ hơn về git commands trong phần tiếp theo.

git init

Tạo mới một Git repo và add thư mục .git vào trong dự án của bạn.

git clone

Clone một repo có sẵn trên github. Bạn có thể clone bằng HTTPS link hay SSH links. Thực chất bên trong git clone, đầu tiên nó sẽ chạy git init trước, sau đó git clone sẽ copy tất cả files từ remote về local.

git add

Thêm những file mà bạn đã tạo mới hay sửa đỗi trong working directory lên staging area.

git add <file> (thêm một file cụ thể vào staging)

git add . (thêm tất cả các file đang bị thay đổi vào staging)


Trong sơ đồ ở trên chúng ta có 3 thành phần:

  • Working Directory là thư mục chúng ta đang làm việc, bao gồm những file ở máy local
  • Staging Area (hay là Index) là khu vực lưu những file chuẩn bị được commit.
  • History (hay là Commit Area) là khu vực lưu tất cả những file sau khi commit từ Staging Area.

Một flow thông thường là chúng ta sửa một vài file ở working directory (local) => sau đó chúng ta sử dụng git add để đẩy những file đó lên staging và sau đó sử dụng git commit để commit lên history của Git.

  • git add files(tên files cần add), git add -a, git add .
  • git reset files(tên files cần reset) hoặc git reset HEAD~1 hay commit id
  • git checkout files(tên file cần checkout)

Bạn có thể sử dụng git status để kiểm tra xem hiện tại những file của mình đang sửa đổi ở trạng thái nào (local, staging, hay đã commit)

git commit

Khi bạn có một commit mới f0cec thì HEAD và con trỏ được di chuyển tới commit đó và nó trỏ về cha của nó là commit ed489

Minh hoạ cho git commit:


Khi bạn lỡ commit sai message bạn có thể sử dụng lệnh: git commit --amend -"Update commit message" để sửa đổi lại commit trước đó mà nó sẽ không tạo thêm commit mới.


Commit ed489 là commit sai và sau đó –amend tạo ra một commit mới là 4ca87. Nhưng trong history của bạn commit ed489 sẽ bị huỷ bỏ và ko nằm trong history.

Những lưu ý khi sử dụng git commit

  • Nên chia nhỏ commit theo từng mục đích, nên tránh sử dụng git add . để commit tất cả các file
  • Commit nhỏ giúp người review code dễ đọc và hiểu code bạn hơn
  • Commit nhỏ dễ reset và revert code hơn
  • Viết commit message rõ ràng về thay đổi của bạn, đảm bảo người đọc hiểu bạn thay đổi gì.

git checkout

Dùng để thay đổi branch làm việc, hay bạn có thể checkout một commit trước đó trên branch hiện tại của bạn.


Bạn đang ở branch main và checkout qua branch stable.

Hay bạn có thể dùng checkout để tạo branch mới (branch new) hoàn toàn từ một branch và chuyển qua làm việc trên branch mới tạo. Ví dụ như:


  • git pull: lấy code mới nhất từ remote về working directory (local)
  • git push: đưa những thay đổi ở local branch lên remote branch
  • git fetch: lấy tất cả thay đổi ở remote về local, ví dụ như: có tag mới, branch mới ở remote.

Xem lại sơ đồ ở trên.

Detached HEAD

Thỉnh thoảng bạn muốn checkout từ một commit id của một nhánh (để chỉ muốn tạo một nhánh mới từ những thay đổi của commit đó). Bạn có thể sử dụng lệnh:

git check <commit-id>

git checkout HEAD~3


Sau khi HEAD trỏ về commit b325c, chúng ta có một Detached HEAD như sau:


Với Detached HEAD nếu bạn không tạo một nhánh từ đây thì khi bạn checkout sang nhánh khác (ví dụ nhánh main) thì Detached HEAD sẽ mất.

Cho nên nếu bạn muốn lưu lại Detached HEAD, bạn phải tạo một nhánh mới như sau:

Bạn chạy lệnh git checkout -new để tạo một nhánh mới hoàn toàn từ Detached HEAD. Và bạn đã lưu nhánh new lại, bạn có thể tự do checkout sang nhánh khác.

Hay bạn có thể thực hiện quá trình này bằng cú pháp rút gọn như sau:

git checkout <commit-id> -b new

Lệnh nào vừa checkout từ một commit và sau đó tạo một nhánh mới tên new.

git reset

git reset dùng để thay đổi con trỏ trong một branch về một commit trước đó. Và nó sẽ thay đổi working directory và staging của nhánh hiện tại chúng ta đang đứng.

Ví dụ như chúng ta reset con trỏ về HEAD~3 (trỏ về trước HEAD 3 commit) trên một nhánh như sau:

Working directory và staging sẽ thay đổi dựa vào những option bạn chọn như sau:
  • –mixed (default): giữ lại những file bạn đang sửa trên disk, xoá những file trên staging.
  • –soft: giữ lại những file hiện tại bạn đang sửa trên disk và staging. Chuyển commit nhưng ko làm thay đổi file đang sửa và ko xoá file trên staging.
  • –hard: xoá bỏ tất cả files thay đổi trên disk (working directory) và staging. Tất cả những file trên disk và trên stage đều bị reset về giống hệt như commit ở HEAD~3.

Nếu bạn không truyền commit id thì mặc định là git reset HEAD. Nó không làm thay đổi con trỏ trên branch nhưng nó sẽ xoá file bạn đang thay đổi tuỳ thuộc vào option(–mixed, –soft, –hard) mà bạn chọn.

git revert

git reset không tạo mới commit, trong khi đó git revert sẽ “undo” lại tất cả những thay đổi của một commit mà chúng ta chỉ định và tạo mới một commit mới trên history.


Lệnh git revert C2 sẽ tạo ra một commit mới C4 và bỏ (undo) lại tất cả thay đổi của commit C2.

git merge

Merge có nghĩa là lấy tất cả thay đổi của một nhánh khác để apply cho nhánh đang đứng. Ví dụ merge master branch vào feature branch hay ngược lại merge feature branch vào master branch để release một bản production mới.

Bạn đang đứng ở feature và chạy git merge master




Tất cả những commit, thay đổi (màu xanh dương) sẽ được merge vào nhánh feature (màu xanh lá) và tạo thành một commit mới ở cuối nhánh feature. Hai commit màu xanh dương được gộp vào một commit màu xanh lá.

git rebase

Cũng giống như git merge, git rebase sẽ lấy tất cả thay đổi của một nhánh khác để apply cho nhánh đang đứng. Nhưng với history đẹp hơn git merge 😀

Vi dụ: bạn đang đứng ở nhanh topic và chạy git rebase main


Sau khi chạy lệnh rebase thì nhánh topic sẽ chứa tất cả những commit mới của main. Và hai commit màu vàng được thay thế cho 2 commit cũ trên nhánh topic (mỗi tên gạch nối). Và hiện tại nhánh topic sẽ bao gồm 6 commit (2 commit trên nhánh topic trước khi rebase và 4 commit của nhánh main).

Với rebase để dễ hình dung, bạn có thể hiểu rebase có nghĩa là thay đổi “base” của một nhánh (ví dụ ở đây là nhánh topic). Trước khi rebase, “base” của nhánh topic trỏ vào commit a47c3, nhưng sau khi rebase, chúng ta chỉ đơn giản đổi “base” trỏ về HEAD của main (commit da985).

Git rebase không thêm node mới (commit mới) vào history như git merge (trước và sau rebase chỉ có 6 commit – không tạo thêm commit thừa cho history – clean history 😀 )

Và khi đọc vào history của nhánh topic sau khi rebase bạn nhìn thấy được những thay đổi gì đã xảy ra trên nhánh main với các commit a47c3, b325c, c10b9, da985.

Khác với git merge, trong hợp này nếu bạn chạy git merge main thì khi nhìn vào history của nhánh topic bạn sẽ không thấy những commit từ main, bởi vì nó đã gom lại chỉ một commit duy nhất như sau:


Tuỳ thuộc vào bạn chọn git rebase hay git merge, nhưng tôi thường sử dụng git merge vì tôi không cần một clean history và đôi khi git rebase gây khó hiểu và cách sử dụng của git merge dễ hiểu hơn đối với tôi.

Bạn có thể thấy giải thích cách hoạt động của rebase khá khó và gây nhầm lẫn cho nhiều dev. Nên để đơn giản bạn có thể sử dụng git merge.

git cherry-pick

git cherry-pick tạo ra một bản copy của một commit từ một nhánh khác và apply vào nhánh hiện tại với cùng message và thay đổi từ commit đó.


Bạn đang đứng ở nhánh main và cherry-pick một commit 2c33a từ nhánh topic vào nhánh main. Kết quả như hình trên, có một commit mới f142b được tạo ra trên nhánh main.

git stash

Khi bạn thay đổi một số file và bạn muốn checkout sang nhánh khác. Lúc này git sẽ không cho bạn checkout sang nhánh khác nếu bạn chưa commit những thay đổi hiện tại, hay nếu bạn cố tình đi qua nhánh khác có thể những file bạn đang thay đổi (sửa, thêm) sẽ bị mất.

Trong trường hợp này bạn có thể dùng git stash dùng để lưu lại những thay đổi trên working directory để sử dụng lại sau này.

Một số lệnh git stash thường dùng:

  • git stash (tạo một stash)
  • git stash push (tạo một stash), git stash push -m “my-stash” (tạo một stash với message để dễ nhớ)
  • git stash pop. stash@{2} (xoá một stash) – stash@{2} được lưu như một stash id trong danh sách các stash, stash list là một ngăn xếp (stack)
  • git stash apply stash@{2} (apply stash trở lại nhánh hiện tại)
  • git stash list (liệt kê tất cả các stash)
  • git stash clear (xoá tất cả stash)

20 May 2021

When rebase encountered an error displayed in the terminal - GIT

When Rebase
2021
interactive rebase in progress; onto 9012ff4 
# Last command done (1 command done): 
# pick fc439d4 Fix responsive intro, home, user-info-overview 
# No commands remaining. 
# You are currently rebasing branch 'feature/abcd' on '9012ff4'.
2021
Fix this here!
git config --global core.editor nano

03 August 2019

Xóa tất cả lịch sử commit trên git giữ lại commit hiện tại - Delete commits history with git commands - GitHub

Phương pháp thứ nhất - First Method

Xóa thư mục .git có thể gây ra các vấn đề trong kho git của chúng bạn. Nếu chúng ta muốn xóa tất cả lịch sử commit, nhưng giữ các code trong tình trạng hiện tại của mình, hãy thử điều này:
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master
Điều này sẽ không giữ lại lịch sử các commit cũ. Nhưng nếu điều này không làm việc, hãy thử các phương pháp tiếp theo dưới đây.

Phương pháp thứ hai - Second Method

# Clone the project, e.g. `myproject` is my project repository:
git clone https://github/heiswayi/myproject.git

# Since all of the commits history are in the `.git` folder, we have to remove it:
cd myproject

# And delete the `.git` folder:
git rm -rf .git

# Now, re-initialize the repository:
git init
git remote add origin https://github.com/heiswayi/myproject.git
git remote -v

# Add all the files and commit the changes:
git add --all
git commit -am "Initial commit"

# Force push update to the master branch of our project repository:
git push -f origin master
Chú ý: Bạn có thể cần phải cung cấp các thông tin cho tài khoản GitHub của bạn.

12 May 2018

Cannot read property 'length' of undefined GIT & ANGULAR 2+

ERROR in TypeError: Cannot read property 'length' of undefined
    at createSourceFile (E:\My JOB\Free Code\node_modules\typescript\lib\typescr
ipt.js:15457:109)
Answer: npm install -g @angular/cli

10 November 2017

GIT story

Tổng hợp lệnh cmd làm việc với GIT
GIT 
/*--[Clone code]--Checkout--*/
git clone https://server/namespace/project.git

/*--[0]--Init git flow--*/
--Khởi tạo và lấy branch master và develop
git flow init 
khi chạy lệnh này chúng ta chỉ việc nhất enter cho tới khi chạy hết thì dùng lệnh tiếp theo để xem có nhánh develop & master chưa
git branch 
Xem danh sách các nhánh

/*--[1]--Create feature branch--*/
--Tạo mới một branch có tên 'feature/ABC'
--lệnh flow start là tạo branch và bắt đầu tại điểm develop header
git flow feature start ABC
--lệnh checkout -b là tạo branch mới nhưng không nằm tại điểm develop header hạn chế dùng lệnh này
git checkout -b feature/ABC

/*--[2]--Push source to origin--*/
--Lựa chọn file đưa lên git
git add *
--Commit file đã chọn
git commit -am "message"
--Push đẩy source vào branch
git push origin feature/ABC

/*--[3]--Rebase Fix conflic--*/
--Kéo source mới từ remote develop về khi chạy xong tool code sẽ chỉ ra các phần bị conflic develop với nhánh 'feature/ABC'
git pull --rebase origin develop
--Sửa lại các file có conflic lựa chọn phần code phù hợp và save file xong
git add *

/*--[3.1]--VD: Thông báo conflic trên IDE VScode--*/
- Accep current change - lấy mới nhất từ develop
- Accep comming change - lấy code của tôi
- Accep aboth lấy cả hai
- Note: lưu ý nhớ save file sau khi chỉnh sửa file nào đó

/*--[4]--Fix conflic --continue--*/
--Sau khi add all các file bị conflic vừa sửa ngon thi tiếp câu lệnh
git rebase --continue
--Lại thấy hiển thị tiếp conflic thì lại chọn phần code phù hợp và save file xong
git add *
--Sau khi add lại tiếp câu lệnh
git rebase --continue

/*--[5]--Push source code--*/
--cứ lặp đi lặp lại khi nào hết conflic thì đầy source hợp nhất của develop + feature/ABC lên nhánh feature/ABC
git push -f origin feature/ABC
NOTE: only use -f after using rebase

/*--[5.1]--Nếu muốn hủy rebase--*/
git rebase --abort

/*--[6]--Request merge source to develop--*/
/*--Rebase lùi về 4 commit--*/
git rebase -i HEAD~4
git push origin <branch> -f
/*-- Squash commit --*/
git rebase -i <id> or HEAD~4

change pick => squash
(Không sửa pick đầu tiên chỉ sửa squanh cái thứ hai trở đi)

Note: vim
i insert
:wq save
Esc thoát

git push origin -f <branch_name>
/*--Edit message commit trên remote--*/
git commit --amend -m "New commit message"
git push <remote> <branch> --force or -f
/*--MỘT SỐ LỆNH CẦN DÙNG NHIỀU NHẤT BỔ SUNG--*/
--Đăng nhập Git
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

/*--Remote tới repository--*/
git remote add origin https://github.com/id1945/react-shopping-cart.git

/*--Thay đổi URL Remote--*/
git remote set-url origin https://github.com/id1945/reactjs-redux.git

/*--Remove github or gitlab--*/
git remote remove github
git remote remove gitlab

/*--Remote add  github or gitlab--*/
git remote add gitlab https://xxx/xxx.git

/*--Kiểm tra thông tin xác thực gitHub... mọi lúc!--*/
Mọi thứ diễn ra tuyệt vời cho đến khi tôi commit những thay đổi của mình. 
Mọi lần commit đều kiểm tra thông tin đăng nhập mới!
Tôi không muốn nhập username và password GitHub của mình mỗi lần tôi commit thứ gì đó.
Tôi đã dùng thử cách này và nó đã không thông báo nữa.
git config --global credential.helper wincred

--Kiểm tra file nào đã bị thay đổi
--Màu đỏ là bị thay đổi, sau khi dùng git add * thì sẽ màu xanh lá cây
git status

--Kiểm tra đang ở nhánh nào
git branch

--Lệnh Xóa branch trên local
git branch -D feature/ABC

--Lệnh xóa branch trên remote
git push origin --delete feature/ABC

--Chuyển sang nhánh khác
git checkout .
git checkout feature/DEF

--Undo code toàn bộ
git checkout -- .

--Undo một file
git checkout -- <file_name>

--Undo code có lựa chọn
git checkout -p

--Kéo source mới nhất từ develop về
git pull origin develop

-- Đưa về id, toàn bộ commit phía sau bị xoá khỏi graph
git reset --hard <id>
NOTE: Tuy nhiên bạn vẫn có thể quay lại commit id đó nếu bạn copy và lưu id đó.

-- Đưa về id, vẫn giữ code của commit phía sau ở trang thái đã được add
git reset --soft <id>

-- Đưa về id, vẫn giữ code của commit phía sau ở trạng thái chưa được add
git reset --mixed <id>

--Khi lệnh reset --hard vô tác dụng chúng ta cần dùng
git reset --all
git reset --hard origin/{branch_name}

--Xem đồ họa Log của các branch cái nhìn tổng thể dễ hiểu
git log --all --graph --decorate
NOTE: bấm phím Q để thoát
git log -3 chỉ lấy 3 bản ghi

--REVERT COMMIT
git reset --hard <id>
git push -f origin (ten nhanh)

--Xem lại toàn bộ lịch sử commit
git reflog

--Kiểm tra lại các file sẽ xoa cho chắc
git clean -n

--Tiến hanh xoa bỏ
git clean -f

-- cherry-pick dùng để lấy code của id commit đó từ remote về branch hiện tại
git cherry-pick <id>
note: git cherry-pick để xem thêm các options lệnh (Cần xử lý conflic như rebase)

/*--Ignoring--*/
Ngăn chặn commit file
vd: file có đuôi .gitignore_global
git config --global core.excludesfile ~/.gitignore_global
hoặc folder node_module
git config --global core.excludesfile ~/node_modules

/*-- SSH KEY --*/
1.Generate ssh key:
ssh-keygen -t rsa -C "git@github.com:id1945/demo.git"
2.Add ssh key to gitlab
Go to C:/users/yourname/.ssh/id_rsa.pub and
Copy the content of that file
Use this data to add “ssh key” on gitlab (ssh key on Gitlab Profile Setting)
--Lệnh build source code AOT Angular
yarn build
or
ng build --prod
or
ng build --prod --base-href "/<repository-name>/"

---Optimizer
ng build --prod --build-optimizer

--Build debug JIT
yarn build:opt 'Không có debug'
of yarn build 'Có debug

--Update angular version
ng update @angular/core @angular/cli
or
ng update @angular/core @angular/cli --next

-- Pull project github to Stackblitz
https://stackblitz.com/fork/github/GITHUB_USER/GITHUB_REPOSITORY
Giết port đang chạy
netstat -a -n -o
taskkill -f /pid 7900

// Count log git
git log --author='id1945' --since='1 week ago' --oneline --shortstat -C
// LOCALHOST PUBLIC INTERNET
--Sử dụng ngrok--
Download | Document
ngrok http 8080 -host-header="localhost:8080"
ngrok http --host-header=rewrite 8080

--Access to localhost from other machine--
Bước 1: Cài đặt Windows Firewall turn off 3 trạng thái firewall
Bước 2: ng serve --host 0.0.0.0
Bước 3: test thử http://192.168.x.x:4200

--Eg
ng serve --port 8080 --host 192.168.53.180 or 0.0.0.0
/*-- NPM ---*/
npm i -D là viết tắt của npm install --save-dev
npm i -S là viết tắt của npm install --save

// Add cli into scripts package.json
npm pkg set scripts.prepare="husky install"
// Cách gỡ lỗi node_module
1. npm cache verify
2. xoá package-lock.json
3. xoá node_modules
4. npm install -f
// Tạo file test trên win
fsutil file createnew DummyTextFile1.txt 104857600
Convert GB to B 

// Xóa node-module
rm -rf node_modules (gitbass)
Refer: 
https://www.cloudways.com/blog/manage-branches-and-resolve-conflicts-git/
https://alligator.io/angular/custom-form-control/
https://github.com/angular/angular-cli/wiki
https://leochh.github.io/Notes/Frontend/Angular.html
Download tool git
https://git-extensions-documentation.readthedocs.io/en/latest/
Linux
Truy cập server linux sftp://developer@192.168.0.203/
Tổng hợp các lệnh gen với Angular CLI
Thành phần Sử dụng
Create App ng new myProject
Component ng g component my-new-component
Directive ng g directive my-new-directive
Pipe ng g pipe my-new-pipe
Service ng g pipe my-new-pipe
Class ng g class my-new-class
Guard ng g guard my-new-guard
Interface ng g interface my-new-interface
Enum ng g enum my-new-enum
Module ng g module my-module
Module + Router ng g m my-new-name --routing
service not spec ng g s guards/roleGuard --spec false
Remove ng destroy component app-testing

 

BACK TO TOP

Xuống cuối trang