Kevin.L.Yen <Kevin.L.Yen@newegg.com>
Kuanwei.K.Chen <Kuanwei.K.Chen@newegg.com>
Shawn.S.Wu <Shawn.S.Wu@newegg.com>
2016-07-07
»先設定 Git
» 在每一次的 commit 都會記錄作者的訊息像
是 name 及 email
» $ git config --global user.name “Shawn Wu“
» $ git config --global user.email “Shawn.S.Wu@newegg.com"
2016/7/7
» 利用git config –list查看
2016/7/7
» 開始GIT
» 使用前須先建立一個 Repository
» Git init
» 也可以Clone別人的 Repository
» Git clone <URL>
2016/7/7
» 在一個 Git 的 Repository 中可以用git status
來檢查目前 Git 的狀態
2016/7/7
» Git add <Filename>
» 使用git add
2016/7/7
» git status –s
最常見的的狀態:
? ? : untracked
A : new
M : Modified but not added
M : Modified and added
MM : Modified again after added
D : deleted project file
2016/7/7
» Add狀態
» 未add Untracked files
» Added stage
» Modified but
not added unstage
進入Index區
working directory的內容加進index區
修改過但還沒add
2016/7/7
» Git commit
» 在 stage 狀態的檔案的下一步就是準備提交
( commit ),輸入 git commit
2016/7/7
» git Commit –m
» 若不想每次都跳到編輯畫面就用 commit –m
» Git commit –m “這一次commit的目的”
就完成提交了
» 流程整理:
修改檔案 => 加入 stage (git add) => 提交( git commit )
=> 繼續修改其他檔案
2016/7/7
» 可以使用 git log 的指令查看過去 commit 的紀
錄
2016/7/7
» git log -p :
» 將所有 log 和修改過得檔案內容列出
» git log -p filename :
» 將此檔案的 commit log 和 修改檔案內容差異部份列出
» git log filename :
» 這個檔案的所有 log
» git log directory :
» 這個目錄的所有 log
2016/7/7
»Git diff
可以查看修改檔案的差異
可以用在add進index之前 查看修改的差異
2016/7/7
» Git 修改檔名
» Git mv <舊檔名> <新檔名>
2016/7/7
» Git rm <file>:刪除檔案
» Git checkout <檔名>:還原已更改的檔案
2016/7/7
» Git clean :刪除非管理對象(還沒add)的檔案
加上 -n 參數,可以查看將被刪除的檔案。
若添加 -f 參數則會立即刪除檔案
2016/7/7
» Git reset HEAD -- <file>
» 移除在stage的檔案
狀態會變回Untracked files
2016/7/7
»Reset
» 它本身做的事情就是重置HEAD到之前的commit
git reset HEAD~2
2016/7/7
» git reset --hard
代表會清除所有與最近一次 commit 不同的修
改。
這是最後一次commit之後的樣子
又再次修改了檔案
但是還沒commit
2016/7/7
使用git reset --hard
會回復到上一個commit的狀態
hard指令會重置HEAD回到之前的commit位置
2016/7/7
» git reset --soft
» 取消剛剛的 commit,但保留修改過的檔案。
修改之後
修改完檔案
也commit完之後
執行soft
修改內容沒變動
2016/7/7
2016/7/7
建立分支
» Git branch <分支名>
» 用git branch查看分支
» 加上 -r 參數,將顯示遠端分支。
加上 -a 參數,可以顯示遠端與本地端的分支
2016/7/7
» 修改分支的名稱
git branch -m <oldbranch> <newbranch>
刪除分支
git branch -d <branchname>
切換分支
git checkout <branch>
2016/7/7
合併分支
git merge
Fast-forward:合併 其中一個分支到 master 分支時,
如果master 的狀態是沒有更改過的話,
分支的歷史記錄包含了 master 分支的歷史記錄,
所以只要把分支移動到 master 分支就可以導入分支的內容。
這樣的合併被稱為 fast-forward合併。
2016/7/7
» 在master裡的資料 分支(shawn)裡修改過的資料
使用git merge shawn合
併
master,shawn裡
資料會相同
2016/7/7
» master 的歷史記錄有可能在 分支分開後有新的修改。
這時候,要把 master 的修改內容和 分支的修改內容匯
合起來
» 匯合兩個修改時會產生一個名為「合併提交」的提交。
Master的位置會被更新到新建立的合併提交上
2016/7/7
» 在master跟shawn分支裡都有新增資料
» 使用git merge shawn合併就行了
» 若發生衝突(confict)
<<<<<<< HEAD 到 ======= 的中間區域是目前你所在 branch 的 commit 內
容
而從 ======= 到 >>>>>>>>shawn 則是你要合併的 shawn的內容,
你必須做出決定看是要兩個都留下,或是選一個,或是改成你想要的內
容,改好後記得要將 Git 自動產生的 <<< 、 =====、 <<< 的內容都刪除,
修改完畢後存檔,將剛剛修改過的檔案再使用 git add 加入 stage ,將所
有的衝突都修正完畢後就使用 git commit 提交一次 commit,由於這次的
commit 是在處理 merge 時的衝突,因此 Git 很聰明的已經幫我們加上了
一些預設的訊息 “Merge branch ‘cat’”, commit 提交後就會看到合併成
功的訊息了。
2016/7/7
confict發生
修改完後重新add commit
處理步驟: 1.將發生 confict 的檔案打開,修改 ( 記得刪除<<<、===、>>> )。
2.使用 git add 將處理好的檔案加入 stage。
3.反覆步驟 1~2 直到所有 confict 處理完畢。
4.git commit 提交合併訊息。
2016/7/7
git rebase:
與 git merge 不同的是, git rebase 不單單只是將兩個不同的
branch 合併起來,而是將某一支 branch 基於另一支 branch 的內
容合併起來,但需要修改發生衝突的部分
2016/7/7
» 原本是兩個不同分支
用git rebase sahwn合併
2016/7/7
2016/7/7
指令:git clone <url>
» <url>:遠端數據庫URL
˃ http://10.16.179.37/Intern2016/gittest.git
˃ http://username:password@10.16.179.37/Intern2016/gittest.git
2016/7/7
指令: git remote add <name> <url>
» <name>:給遠端數據庫的名稱
» <url>:遠端數據庫URL
˃ http://10.16.179.37/Intern2016/gittest.git
˃ http://username:password@10.16.179.37/Intern2016/gittest.git
2016/7/7
指令:git remote
» 加上-v顯示詳細狀況
2016/7/7
指令:git push <name/url> <branch>
» <name/url>:添加數據庫時設定的名稱或URL
» <branch>:指定遠端數據庫分支,可不指定
» Push前需要先commit
2016/7/7
指令:git pull <name/url> <branch>
» <name/url>:添加數據庫時設定的名稱或URL
» <branch>:指定遠端數據庫分支,可不指定
2016/7/7
指令:git fetch <neme/url> <branch>
» <name/url>:添加數據庫時設定的名稱或URL
» <branch>:指定遠端數據庫分支,可不指定
2016/7/7
指令:git push –tags <tagname>
» <tagname>:Tags名稱
2016/7/7
指令:git push –delete <neme/url> <tagname>
» <tagname>:Tags名稱
2016/7/7
指令:git remote set-url <name> <new
url>
» <name>:遠端數據庫名稱
» <new url>:新的URL
2016/7/7
指令:git remote rename <old name> <new name>
» <name>:遠端數據庫名稱
» <new name>:新的遠端數據庫名稱
2016/7/7
2016/7/7
指令git stash save
» 暫存尚未commit的資料,並從檔案中移出
2016/7/7
指令:git stash list
» 列出暫存清單
2016/7/7
指令:git stash pop
» 修改內容恢復至檔案
2016/7/7
指令:git stash drop
» 刪除最新暫存
2016/7/7
指令:git stash drop stash@{ID}
» 刪除特定暫存
2016/7/7
指令:git stash clear
» 清除所有暫存資料
2016/7/7
標示標籤(annotated tag)
紀錄標記者名稱、信箱、時間、註解等資料
通常用於重要的commit,如標示發布版本
輕量標籤(lightweight tag)
單純將標籤指向該commit資料
通常用於本地端資料庫暫時標示
2016/7/7
指令:
git tag –a <tag名稱> -m “註解”
2016/7/7
2016/7/7
指令:
git tag <tag名稱>
2016/7/7
指令:
git tag –d <tag名稱>
2016/7/7
git tag
顯示既有的Tag
git tag –n <Tag名稱>
顯示既有Tag與其註解
git tag –a <Tag名稱> -m “註解”
新增標示標籤 ,如果沒有輸入-m,系統會開啟文字編輯器即可編輯註解
git tag <Tag名稱>
新增輕量標籤
git tag –d <Tag名稱>
刪除既有標籤
git show <Tag名稱>
透過Tag名稱找出其對應的commit資料
2016/7/7
2016/7/7
指令:
git commit --amend
2016/7/7
將註解修改成“修改最後一次提交”存檔後關閉
2016/7/7
指令:
git commit --amend --author=“新名稱<新信箱>"
修改author
2016/7/7
2016/7/7
指令:
git revert <HEAD>
2016/7/7
2016/7/7
新增文字一 新增文字二 新增文字三 新增文字四
新增文字一 新增文字二 新增文字三 新增文字四
取消新增文
字四
Commit變化
2016/7/7
指令:
git reset --hard <HEAD>
2016/7/7
2016/7/7
Reset練習
第二次
commit
第三次
commit
第四次
commit
PS:若想保留修改過的檔案,
只還原commit的話,可以使用--soft
Reset練習
第二次
commit
第三次
commit
2016/7/7
指令:
git cherry-pick <commit>
Master 分支 Cherry分支
2016/7/7
PS:使用cherry-pick撿回來的commit
其Author與Date會與原出處一模一樣
2016/7/7
指令:
git rebase <branch分支>
新增撿櫻桃 新增rebase Master測試
新增第三行 新增第四行 新增第五行
Master分支
rebase分支
2016/7/7
新增第三行 新增第四行 新增第五行
rebase分支
新增撿櫻桃 新增rebase Master測試
Master分支
PS:rebase是把原本的commit
重新提交到指定的branch
所以會得到新的commit ID
Commit分支變化
2016/7/7
Thank You
2016/7/7

How to Use Git?