現在開始學Git

從頭建立 Repository:

mkdir sandbox
cd sandbox
git init

加到Stage

git add <list of files>
git add --all                 // add all files
git add *                     // add all files
git add *.txt                // add all txt file at current directory
git add doc/*.txt            // add all txt file at doc directory
git add docs                // add all file at doc directory
git add "*.txt"             // add all txt file at whole project

遞交

git commit -m "A message"

Log

Link : Pro git:git log

git log --pretty=format:'"%s" %h %s %d' --graph

Status

git status

Branch 分支

開新分支

git branch [branch name]

// 建立bugWork分支在HEAD的 上 第二parent 上面
git branch bugWork HEAD^^2^

切換分支

git checkout [branch name]

合併分支

git merge [branch name]

// 把Head 放到 A branch後面
git rebase [A branch name]

// 把B branch 放到 A branch後面
git rebase [A branch name] [B branch name]

移動 Commit

// 複製幾個 commit 並且接在你目前的位置(HEAD)下面
git cherry-pick <Commit1> <Commit2> <...>

// git interactive rebase
git rebase -i head~4 --aboveAll

修改

// 取消 並回到head上一個
// local
git reset Head~1

// 取消剛剛的 commit,但保留修改過的檔案。
git reset HEAD^ --soft

// 取消剛剛的 commit,回到再上一次 commit的 乾淨狀態。
git reset HEAD^ --hard

// 取消 產生新的commit,並註記取消
// remote
git revert Head

// 修改最後一次commit
git commit --amend

// 把stage 的檔案unstage
git reset HEAD <file>

// 把修改過的檔案回到未修改狀態
// git checkout -- <file>

Tag

// git tag [version] [commit name]
git tag v0 Commit1
// Head 分離,head指向v0
git checkout v0

git tag -l

// push tags
git push --tags
// or if you are looking to push a single tag:
git push origin <tag_name>

git bisect(一個找尋有 bug 的 commit 的指令)
git describe 可以幫助你了解你離最近的 tag 差了多少個 commit。
git describe <ref>
<ref> 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(HEAD)。
// output : <tag>_<numCommits>_g<hash>
//          v1_2_gC2    C2 距離 v1 2個commit

Remote

git clone

git fetch

git pull // fetch + merge

git push

git pull --rebase // fetch + rebase

// git push <remote> <place>
// 先到我的 repo 中的 "master" branch,抓下所有的 commit,然後到叫作 "origin" 的 remote 的 "master" branch,檢查 remote 的 commit 有沒有跟我的 repo 一致,如果沒有,就更新。
git push origin master

// git push origin <source>:<destination>
// 把branch foo,push 到 remote 的 master
git push origin foo:master

// 動作:移除remote side
git push origin :side
// 動作:新增local bugFix
git fetch origin :bugFix

git pull origin bar~1:bugFix // 相當於:
git fetch origin bar~1:bugFix; git merge bugFix

Track

// 法1
// 建立一個新的 totallyNotMaster branch 並且它會 track o/master。
git checkout -b totallyNotMaster o/master

// 法2
// 你就會看到 foo branch 被設定成 track o/master
git branch -u o/master foo
// 如果你現在已經 checkout 到 foo 這個 branch 上面了,你就可以省略掉它:
git branch -u o/master

認識Head

Head會藏在目前支線的後面,例如:Master -> X,則Head -> Master -> X

分離Head

// Master -> X
// Head -> X
git checkout [commit name]

移動Head

// 移動到Master的上面
git checkout Master^

// 移動到Master的上上面
git checkout Master^^

// 移動到Master的上面4位
git checkout Master~4

// (強制)移動 master 指向從 HEAD 往上數的第三個 parent commit。
git branch -f master HEAD~3

Setting

# ~/.gitconfig                                         // global 相關設定都在這
git config --global user.name "yume190"                // who gets credit for changes
git config --global user.email "yume190@gmail.com"     // what email you use
git config --global color.ui true                       // pretty command line colors

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.lg '--pretty=format:"%h |%d%s [%an]" --graph --date=short'

//看 Git 設定內容
git config --list

git checkout -b SizeClass –track origin/SizeClass

移除已加入的 ignore file

First commit any outstanding code changes, and then, run this command:

git rm -r --cached .

This removes any changed files from the index(staging area), then just run:

git add .

中文教學

英文教學

Slide

Git book

互動學習