2014年3月25日 星期二

GitHub 學習資源 & 常用指令


GitHub ==> 一套線上版本控管服務

以下紀錄一些相關的學習網址:


Git 教學(1) : Git 的基本使用

30 天精通 Git 版本控管 (01):認識 Git 版本控管 - iT邦幫忙::IT知識分享社群

連猴子都能懂得Git入門指南

GitBook

Git

Git - Book

Code School - Try Git

GitHub - GitHub初體驗

GitHub 官網




常用指令:
git init             建立Repository
git init --bare            建立Repository(裸)
git clone [REPO_URL]        建立副本Repository
git clone [repo_url] [dir]    建立副本Repository 到目的 Dir
git add .            目錄下所有檔案加入到 Git 版本控管(儲存庫)
git add -u             可以僅將「更新」或「刪除」的檔案變更寫入到「索引檔」中
git rm                刪除檔案
git mv                更名 搬動檔案
git reset             重設工作目錄的索引狀態
git reset --hard        重設工作目錄的索引狀態,還原到目前的最新版
git reset --hard HEAD        (版本尚未被成功合併)
git reset --hard ORIG_HEAD    重設工作目錄的索引狀態,還原到之前最新的版本(回到合併前)
git reset --soft "HEAD^"    「刪除最近一次的版本紀錄,但留下最後一次版本變更的異動內容」
git reset HEAD@{1} --hard    我們如果想要「取消」最近一次的版本紀錄
git status             查詢當前工作目錄的詳細狀態(儲存庫狀態--目前最新版 與 索引檔 之間的差異)
git status -s             查詢當前工作目錄的詳細狀態(簡)
git checkout master [fileName]    還原檔案
git commit            將新增/修改/刪除 提交 建立版本(版本資訊寫入到「物件儲存區」當中)
git commit -m "說明文字"    將新增/修改/刪除 提交 並附加訊息
git commit --amend        重新提交一次最後一個版本 (即 HEAD 版本)
git help [command]        查詢help文件
git log             查詢版本的歷史紀錄
git log -10             查詢版本的歷史紀錄,只查最新的10筆
git ls-files            列出所有目前已經儲存在「索引檔」中的檔案路徑
git ls-files -u            列出所有目前已經儲存在「索引檔」中的檔案路徑(所有已追蹤或未追蹤的檔案)
git gc                執行重新封(repacking)
git fsck            檢查 Git 維護的檔案系統是否完整
git diff            比對的是「工作目錄」與「索引」之間的差異(執行git add . 之前)
git diff [commitOId]        比對的是「工作目錄」與「指定 commit 物件裡的那個 tree 物件」
git diff HEAD            拿「工作目錄」與「當前分支的最新版」比對。不會去比對「索引」的狀態
git diff [oldCOId] [newCOId]    比較 commit Object,可以跳過「索引」與「工作目錄」的任何變更(比對tree 物件)
git diff --cached        等待被 commit 的檔案,按Q可離開,同 git diff --cached HEAD
git diff --cached [commitOId]    比對「當前的索引狀態」與「指定 commit 物件裡的那個 tree 物件」
git diff --cached HEAD        「當前的索引狀態」與「當前分支的最新版」比對。不會比對「工作目錄」的檔案內容
git diff --staged        等待被 commit 的檔案,按Q可離開,同 git diff --cached
git diff HEAD^ HEAD        比較【最新版的前一版】與【最新版】之間的差異
git push            合併/推送 至遠端 Repository
git push originRef masterRef
git push -u origin master    本地推送到遠端,GitHub 上的遠端儲存庫是完全空的 需下-u 參數
git push --set-upstream        加上 --set-upstream 參數 即可將本地分支註冊進 .git\config 設定檔
git push --all
git push --tags
git remote add [tag] [URL]    添加遠地參照(reftag)
git remote -v             可列出目前註冊在工作目錄裡的遠端儲存庫資訊(列出 origin 資訊)
git remote set-url origin git@github.com:doggy8088/frontend-tools.git    重設 origin 對應 url
git pull            合併/推送 至本地 Repository
git pull origin master
git fetch --all --tags
git fetch            將遠端儲存庫的最新版下載回來,下載的內容包含完整的物件儲存庫(object storage)
git ls-remote
git ls-remote origin         可列出所有遠端分支
git branch            顯示分支結構
git branch -a            顯示出所有「本地分支」與「本地追蹤分支」。
git branch -d [BranchName]    刪除分支
git branch -D [BranchName]    刪除沒有執行過「合併」的分支
git branch -r            顯示出【遠端分支】。
git branch [BranchName]        建立分支,但目前工作目錄維持在自己的分支
git checkout -b [BranchName]    建立分支,並將目前工作目錄切換到新的分支
git checkout [BranchName]    切換分支,工作目錄切換到其他分支
git cat-file -p commitOId    查看 commit 物件的內容
git cat-file -p treeid        查看 tree 物件的內容
git log --pretty=oneline    取得較為精簡的歷史紀錄(含commit Object ID及commit message)
git log --pretty=oneline --abbrev-commit    取得較為精簡的歷史紀錄(含commit Object ID及commit message)
git show            取得版本變更紀錄
git update-ref refName [oId]    自由建立「一般參照」,參照名稱可以指向任意 Git 物件,沒有限定非要commit物件不可。
git update-ref -d refName    刪除參照
git show-ref [ref or object_id]    顯示所有參照
git symbolic-ref        若要建立與刪除「符號參照」
git rev-parse            可以把任意「參考名稱」或「相對名稱」解析出「絕對名稱」ex:git rev-parse HEAD^
git stash            會將所有已列入追蹤(tracked)的檔案建立暫存版 同 git stash save
git stash -u            會包括所有已追蹤或未追蹤的檔案,全部都建立成暫存版
git stash pop            將 stash 暫存版本合併回主要版本
git stash list             列出目前所有的 stash 清單
git stash save -u     自訂暫存版的註解
git stash apply            將 stash 暫存版本合併回主要版本,但不清除stash資訊
git stash apply "stash@{1}"    取回「特定一個暫存版」
git stash drop "stash@{1}"     將特定暫存版刪除。
git stash clear            將全部暫存版刪除
git config --list        列出目前設定在 Git for Windows 工具下的所有選項
git config --list --system    篩選出關於系統層級的選項設定
git config --list --global    篩選出關於使用者層級的選項設定
git config --list --local    篩選出關於儲存區層級的選項設定
git config [config_section.config_name]                取得特定選項值 ex:git config user.name
git config --unset --system [config_section.config_name]    刪除特定選項設定
git config --edit --system        直接編輯設定檔
git config --global core.autocrlf true    自動辨識 CRLF 字元
git config --global help.autocorrec    自動訂正打錯的參數
git config --system color.ui auto    啟用訊息顏色
git config --local commit.template "G:\git-commit-template.txt"    自訂 commit 訊息範本(儲存庫層級)
git tag                列出所有標籤:
git tag [tagname]        建立輕量標籤
git tag [tagname] -d        刪除輕量標籤
git cat-file -t [tagname]    查看「輕量標籤」的內容
git tag [tagname] -a        建立標示標籤,需加入 -m
git reflog            印出所有「歷史紀錄」的版本變化
git reflog delete ref@{specifier}    刪除之前紀錄的某些紀錄
git merge [branchName]            執行合併
git merge [branchName] --no-ff        執行合併 停用 Git 的快轉機制
git merge origin/master
git config gc.reflogExpire        修改reflog預設的過期期限
    ex:git config --global gc.reflogExpire "never"
git config gc.reflogExpireUnreachable    修改預設reflog的過期期限
    ex:git config --global gc.reflogExpireUnreachable "7 days"
git reflog expire --expire=now --all    立即清除所有歷史紀錄
git revert [commit object id]        還原某一個版本的紀錄(某個版本的變更,透過「相反」的步驟把變更給還原)
git revert -n        使用 git revert 命令套用變更,但不執行 commit 動作
git revert --continue    代表你已經完成所有操作,並且建立一個新版本,就跟執行 git commit 一樣。
git revert --abort    代表你準備放棄這次復原的動作,執行這個命令會讓所有變更狀態還原,也就是刪除的檔案又會被加回來。
git revert [commit_id] -s    在訊息內容加上目前使用者的簽署名稱
git revert [commit_id] -e    在完成版本之前顯示編輯訊息的視窗
git cherry-pick [commit_id]    「手動挑出」你想套用的變更
git cherry-pick [commit_id] -e    「手動挑出」你想套用的變更 建立版本前先編輯訊息
git cherry-pick [commit_id] -n    「手動挑出」你想套用的變更 不建立版本 僅套用變更
git cherry-pick    [commit_id] -x    「手動挑出」你想套用的變更 並加註由哪個分支過來的訊息
git log [branchName]    查詢分支的紀錄
git rebase -i [commit_id]
git rebase ---continue
git config --global push.default simple  
    Git 的預設行為將會在 Git 2.0 之後發生改變,建議你透過設定 push.default 選項的方式明確指定 push 的方法
git shortlog -sne        取得版本庫中所有人的 commit 次數統,-n 參數還可以按照 commit 數量進行降冪排序
git shortlog            顯示出每個人最近 commit 過的歷史紀錄
git clean -n            從工作目錄清除不在版本庫中的檔案
git push origin :branchName    刪除遠端分支 同 git push origin --delete branchName
git blame            找出改壞程式的兇手
git blame [filename]
git blame -L [開始行數],[結束行數] [filename]

PS.
「目錄資訊」/「檔案內容」,即為 tree 物件與 blob 物件
blob 物件就是把原本的「檔案內容」當成 blob 檔案的內容 (blob 物件其實就是一個實體檔案)
--blob 物件就是只有內容的檔案,檔名是由內容產生
tree 物件,則是用來儲存特定資料夾下包含哪些檔案,以及該檔案對應的 blob 物件的檔名為何。
在 tree 物件中,除了可以包含 blob 物件的檔名與相關資訊,還可以包含其他的 tree 物件。所以
--tree 物件其實就是「資料夾」的代名詞
參照:
30 天精通 Git 版本控管 (05):了解儲存庫、工作目錄、物件與索引之間的關係
http://ithelp.ithome.com.tw/question/10133653

常見的 git 屬性範例:
0100000000000000 (040000): Directory
1000000110100100 (100644): Regular non-executable file
1000000110110100 (100664): Regular non-executable group-writeable file
1000000111101101 (100755): Regular executable file
1010000000000000 (120000): Symbolic link
1110000000000000 (160000): Gitlink

git diff 說明
git diff            => 工作目錄 vs 索引
git diff HEAD          => 工作目錄 vs HEAD
git diff --cached HEAD      => 索引 vs HEAD
git diff --cached         => 索引 vs HEAD
git diff HEAD^ HEAD       => HEAD^ vs HEAD

Git 參照名稱又有區分「一般參照」與「符號參照」,兩者的用途一模一樣,只在於內
容不太一樣。「符號參照」會指向另一個「一般參照」,而「一般參照」則是指向一個
 Git 物件的「絕對名稱」。

我們手邊改到一半的檔案,可能會有以下狀態:
* 新增檔案 (尚未列入追蹤的檔案) (untracked files)
* 新增檔案 (已經加入索引的檔案) (tracked/staged files)
* 修改檔案 (尚未加入索引的檔案) (tracked/unstaged files)
* 修改檔案 (已經加入索引的檔案) (tracked/staged files)
* 刪除檔案 (尚未加入索引的檔案) (tracked/unstaged files)
* 刪除檔案 (已經加入索引的檔案) (tracked/staged files)

救回誤刪的分支
1. 先利用 git reflog 找出該分支(最後一個版本的 object id (也就是 SHA1 格式的物件絕對名稱)
2. 執行 git branch feature 即可

在 Git 裡面,是透過 .gitignore 檔案來進行定義「忽略清單」,主要的目的是排除一些
不需要加入版控的檔案,列在裡面的檔名或路徑 (可包含萬用字元),都不會出現在
git status 的結果中,自然也不會在執行 git add 的時候被加入。不過,這僅限於
Untracked file 而已,那些已經列入版控的檔案 (Staged file),不受 .gitignore
檔案控制。

使用git rebase 如果你的分支是從遠端儲存庫下載回來的,請千萬不要透過 Rebase 修
改版本歷史紀錄,否則你將會無法將修改過後的版本送到遠端儲存庫!

Rebase 能做的事
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插入一個 commit
4. 編輯一個 commit
5. 拆解一個 commit
6. 壓縮一個 commit,且保留訊息紀錄
7. 壓縮一個 commit,但丟棄版本紀錄
8. 刪除一個 commit

將遠端儲存庫的 master 分支取回,並合併到本地儲存庫的 master 分支,有兩種方法:
1. 使用 git pull origin master 指令
    git pull 指令幫我們一次做到 git fetch 與 git merge origin/master 這個動作
2. 使用 git fetch 指令後再執行 git merge origin/master 合併動作

轉換Subversion to GIT
http://ithelp.ithome.com.tw/question/10140481

第一次使用 GitHub for Windows 工具的時候,如果你有照著步驟登入與設定,這套工具會
預設幫你產生一對金鑰,然後該工具會自動上傳到 GitHub 的 SSH Key 專區,讓你日後不用
再輸入帳號密碼,就能順利的操作 GitHub 上的遠端儲存庫。

這一對金鑰,預設就放在 %USERPROFILE%\.ssh 資料夾下,如果你的 Windows 登入使用者名
稱為 Will 的話,這個路徑就位於 C:\Users\Will\.ssh 目錄下。這對金鑰的檔名分別是
 github_rsa (私鑰) 與 github_rsa.pub (公鑰)


其他
============== Git 初學筆記 - 指令操作教學
http://goo.gl/43teXM

注意事項

由 project/.git/config 可知當前Config

origin(remote) 是 Repository 的版本
master(branch) 是 local 端, 正在修改的版本
平常沒事不要去動到 origin, 如果動到, 可用 git reset --hard 回覆到沒修改的狀態.


Config - 環境設定

    git config --global user.name "John Doe"
    git config --global user.email johndoe@example.com

複製代碼
因為初次未設定,從 git config --list 會找不到該參數名,所以列上

    git config --global --unset user.name # 移除KEY

複製代碼


Remote  - 遠端設定

    git remote -v # 列出remote origin info

複製代碼

    git remote add origin git://new.url.here # 新增遠端repository URL

複製代碼

    git remote set-url origin git://new.url.here # 更改遠端repository URL

複製代碼

    git remote set-url --add --push origin git://backup.url.here # 新增Push的repository URL (manipulate push URLs)

複製代碼


Pull - 從遠端更新

    git pull 或 git pull origin master

複製代碼
實際作用是先 git fetch 遠端的 branch,然後與本地端的 branch 做 merge,產生一個 merge commit 節點

所謂的”遠端”預設叫做origin,當你有多個不同遠端伺服器時,就會取不同名子了。


Push - 將 Commit 送出去

    git push 或 git push origin master

複製代碼
實際的作用是將本地端的 master branch 與遠端的 master branch 作 fast-forward 合併。如果出現 [rejected] 錯誤的話,表示你必須先作 pull。

    git push origin +HEAD
    git push origin +HEAD:{brach}   // 適用於搭配reset刪除遠端commit

複製代碼

Git 新增檔案git add . # 將資料先暫存到 staging area, add 之後再新增的資料, 於此次 commit 不會含在裡面.
git add filename
git add modify-file # 修改過的檔案, 也要 add. (不然 commit 要加上 -a 的參數)
git add -u # 只加修改過的檔案, 新增的檔案不加入.
git add -i # 進入互動模式


Git 刪除檔案

git rm filename


Git 修改檔名、搬移目錄

git mv filename new-filename


Git status 看目前的狀態

git status # 看目前檔案的狀態


Git Commit

git commit
git commit -m 'commit message'
git commit -a -m 'commit -message' # 將所有修改過得檔案都 commit, 但是 新增的檔案 還是得要先 add.
git commit -a -v # -v 可以看到檔案哪些內容有被更改, -a 把所有修改的檔案都 commit


Git 產生新的 branch

git branch # 列出目前有多少 branch
git branch new-branch # 產生新的 branch (名稱: new-branch), 若沒有特別指定, 會由目前所在的 branch / master 直接複製一份.
git branch new-branch master # 由 master 產生新的 branch(new-branch)
git branch new-branch v1 # 由 tag(v1) 產生新的 branch(new-branch)
git branch -d new-branch # 刪除 new-branch
git branch -D new-branch # 強制刪除 new-branch
git checkout -b new-branch test # 產生新的 branch, 並同時切換過去 new-branch
# 與 remote repository 有關
git branch -r # 列出所有 remote repository  branch
git branch -a # 列出所有 branch


Git checkout 切換 branch

git checkout branch-name # 切換到 branch-name
git checkout master # 切換到 master
git checkout -b new-branch master # 從 master 建立新的 new-branch, 並同時切換過去 new-branch
git checkout -b newbranch # 由現在的環境為基礎, 建立新的 branch
git checkout -b newbranch origin # 於 origin 的基礎, 建立新的 branch
git checkout filename # 還原檔案到 Repository 狀態
git checkout HEAD . # 將所有檔案都 checkout 出來(最後一次 commit 的版本), 注意, 若有修改的檔案都會被還原到上一版. (git checkout -f 亦可)
git checkout xxxx . # 將所有檔案都 checkout 出來(xxxx commit 的版本, xxxx 是 commit 的編號前四碼), 注意, 若有修改的檔案都會被還原到上一版.
git checkout -- * # 恢復到上一次 Commit 的狀態(* 改成檔名, 就可以只恢復那個檔案)


Git diff

git diff master # 與 Master 有哪些資料不同
git diff --cached # 比較 staging area 跟本來的 Repository
git diff tag1 tag2 # tag1, 與 tag2 的 diff
git diff tag1:file1 tag2:file2 # tag1, 與 tag2 的 file1, file2 的 diff
git diff # 比較 目前位置 與 staging area
git diff --cached # 比較 staging area 與 Repository 差異
git diff HEAD # 比較目前位置 與 Repository 差別
git diff new-branch # 比較目前位置 與 branch(new-branch) 的差別
git diff --stat


Git Tag

git tag v1 ebff # log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容, 設定簡短好記得 Tag: v1
git tag 中文 ebff # tag 也可以下中文, 任何文字都可以
git tag -d 中文 # 把 tag=中文 刪掉


Git log

git log # 將所有 log 秀出
git log --all # 秀出所有的 log (含 branch)
git log -p # 將所有 log 和修改過得檔案內容列出
git log -p filename # 將此檔案的 commit log 和 修改檔案內容差異部份列出
git log --name-only # 列出此次 log 有哪些檔案被修改
git log --stat --summary # 查每個版本間的更動檔案和行數
git log filename # 這個檔案的所有 log
git log directory # 這個目錄的所有 log
git log -S'foo()' # log 裡面有 foo() 這字串的.
git log --no-merges # 不要秀出 merge 的 log
git log --since="2 weeks ago" # 最後這 2週的 log
git log --pretty=oneline # 秀 log 的方式
git log --pretty=short # 秀 log 的方式
git log --pretty=format:'%h was %an, %ar, message: %s'
git log --pretty=format:'%h : %s' --graph # 會有簡單的文字圖形化, 分支等.
git log --pretty=format:'%h : %s' --topo-order --graph # 依照主分支排序
git log --pretty=format:'%h : %s' --date-order --graph # 依照時間排序


Git show

git show ebff # 查 log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容
git show v1 # 查 tag:v1 的修改內容
git show v1:test.txt # 查 tag:v1 的 test.txt 檔案修改內容
git show HEAD # 此版本修改的資料
git show HEAD^ # 前一版修改的資料
git show HEAD^^ # 前前一版修改的資料
git show HEAD~4 # 前前前前一版修改的資料


Git reset 還原

    git reset --hard HEAD  // 還原到最前面
    git reset --hard HEAD^  // 還原到前一個commit
    git reset --hard HEAD~3
    git reset --soft HEAD~3
    git reset HEAD filename  // 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)

複製代碼

Git update-ref

git update-ref -d HEAD 刪除HEAD(適用取消首次commit)

Git grep

git grep "te" v1 # 查 v1 是否有 "te" 的字串
git grep "te" # 查現在版本是否有 "te" 的字串


Git stash 暫存

git stash # 丟進暫存區
git stash list # 列出所有暫存區的資料
git stash pop # 取出最新的一筆, 並移除.
git stash apply # 取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除
git stash clear # 把 stash 都清掉


Git merge 合併

git merge
git merge master
git merge new-branch
下述轉載自: ihower 的 Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.x

    Straight merge 預設的合併模式,會有全部的被合併的 branch commits 記錄加上一個 merge-commit,看線圖會有兩條 Parents 線,並保留所有 commit log。
    Squashed commit 壓縮成只有一個 merge-commit,不會有被合併的 log。SVN 的 merge 即是如此。
    cherry-pick 只合併指定的 commit
    rebase 變更 branch 的分支點:找到要合併的兩個 branch 的共同的祖先,然後先只用要被 merge 的 branch 來 commit 一遍,然後再用目前 branch 再 commit 上去。這方式僅適合還沒分享給別人的 local branch,因為等於砍掉重練 commit log。
    指令操作

    git merge # 合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
    git merge --squash # 將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
    git cherry-pick 321d76f # 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。




Git blame

git blame filename # 關於此檔案的所有 commit 紀錄


Git 還原已被刪除的檔案

git ls-files -d # 查看已刪除的檔案
git ls-files -d | xargs git checkout -- # 將已刪除的檔案還原


Git 維護

git gc # 整理前和整理後的差異, 可由: git count-objects 看到.
git gc --prune
git fsck --full


Git revert 資料還原

git revert HEAD # 回到前一次 commit 的狀態
git revert HEAD^ # 回到前前一次 commit 的狀態
git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
git checkout filename # 從 unstaging 狀態回到最初 Repository 的檔案(檔案內容變回修改前)


Git Rollback 還原到上一版

git reset --soft HEAD^


編輯 + git add filename

git commit -m 'rollback'

以下與 遠端 Repository 相關


Git remote breanch 維護遠端分支檔案

git remote
git remote add new-branch http://git.example.com.tw/project.git # 增加遠端 Repository 的 branch(origin -> project)
git remote show # 秀出現在有多少 Repository
git remote rm new-branch # 刪掉
git remote update # 更新所有 Repository branch
git branch -r # 列出所有 Repository branch


抓取 / 切換 Repository 的 branch

git fetch origin
git checkout --track -b reps-branch origin/reps-branch # 抓取 reps-branch, 並將此 branch 建立於 local 的 reps-branch


刪除 Repository 的 branch

git push origin :heads/reps-branch

============== Git的奇技淫巧:
http://goo.gl/lsC5hx


展示説明資訊

git help -g

回到遠端倉庫的狀態

拋棄本地倉庫的所有版本(commit),回到遠端倉庫的狀態。

git fetch --all && git reset --hard origin/master

重設第一個commit

也就是把所有的改動都重新放回工作區,並清空所有的commit,這樣就可以重新提交第一個commit了

git update-ref -d HEAD

展示工作區和暫存區的不同

輸出工作區和暫存區的different(不同)。

git diff

還可以展示本地倉庫中任意兩個commit之間的檔變動:

git diff

展示暫存區和最近版本的不同

輸出暫存區和本地最近的版本(commit)的different(不同)。

git diff --cached

展示暫存區、工作區和最近版本的不同

輸出工作區、暫存區 和本地最近的版本(commit)的different(不同)。

git diff HEAD

快速切換分支

git checkout -

刪除已經合併到master的分支

git branch --merged master | grep -v '^\*\|  master' | xargs -n 1 git branch -d

展示所有的分支關聯的遠端倉庫

git branch -vv

關聯遠端分支

關聯之後,git branch -vv就可以展示關聯的遠端分支名了,同時推送到遠端倉庫直接:git push,不需要指定遠端倉庫了。

git branch -u origin/mybranch

或者在push時加上-u參數

git push origin/mybranch -u

刪除本地分支

git branch -d

刪除遠端分支

git push origin --delete

或者

git push origin :

查看標籤

git tag

展示當前分支的最近的tag

git describe --tags --abbrev=0

本地創建標籤

git tag

默認tag是打在最近的一次commit上,如果需要指定commit打tag:

$ git tag -a -m "v1.0 發佈(描述)"

推送標籤到遠程倉庫

首先要保證本地創建好了標籤才可以推送標籤到遠端倉庫:

git push origin

一次性推送所有標籤,同步到遠端倉庫:

git push origin --tags

刪除本地標籤

git tag -d

刪除遠程標籤

刪除遠端標籤需要先刪除本地標籤,再執行下面的命令

git push origin :refs/tags/

放棄工作區的修改

git checkout

放棄所有修改:

git checkout .

回到某一個commit的狀態,並重新增添一個commit

git revert

回到某個commit的狀態,並刪除後面的commit

和revert的區別:reset命令會抹去某個commit id之後的所有commit

git reset

修改上一個commit的描述

git commit --amend

查看commit歷史

git log

查看某段代碼是誰寫的

blame的意思為‘責怪’,你懂的。

git blame

顯示本地執行過git命令

就像shell的history一樣

git reflog

修改作者名

git commit --amend --author='Author Name '

修改遠程倉庫的url

git remote set-url origin

列出所有遠端倉庫

git remote

列出本地和遠端分支

-a參數相當於:all

git branch -a

列出遠端分支

-r參數相當於:remote

git branch -r

查看兩個星期內的改動

git whatchanged --since='2 weeks ago'

把A分支的某一個commit,放到B分支上

這個過程需要cherry-pick命令,參考

git checkout && git cherry-pick

給git命令起別名

簡化命令

git config --global alias.

比如:git status 改成 git st,這樣可以簡化命令

git config --global alias.st status

存儲當前的修改,但不用提交commit

詳解可以參考廖雪峰老師的git教程

git stash

保存當前狀態,包括untracked的檔

untracked文件:新建的文件

git stash -u

展示所有stashes

git stash list

回到某個stash的狀態

git stash apply

回到最後一個stash的狀態,並刪除這個stash

git stash pop

刪除所有的stash

git stash clear

從stash中拿出某個檔的修改

git checkout --

展示所有tracked的檔

git ls-files -t

展示所有untracked的檔

git ls-files --others

展示所有忽略的檔

git ls-files --others -i --exclude-standard

強制刪除untracked的檔

可以用來刪除新建的檔。如果不指定檔檔案名,則清空所有工作的untracked檔。clean命令,注意兩點:
1. clean後,刪除的檔無法找回 2. 不會影響tracked的檔的改動,只會刪除untracked的檔

git clean -f

強制刪除untracked的目錄

可以用來刪除新建的目錄,注意:這個命令也可以用來刪除untracked的檔。詳情見上一條

git clean -df

重命名分支

git branch -m

展示簡化的commit歷史

git log --pretty=oneline --graph --decorate --all

把某一個分支到匯出成一個檔

git bundle create

從包中導入分支

新建一個分支,分支內容就是上面git bundle create命令匯出的內容

git clone repo.bundle -b

執行rebase之前自動stash

git rebase --autostash

從遠端倉庫根據ID,拉下某一狀態,到本地分支

git fetch origin pull//head:

詳細展示一行中的修改

git diff --word-diff

清除gitignore檔中記錄的檔

git clean -X -f

展示所有alias和configs

git config --list

展示忽略的檔

git status --ignored

commit歷史中顯示Branch1有的,但是Branch2沒有commit

git log Branch1 ^Branch2

在commit log中顯示GPG簽名

git log --show-signature

刪除全域設置

git config --global --unset

新建並切換到新分支上,同時這個分支沒有任何commit

相當於保存修改,但是重寫commit歷史

git checkout --orphan

展示任意分支某一檔的內容

git show :

clone下來指定的單一分支

git clone -b --single-branch https://github.com/user/repo.git

創建並切換到該分支

git checkout -b

忽略檔的許可權變化

不再將檔的許可權變化視作改動

git config core.fileMode false

展示本地所有的分支的commit

最新的放在最上面

git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/

在commit log中查找相關內容

通過grep查找,given-text:所需要查找的欄位

git log --all --grep=''

把暫存區的指定file放到工作區中

git reset

強制推送

git push -f

增加遠程倉庫

git remote add origin

 

沒有留言 :

張貼留言