Git 是一個用來做版本控制的好工具。
參考
Git名詞
檔案的三種狀態
- 已提交(committed):已被存(送)到repository中。
- 已修改(modified):已被修改但還沒存(送)到repository中。
- 改暫存(staged):檔案被暫時存放,下次commit的時候會被送出。
設定Git,(★config)
$ git config --global user.name "SkyNimo" #設定使用者名稱。
$ git config --global user.email "SkyNimo@gmail.com" #設定使用者信箱。
$ git config --list #列出你Git設定的內容。
#設定檔的位置在~/.gitconfit
$ git config --global apply.whitespace nowarn #忽略空白,有些語言會用到(Ruby)。
$ git config --global color.ui true #輸出時加上顏色。
#--global 表示為全域設定
Git的別名(alias)功能,(★alias)
$ git config --global alias.cl "config --list" #這樣git config --list 就等於git cl了
$
$ git cl #執行看看
user.name=SkyNimo
user.email=SkyNimo@gmail.com
alias.cl=config --list
建立資源庫(Repository),(★init)
複製(Clone)別人的Repository,(★Clone)
$ git clone webUrl #把目標網址的資源克隆(clone)下來
$ git clone webUrl SkyNimo #把目標網址的資源克隆(clone)下來,並把資料幾名稱改成SkyNimo
Git的常用指令,(★status, ★add, ★commit, ★log)
$ git status #顯示分支,被追蹤的檔案的狀態(status)。
$ git add fileName #使fileName加入(add)暫存(stage)中。
$ git add . #把有編輯過的檔案加入stage中,但是新增且還沒commit過的檔案不會加入。
$ git commit #把有stage的檔案送出(commit),並尋問你這次修改的內容。
$ git commit -m "Your Message." #把有stage的檔案送出(commit),不尋問並直接把"Your Message."送出。
$ git commit -am "Your Message." #先執行"git add ."再送出。
$ git commit --amend #修改上一次"Your Message"的內容。
$ git log #顯示過去commit的日誌(log),--stat更多資訊,-p檔案的更變內容。
Git黑名單,(★.gitignore)
在.gitignore這個檔案中的檔名不會被commit出去
分支(★branch, ★checkout)
$ git branch #用'*'號告訴你現在正在哪個分支(branch)。
$ git branch branchName #建立一個名為branchName的分支。
$ git branch -d branchName #刪除一個branch,-d => delete。
$ git branch -m oldName newName #branch改名
$ git branch branchName baseBranchName #以baseBranchName為起點建立一個新的branch。
$ git branch -r #列出所有遠端的 branch。
$ git branch -a #列出所有本地及遠端的 branch。
$ git checkout branchName #切換到branchName這個分支。
$ git checkout -b branchName #建立一個新的 branch 並切換到該 branch。
Git GUI,(★gitk)
$ gitk --all #開始Git GUI
$ gitk --all & #開始Git GUI,並讓終端機可以執行其他命令
整理與合併,(★merge, ★rebase, ★conflict)
可以參考
鴨七-chitsaou來看。
rebase
$ git rebase master #把目前的branch以master為參考基準接上去。
#重新定義參考基準
#移花接木,把"這個branch的改動"先保留,然後在最新的master branch上逐個加入"這個branch的改動",
#當發生衝突(conflict)時,就要手動merge然後再"git rebase --continue"。
#以下三行的重點是!!!「把還沒Push出去的東西,才可以rebase」!!!
#merge並公開之後(這邊我們稱A branch),請不要再用rebase,因為別人可能會用A branch做修改,
# 而你用rebase會把A branch的結果合並到master branch使A branch不見,
# 導至別人以A branch為參考修改後,但A branch卻不見了,只好再合併一次。
$ git rebase --onto baseBranch otherBranch #把otherBranch以baseBranch為參考基準接上去。
$ git rebase --onto baseBranch secondBranch otherBranch
#把secondBranch與otherBranch共同祖先的變動+上otherBranch自己的變動,
# 以baseBrach為參考基準接上去。
merge
$ git merge otherBranch
#合併otherBranch到目前的branch。
#參考編輯的時間順序把共同的branch與最新的master branch和自己的branch合併成一個master branch。
#當發生衝突(conflict)時,最後統一作修改。
conflict
<<<<<<<<< HEA
.
.#這個區間是你的branch產生的內容
.
==========
.
.
.#這個區間是你要合併的branchName的內容
.
.
.>>>>>>>>>branchName
#留下一個或改成你想要的內容,記得要把自動產生的<<<< ===== >>>>>刪掉並存檔,
#然後用git add把衝突的檔案加入stage再git commit。
查看差異,(★diff)
$ git diff branchName1 branchName2 #顯示出branchName1和branchName2的差異。
取消操作,(★reset, ★checkout --)
$ git reset --hard ORIG_HEAD #取消上一次的merge
$ git reset HEAD fileName #取消被add之後等待被送出的檔案(add之後檔案會被列到"Changes to be committed中等待commit)。
$ git reset HEAD^ #回到前一個版本,'^'表示上一個版本,(做過的修改還是會保留下來)。
$ git reset HEAD~2 #回到前兩個版本,'~2'表示前兩個版本(做過的修改還是會保留下來)。
$ git reset HEAD^ --soft #回到前一個版本,--soft(做過的修改會加入stage中等待下次commit)。
$ git reset HEAD^ --hard #回到前一個版本,--hard(做過的修改完全刪除,回到那個版本原來的樣子。
$ git reset --hard 3628164 #回到3628164這個版本
$ git checkout -- fileName #將檔案狀態回復到最新的一次 commit 時的狀態
利用SSH KEY讓電腦與遠端連線(一般終端機用)(這邊是用GitHub)
SSH KEY是類似密碼的東西,用來讓網路上的Reposiroty知道你是誰。
1.檢查SSH keys
如果你有發現
id_rsa.pub
或
id_dsa.pub 請跳到步驟 3
如果沒發現則繼續步驟 2
2.建立一個新的SSH key
預設的設定是很OK的,所以在 "save the key" 直接按下
Enter 就可以了!
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Administrator/.ssh/id_rsa):[Press enter]
Created directory '/home/Administrator/.ssh'.
然後會詢問你輸入密碼,直接Enter下去就是沒有密碼,建議要有。
Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type a passphrase again]
你大概會看到這些東西。
Your identification has been saved in /home/Administrator/.ssh/id_rsa.
Your public key has been saved in /home/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
e9:05:27:99:c7:c0:16:66:51:55:a5:db:fc:4e:95:dd your_email@example.com
然後把你新的key加入到ssh-agent
$ ssh-agent -s
Agent pid 59566
$ ssh-add ~/.ssh/id_rsa
如果你遇到"Could not open a connection to your authentication agent."這個錯誤訊息的話,先執行以下命令,然後再試一次。
3.把你的 SSH key 加到GitHub
複製你的key到剪貼簿你可以
$ clip < ~/.ssh/id_rsa.pub
或是
再右鍵複製。
到GitHub網站->設定->SSH keys->Add SSH key->[貼上到"key"]->Add key
4.試試看吧!
連線到GitHub,以後就只要這個指令就可以連過去了。
第一次進去你會看到這些訊息,更他說yes吧!
The authenticity of host 'github.com (192.30.252.131)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? [Press yes][Press Enter]
然後你就會進去啦!
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
遠端,(★remote, ★fetch, ★pull, ★push)
$ git remote #顯示所有遠端在"遠端名稱儲存庫"中的名稱(預設是origin)。
$ git remote -v #顯示有加入遠端儲存庫名稱,並顯示其網址。
$ git remote add [remoteName] gitUrl #新增遠端儲存庫並把名稱命名為remoteName。
$ git remote show [remoteName] #顯示遠端的資料。
$ git fetch [remoteName] #將遠端所有且本地端沒有的資料拉下來(只拉下來但不會合併)(不太懂)。
$ git pull [remoteName] [branchName] #★下載遠端的資源庫,自動擷取且合併遠端分支到目錄的分支。
#Pull == Fetch + Merge
#git pull origin == git fetch orgin + git merge origin/master
$ git push [remoteName] [branchName] #上傳到遠端的資源庫,如果不是主分支的話要用branchName。
$ git push [remoteName] :[branchName] #刪除遠端分支
$ git remote rename [remoteName] [customName] #將"遠端名稱儲存庫"中名稱改名。
#origin上的master分支就是origin/master
一些基本守則
- 「把還沒Push出去的東西,才可以rebase」!!
- 當你要Commit/送交Path時:
- 用git diff --check檢查行尾有沒有多餘的空白。
- 「每個Commit只改一件事情」
- 如果一個檔案有多個變更,用git add --patch只選擇檔案中的部分變更進Stage
- 寫清楚Commit Message!
Last Line.
留言
張貼留言