Git small note

Git 是一個用來做版本控制的好工具。




參考




Git名詞



檔案的三種狀態




  1. 已提交(committed):已被存(送)到repository中。


  2. 已修改(modified):已被修改但還沒存(送)到repository中。


  3. 改暫存(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)



找一個空的資料夾然後



$ git 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







$ ls -al ~/.ssh





如果你有發現 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."這個錯誤訊息的話,先執行以下命令,然後再試一次。



$ eval $(ssh-agent)








3.把你的 SSH key 加到GitHub



複製你的key到剪貼簿你可以



$ clip < ~/.ssh/id_rsa.pub




或是



$ cat ~/.ssh/id_rsa.pub




再右鍵複製。



到GitHub網站->設定->SSH keys->Add SSH key->[貼上到"key"]->Add key





4.試試看吧!



連線到GitHub,以後就只要這個指令就可以連過去了。



$ ssh -T git@github.com




第一次進去你會看到這些訊息,更他說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.

留言

這個網誌中的熱門文章

成人剪舌繫帶聽過嗎?我剪了!!

Scp - ssh 的遠端檔案傳輸指令

睡覺使你更有效率