常用的git指令

貓之良品發表於2016-04-27

配置個人資料

git config --global user.email william0760@qq.com
git config --global user.name "William Wen"
git config --list

生成公鑰SSH

安裝git,開啟Git Bash

ssh-keygen -t rsa -C "william0760@qq.com"

之後會生成id_rsa與id_rsa.pub
id_rsa.pub為公鑰,把它貼到託管網站(如github, git@OSC)
要注意託管程式碼需要使用SSH,不是HTTP

版本操作

git clone https://xxx : 提取遠端上的最新程式碼並初始化
git reset –mixed <commit_id>:此為預設方式,不帶任何引數的git reset,即時這種方式,它回退到某個版本,只保留原始碼,回退commit和index資訊
git reset –-soft <commit_id>:回退到某個版本,只回退了commit的資訊,不會恢復到index file一級。如果還要提交,直接commit即可
git reset –-hard <commit_id>:徹底回退到某個版本,本地的原始碼也會變為上一個版本的內容,無視所有commit
 
git checkout HEAD : 回滾最新的程式碼 (history > Working Directory)
git checkout xxx.php: 還原單個檔案 (history -> Working Directory)
 
git add -u : 把修改過的檔案加入index
git add -A : 把所有修改、新增、刪除 檔案變動加入index
 
git commit (stage -> history)
git commit -a -m "your message" (提交所有已經git add過的程式碼) (Working Directory -> history)
git commit --amend -m"your message"     (你儲存得過於頻繁,可將此次的commit和上一次commit合併)
 
git fetch: 相當於是從遠端獲取最新版本到本地,不會自動merge
git fetch origin: 從“origin”資源庫取得所有的歷史記錄而不改變本地的副本.
git pull: 相當於是從遠端獲取最新版本並merge到本地副本
git push: 提交版本到遠端
git submodule update --init --recursive : 更新submodule,git pull不會自動下載submodule
git stash: 儲存當前改動並還原未改動狀態,通常用於程式碼修改中臨時切換分支
git stash pop: 恢復改動記錄
git archive --format zip -o code.zip HEAD: 匯出專案

分支操作

git checkout -b <name> 新建分支
git branch -D <name> 刪除分支
git branch 檢視本地分支
git branch -a 檢視遠端分支
git merge test        把test分支合併到當前分支上       (合併之後  git會在發生衝突的檔案上標出衝突   自己開啟這些檔案手工解決衝突  如果不解決不能commit)
git checkout test   切換到test分支 (history -> Working Directory)git rebase my_branch: 把my_branch分支合併到當前副本中
git push origin :master 刪除遠端master分支

查詢操作

git diff (當你了修改檔案並儲存了,使用這個命令觀察下)
git diff abcde (對位元定版本,至少版本號前5位)
git status (自己使用觀察下)
git log -p (當你修改了檔案,再使用git commit -m "XXX"時候,再用這個命令看看)
git log --stat --summary (包括檔案改動的摘要資訊)
git log --grep "search text" (搜尋匹配內容的LOG)
git log filename (某檔案所有修改記錄)
git log --author=<name> (某作者的記錄)
git branch 檢視分支
git show commit_id (檢視某次提交的修改細節)
git branch --contains <commit-id> 某個commit的所屬分支

Applying and creating patches

git apply xxxx.patch
git diff HEAD^^ > (issue id)-title.patch
git format-patch HEAD^^ --stdout > (issue id)-title.patch // 把上一次commit的內容轉為補丁

組合指令

對現有原始碼建立GIT庫

git init
git add --all ( or git add .)
git commit -m "init"

打包最近一次差異檔案(bash)

git archive -o latest.tar HEAD $(git diff HEAD^ --name-only)
或
git diff HEAD^ --name-only > __list.txt
cat __list.txt | xargs -i  tar rvPf  latest.tar  {}
rm __list.txt

最近一次差異檔案提取 (powershell)

git diff HEAD^ > __list.txt --name-only
cat __list.txt | foreach {
    $target = "/diff/"+$_
    New-Item -type file -Force $target
    cp $_ $target
}
rm __list.txt

合併另一個git庫

git remote add {project name} {git uri}
git remote -v
git fetch {project name}
git merge {project name}/master