>基本git 工作流程

===================
----


* 基本
	* 初始化git
	* 檢查你的狀況
	* 新增檔案
	* Staging Area
	* 儲存快照
	* 翻看快照記錄	
* 分支
	* 開啟新分支和進入
	* 在分支上修改檔案
	* 在分支上快拍照
	* 在分支上的快照記錄
	* 合拼分支改變
* 互聯網
	* 上傳到伺服器
	* 從伺服器合併改變
* PS
	* Tracking Information


>#基本
----


初始化git
----

1. 進入你電腦某個資料夾
2. `git init`初始化這個夾為git folder
		
```bash
		➜  Desktop  mkdir git_example
		➜  Desktop  cd git_example
		➜  git_example  git init
		Initialized empty Git repository in /Users/jason/Desktop/git_example/.git/
```
		



檢查你的狀況
-----------------------

1. 輸入指令：`git status`
2. 顯示你現在的分支位置`on branch xxx`
3. `master` 是git預設的分支

```bash
	    ➜  git_example git:(master) git status
	    # On branch master
	    #
	    # Initial commit
	    #
	    nothing to commit (create/copy files and use "git add" to track)
```


新增檔案
----
1. 新增jason.html
2. 檢查`git status`

```bash
		➜  git_example git:(master) touch jason.html
		➜  git_example git:(master) ✗ git status
		# On branch new_feature
		#
		# Initial commit
		#
		# Untracked files:
		#   (use "git add <file>..." to include in what will be committed)
		#
		#	jason.html
		nothing added to commit but untracked files present (use "git add" to track)
```

每一次你**新增或改變**檔案, git **不會**自動幫你儲存變化
直至你輸入`git add` 令檔案進入`staging area`
在一下次commit時, git才會幫你記錄這些變化		


Staging Area
----

1. 利用`git add . `新增jason.html 入`staging area`
3. 檢查`git status`
4. 顯示在下次你commit 時的動作

````bash
		➜  git_example git:(master) ✗ git add .
		➜  git_example git:(master) ✗ git status
		# On branch new_feature
		#
		# Initial commit
		#
		# Changes to be committed:
		#   (use "git rm --cached <file>..." to unstage)
		#
		#	new file:   jason.html
		#
```


儲存快照
----

1. `git commit -m "add jason.html"`
2. 讓git為我們的檔案拍快照(記錄變化)

		➜  git_example git:(master) ✗ git commit -m "add jason.html"
		[master (root-commit) 3da7049] add jason.html
		 0 files changed
		 create mode 100644 jason.html
		➜  git_example git:(master) git status
		# On branch master
		nothing to commit (working directory clean)


翻看快照記錄
----
1. `git log`
2. 顯示快照記錄

		commit 3da704936d1034edf5adcf167213ea11e2e01362
		Author: Liu Ho Yin <j-lhy@hotmail.com>
		Date:   Thu Jan 17 22:50:29 2013 +0800
		
		    add jason.html

 

 
>#進階(分支)
----

開啟新分支和進入
----
1. 輸入指令 `git checkout-b  'edit_jason'`
2. 會創造和進入新分支 `new_feature` 
	

		➜  git_example git:(master) git checkout -b 'edit_jason'
		Switched to a new branch 'edit_jason'
		
		
在分支上修改檔案
-----------------------

1. vim jason.html as you want
2. `git status` 檢查將況

		➜  git_example git:(edit_jason) vim jason.html 
		➜  git_example git:(edit_jason) ✗ git status                  
		# On branch edit_jason
		# Changes not staged for commit:
		#   (use "git add <file>..." to update what will be committed)
		#   (use "git checkout -- <file>..." to discard changes in working directory)
		#
		#	modified:   jason.html
		#
		no changes added to commit (use "git add" and/or "git commit -a")

	
	即使你是修改檔案
	
	你也需要輸入`git add` 令檔案進入`staging area`
	
	在一下次commit時, git才會幫你記錄修改
	

在分支上快拍照
-----------------------

1. `git add .` stage 修改動作
2. 再一次檢查狀況	
3. 拍快照

		➜  git_example git:(edit_jason) ✗ git add . 
		➜  git_example git:(edit_jason) ✗ git status
		# On branch edit_jason
		# Changes to be committed:
		#   (use "git reset HEAD <file>..." to unstage)
		#
		#	modified:   jason.html
		#
		➜  git_example git:(edit_jason) ✗ git commit -m "edit jason.html"
		[edit_jason 2351506] edit jason.html
		 1 file changed, 1 insertion(+)
		 
在分支上的快照記錄
----
1. `git log` 查看快照記錄
2. 比剛才在master多了我們的修改動作

	
		commit 2351506e70926dd3ba46aee4c9d78b0dcc28fef3
		Author: Liu Ho Yin <j-lhy@hotmail.com>
		Date:   Thu Jan 17 22:56:51 2013 +0800
		
		    edit jason.html
		
		commit 3da704936d1034edf5adcf167213ea11e2e01362
		Author: Liu Ho Yin <j-lhy@hotmail.com>
		Date:   Thu Jan 17 22:50:29 2013 +0800
		
		    add jason.html

合拼分支改變
----
到目前為止， 我們所做的改變只是在新分支`edit_jason`

現在合拼這些改變到預設分支`master`

1. `git checkout master`
2. 去我們想要的分支:master
3. `git merge edit_jason`
4. 將分支`edit_jason`的改變合併到現在的分支（即是master）

		➜  git_example git:(edit_jason) git checkout master
		Switched to branch 'master'
		➜  git_example git:(master) git merge edit_jason 
		Updating 3da7049..2351506
		Fast-forward
		 jason.html |    1 +
		 1 file changed, 1 insertion(+)
		 
	現在我們在分支master, 再一次 `git log `
	你會看見我們在`edit_jason`的快照
	
		➜  git_example git:(master) git log                        
		
		commit 2351506e70926dd3ba46aee4c9d78b0dcc28fef3
		Author: Liu Ho Yin <j-lhy@hotmail.com>
		Date:   Thu Jan 17 22:56:51 2013 +0800
		
		    edit jason.html
		
		commit 3da704936d1034edf5adcf167213ea11e2e01362
		Author: Liu Ho Yin <j-lhy@hotmail.com>
		Date:   Thu Jan 17 22:50:29 2013 +0800
		
		    add jason.html




>#互聯網
----

上傳到伺服器
----

1. `git remote add origin <server.git>`（第一次）
2. 新增remote 叫orign
3. `git push -u origin master`
4. 上傳到origin 的master 分支

		➜  git_example git:(master) git remote add origin git@github.com:Jasonlhy/git_example.git
		Counting objects: 6, done.
		Delta compression using up to 4 threads.
		Compressing objects: 100% (2/2), done.
		Writing objects: 100% (6/6), 442 bytes, done.
		Total 6 (delta 0), reused 0 (delta 0)
		To git@github.com:Jasonlhy/git_example.git
		 * [new branch]      master -> master
		Branch master set up to track remote branch master from origin.


從伺服器合併改變
----

剛剛在github 上新增了README，現在把它拉回來

1. `git pull`
2. 從origin 拉README.md 下來

		remote: Counting objects: 4, done.
		remote: Compressing objects: 100% (2/2), done.
		remote: Total 3 (delta 0), reused 0 (delta 0)
		Unpacking objects: 100% (3/3), done.
		From github.com:Jasonlhy/git_example
		   2351506..d8a6c01  master     -> origin/master
		Updating 2351506..d8a6c01
		Fast-forward
		 README.md |    4 ++++
		 1 file changed, 4 insertions(+)
		 create mode 100644 README.md
		 
	現在你檔案裡會多了一個README.md 的檔案，很神奇吧

		➜  git_example git:(master) ls      
		README.md  jason.html



>PS
====

-Tracking Information
====

#####-u

在git push 中`-u`, 會建立**tracking infromation**, 用來連結你本地分支和伺服分支的關係。因此，在下一次git push or git pull, 你不用再聲明那個伺服器，那個分支

你在某些地方使用`git clone`,都會留有tracking information


#####但是
如果你使用的是`git push origin master`,沒有留下tracking information
>
pull時你便要聲明伺服和分支

	`git pull origin master` 

或建立tracking information 

	`git branch --set-upstream origin/xxxxx`