2015年11月29日 星期日

Git - Git 版本恢復與分支管理

 

第一課簡單介紹到可以順利做一次commit 提交,但是如果想要在各個版本飛來飛去怎麼辦哩? 下面這些指令和觀念可以讓 git 的操作更順利而完善! 這部分補起來才有出了新手村的感覺...XD





一、查看狀態相關的指令



$ git status
//目前所有檔案的追蹤情形(通常用來看未被追蹤的檔案)

$ git log
$ git log --all
//以新到舊的順序列出儲存庫的提交的歷史記錄

$ git show
//顯示該標先說明以及同時 commit 的資料

$ git diff 
//比較 working tree 跟 staging area
$ git diff --cached 
//比較 staging area 跟本來的 repo
$ git diff HEAD 
//比較 working tree 跟本來的 repo
origin_repo : 上一次commit的版本
working tree : 正在修改尚未add的版本
staging area : 被add的版本會到staging area

$ git commit --amend
//改變最後一次的 Commit 的訊息




二、常用的還原指令:Reset、Checkout、Revert



1. Reset


$ git reset --hard HEAD
//回復至最近一次commit


[補充] 刪除新加的檔案
Reset 後不會刪除新加的檔案,因為新加的檔案是 untracked files,使用以下指令刪除多的檔案。

git clean -f




2. Checkout


$ git checkout branch-name
//切換到 branch-name

$ git checkout master
//切換到 master

$ git checkout -b newbranch
//由現在的環境為基礎, 建立新的 branch

$ git checkout HEAD~n
$ git checkout xxxx
//切換到HEAD前n版本 / xxxx commit 的版本

$ git checkout filename
//還原檔案到 Repository 狀態



3. Revert


$ git revert e37c75787
$ git revert HEAD^
//新增一筆 commit 來做還原,將指定的版本新增為最新的commit



[用心去感覺] 檔案狀態的轉換


注意這裡觀念要清楚的話,要知道自己在哪一個狀態,再附上一次狀態圖,這個網站有詳細的觀念解說 (https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/summary)。


下面是一個表格整理,commit-level 後面是跟著 branch 名或是某個 commit 的編號,file-level 後面則是跟著filename。

CommandScopeCommon use cases
git resetCommit-levelDiscard commits in a private branch or throw away uncommited changes
git resetFile-levelUnstage a file
git checkoutCommit-levelSwitch between branches or inspect old snapshots
git checkoutFile-levelDiscard changes in the working directory
git revertCommit-levelUndo commits in a public branch
git revertFile-level(N/A)
下圖是HEAD和 ~ ^ 的搭配用法,頗實用!





四、畫出漂亮的 branch graph


很羨慕一些圖形化的git有branch的樹狀圖可以看,後來發現terminal就能畫了~ 把下面的 aliases 加到  ~/.gitconfig file,之後就可以用 git lg 和 git lg2 畫圖囉!


[alias]
lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"







References


魚乾的筆記本 : git還原 - revert, reset, checkout
http://fishjerky.blogspot.tw/2011/10/git.html

Git 初學筆記 - 指令操作教學
http://blog.longwin.com.tw/2009/05/git-learn-initial-command-2009/

StackOverflow - Pretty git branch graphs
http://stackoverflow.com/questions/1057564/pretty-git-branch-graphs
技術提供:Blogger.