2014年11月17日 星期一

Git 固有技

參考 http://goo.gl/BKz88x
http://marklodato.github.io/visual-git-guide/index-en.html
https://ihower.tw/blog/archives/2620

只想自己玩

創造一個repository (大陸名版本库)
$ git init
Initialized empty Git repository in /Users/grace/gracegit/.git/


新增改動部分到暫存區 (Stage) 裡面 (p.s. 改動部分包括了新增檔案/改動檔案/刪除檔案)
$ git add [file]

提交所有暫存區內的改動到版本庫 (repository)
$ git commit [參數: -m/-a/...]

檢查工作區內更動狀況, 暫存區內容
$ git status

還原工作區內的改動
$ git checkout -- [file]

抽掉暫存區內的某檔案改動 (p.s. 搭配--hard  --soft 有其他效果)
$ git reset HEAD [file]




想跟別人玩

參考 http://goo.gl/rWB8FA

方法A. 克隆一個別人的版本庫
$ git clone git@github.com:grace/gits.git
克隆指令預設情況下會自動設定本地端的 master 分支追蹤被複製的遠端版本庫的 master 分支。(假設該版本庫有 master 分支)
克隆指令預設情況下將遠端版本庫命名為 origin

方法B. 設定連結指向遠端別人的版本庫
$ git remote add [shortname] [url]
Ex.
$ git remote add grace git://github.com/grace/grace.git

連絡遠端版本庫, 將尚未擁有的新資料下載回來 (p.s. 僅是下載回來; 並未自動合併)
$ git fetch [remote-name]

如果當下分支正在追蹤遠端的分支, 可用此指令同時下載並自動合併
$ git pull

上傳自己的東西到遠端版本庫
$ git push [remote-name] [branch-name]
Ex.
$ git push origin master
再提醒一次,  origin是系統預設的名字, 通常都是連到某個遠端版本庫
如果伺服器有開放寫入權限, 且沒有別人在上傳, 那麼你的master這樣就被你上傳出去了

上傳自己本地端的XXX branch到遠端版本庫
$git push -u origin HEAD
HEAD用過的人都說成功,換成某特定branch name時,有些人會失敗

以上藏了一個大魔王 : git checkout
後面其實可以接branch; tag; file; directory
用法雖然大同小異  但各自管轄不同對象  不可同日而語 ; 碰到一個再學一個吧 !


git reset 之後如何回到未來

當可以fast-forwarded時
使用  git pull master(或特定branch)
或  git merge --ff-only 特定branch  # 限定只作fast-forwarded

fast-forward 在 Git 是一種 merge 術語,當 B branch (例如一個 local branch) 是從 A branch (例如一個 remote branch) 的最新版(HEAD)分支出來的,那當 A 要把 B merge 進來時,因為 B 的 parent commit 是 A 的 HEAD,所以這兩個 branch 唯一的差異就是 B 後來的 commit 而已,而不會有任何 conflict。所以實際上的動作只要把 A 的 HEAD 改成 B 的 HEAD 就好了,線圖上這兩個 branch 根本是同一條線,此謂 fast-forward。

沒有留言:

張貼留言