Author: Lee-W
|
Education | Experience |
---|---|
|
|
那版本控制又是什麼...
占空間,難維護
Git只會記錄每一次有差異的部份
yum install git-core
Debian, Ubuntu
sudo apt-get install git
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝git
brew install git
git config --global user.name "Your Name"
git config --global user.email "Your Email"
懶人必備
git config --global alias."command alias" "original command"
下面是一些我常用的alias
git config --global alias.st status
git config --global alias.cmt commit
git config -–global alias.br branch
git config --global alias.ch checkout
git config --global -l
Repo Setting (當下專案的設定)
git config -l
git config --global -e
git init "some path"
如果不輸入path,就會初始在目前所在的資料夾 git init .
)
git status
不過我們已經透過alias把status設為st了
git st
接下來會說明各個stage代表的意義
untracked
(新的檔案,還沒加入git中)unmodified
(完成add,但還沒commit)modified
(add完後又做了修改)staged
(commit完成,到這個階段就已經完成紀錄)
git add "file name"
git add .
不過一般建議還是一個一個檔案add比較好
git commit
接著會進入編輯器,讓你輸入commit
預設的編輯器通常不是vi,可以透過這個指令設定
git config --global core.editor "vim"
git log
commit後面的文字是SHA1碼,是每一個commit獨有的一組編號
敘述這次做的修改
git commit --amend
將剛剛的commit修改成,更具有意義的內容
git diff "target"
常見的target
"SHA1" | 與SHA1碼對應的commit |
master~1 | master的前兩次commit |
master^ | 等效master~1 |
master^^ | 等效master~2 |
git diff a b
git diff
git diff --staged
git checkout "file name"
git reset "file name"
git reset "可被辨識的commit SHA1碼"
commit後面那串就是每個commit自己的SHA1
reset後"不會"回到到第一次commit的狀態
所有檔案的內容還是跟reset前一樣
只是commit的紀錄回到了第一個commit (只是把存檔點往前移)
這時候要git checkout hi2.txt
(執行回到存檔點的動作)
hi2.txt才會回到第一次commit時的內容
git reset --HARD "可被辨識的commit SHA1"
git reflog
git reset HEAD~n
git reset HEAD~n "file name"
再對這個檔案進行checkout就會回到目前commit完成的狀態
???...
沒關係,看看下一頁的例子吧
這是git log現在的內容
待會會看第一個commit 94dc 和第三個commit 4f03 |
上面cat的結果是commit 4f03 中 hi.txt的內容
下面則commit 94db 中 hi.txt的內容 |
reset 到兩次以前的commit
|
checkout
|
echo "filename" >> .gitignore
echo "*.swp" >> .gitignore
先將他從版本庫移除
git rm --cache "file name"
接著再做一次上一頁的步驟,就可以ignore了
git config --global core.excludesfile "path to global gitignore"
gitignore.io提供了不同語言.gitignore範本
透過git-extras的git ignore-io可以直接從command line取得範本
另外git-extras的git ignore,也能讓ignore file更輕鬆
git rm "file name"
git rm --cache "file name"
git mv "old name" "new name"
git branch "branch name"
創造分支後,我們依然會留在原本的分支上,必須用下面的方法切換到新的分支上
git checkout "branch name"
git checkout -b "branch_name"
branch並不是真正的copy,比較像是一個書籤
它只是一個指到某一個commit
實際上git還是以這些sha碼來辨別該到哪一個紀錄
我們在my-branch跟master上都做了修改,並分別commit後
就能比較明確看出分支的效果
這時候就可以看到master跟branch指向不同的commit
也不再是同一條線上
git merge "branch name"
通常會在branch修改完並commit後,切換到master才merge
git branch -d "branch name"
git branch -D "branch name"
完全不同的內容,git會怎麼處理呢?
來看一下現在status長怎樣
git 已經幫我們判斷其他檔案並沒有衝突
只剩下hi.txt有無法被演算法整併的內容
git branch -m "oldname" "newname"
git branch -m "newname"
git tag -a "tag name"
git tag
git show "tag name"
git remote add origin https://github.com/Lee-W/Git-Tutorial-Sample.git
git push -u origin master
git remote add "remote-name" "remote url"
git remote -v
git push -u "remote name" "branch name"
-u 可以讓git記住下一次如果只下git push的command
git branch --all
可以看到遠端的master分支已經存在了
git push --all
git config --global credential.helper cache
這個指令可以幫我們記住帳號密碼15分鐘
git clone "repo url"
git pull "remote name" "branch name"
建議在在每一次要開始寫code前,都進行pull,確保現在的程式碼是最新的
git remote rename "old name" "new name"
刪除Remote
git remote rm "remote name"
git fetch
git branch -a
git checkout "branch name"
git clone "url" --branch "branch name" --single-branch "directory"
如果不指定directory,就會clone到當前目錄
git push -d "remote name" "branch name"
git remote prune "remote name"
git push "remote name" "tag name"
git push "remote name" --tags
git log
有很多功能可以幫助我們容易理解log
git log --decorate
git log --all
git log --graph
git config --global alias.lg "log --grpah --decorate --all"
git log --follow "file name"
git show "commit or tag"
git show "commit":"file name"
這時候線圖看起來會是這樣的
my-branch比master多了一個commit
git就會警告我們必須要先commit或stash
但我們可能還沒有做到一個適合commit的階段
這時候就能用stash暫存起來
git stash
這時候hi.txt就會回到原本的狀態
git stash list
這裡的stash@{0}就是之後要取回這個暫存使用的名稱
git stash apply "stash name"
如果不指定stash name就會直接取回上一次的stash
這時候就能看到
hi.txt又變成我們更改過後的狀態
git stash drop "stash name"
如果不指定stash name就會drop最上面的stash
這裡只會介紹基本的interactive rebase
假設我們多了兩個commit
其中有一個commit只是修復打錯字
我們希望能把它整併進上一個commit
git rebase -i "SHA1"
找出SHA1這個commit以後(不包含這個commit)的commit進行rebase
接著就會進入rebase的互動介面
下面有說明可以進行哪些動作
再去看log就會發現typo這個commit不見了
git rebase --abort
放棄這次的rebase
git pull --rebase
它可避免pull遠端branch時,造成無謂的merge節點
git submodule add "repo url" "some path"
假設要把現在這份投影片的repo
加入原本的專案
git submodule foreach --recursive git pull "remote name" "branch name"
也可以進入submodule裡面進行一般的pull
git clone --recursive "url"