程式導師實驗計畫 [第一週] Git 進階指令

上一篇的Git超新手入門紀錄完基本的指令,接著要紀錄比較進階的用法,以學會如何在多人協作的情形下進行開發。


合併分支

假設我們從master分支中開了一個名為feature的新分支開發某個功能,並且完成commit提交了,接下來就是準備將feature合併進master之中。

先從feature切換到master

1
2
$ git checkout master
Switched to branch 'master'

git merge : 合併分支

1
2
3
4
$ git merge feature
Merge made by the 'recursive' strategy.
master.js | 1 +
1 file changed, 1 insertion(+)

這樣就成功將分支的功能合併的master主分支之中了。


解決衝突

首先要先知道麽怎樣的狀況會產生衝突?

假如今天從master創建兩個分支feature1feature2,當我們的兩個分支都改到同一支檔案的時候

merge feature1的時候還沒事

1
2
3
4
5
$ folder git:(master) git merge feature1
Updating 0283a07..01a7be4
Fast-forward
master.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

但是merge feature2的時候,因為改動是同一隻檔案,git就會給你提示說有檔案發生衝突

1
2
3
4
$ folder git:(master) git merge feature2
Auto-merging master.js
CONFLICT (content): Merge conflict in master.js
Automatic merge failed; fix conflicts and then commit the result.

簡單來說就是兩個版本都改了同一隻檔案,它不知道你要用的到底是哪個版本,所以就會給你提示叫你決定一個版本。

這時候就將這段code決定一個你要的版本,就可以解決衝突拉~


GitHub : 全球最大工程師交友平台上線拉

前面都是在學Git,知道了Git是一種可以幫你做版本控制的程式,那GitHub呢?

GitGitHub的差異在於一個是一種工具,另一個是一個網站。

GitHub的本體是一個全球最大的Git Server,秉持著開放原始碼的精神,可以提供存放使用Git專案倉庫(Repository)的服務,因為所有東西都是公開的,你可以看到很多很猛的開發者的專案,可以幫忙貢獻其他開發者的專案,其他開發者也可以回饋你的專案,建立起一個讓大家越來越強的良性循環。

同時GitHub也會是開發者很棒的履歷,因為曾經開發過什麼專案、做過哪些貢獻、寫過哪些程式碼,上面都公開透明供面試官參考。


Git狀況劇

commit了但想改commit message

git commit --amend

先用git log查看目前的commit message

1
$ git log --oneline
1
2
3
4
5
5b08e21 (HEAD -> master) WTF
e6d3637 (feature2) feature change
01a7be4 (feature1) some change
0283a07 Merge branch 'feature'
76eee44 add some feature

覺得那位WTF不太行,想修改最後一次的commit message

使用commit --amend修改commit message

1
git commit --amend -m "Welcome To FaceBook"

再查看一次,就會發現commit message已經被修改

1
2
3
4
5
9e3c120 (HEAD -> master) Welcome To FaceBook
e6d3637 (feature2) feature change
01a7be4 (feature1) some change
0283a07 Merge branch 'feature'
76eee44 add some feature

需要知道的是,commit --amend只能修改最後一次commit message

如果想要修改的是更之前的commit message,可以參考【狀況題】修改歷史訊息

commit了可是我又不想commit

git reset HEAD^

如果你只用git log --oneline查看紀錄你會看到最新的當前版本都會有一個HEAD

1
6e17f24 (HEAD -> master) init

HEAD指的就是最新的這個版本,^指的是上一個,所以git reset HEAD^指的就是回到上一個commit,也可以直接使用<版本號>進行回復。

我還沒commit,但我改的東西我不想要了

git checkout --

git checkout -- <file name>:想針對某個檔案去捨棄變更

1
$ git checkout -- <file name>

git checkout -- .:想捨棄所有變更就改成.

1
$ git checkout -- .

我還想改 branch 名稱

git branch -m <name> <new name>

使用git branch -m 後面加上原本的名稱跟想要的新名稱

1
$ git branch -m name newname

怎麼拉下遠端的branch

git checkout <branch>

git checkout後面接上想要的遠端分支

1
$ git checkout branch

Git Hooks

Git Hooks是一些自訂的腳本,用於控制Git工作的流程,分為客戶端服務端

可以設定在某些情況下觸發自己設定的腳本做某些事情。

參考Git hooks, practical uses


總結

  1. git merge <branch> 來合併分支
  2. 如果在git merge之後產生了衝突,決定該段 code 之中修改成一個最終版本來解決衝突。
  3. 了解GitGitHub兩者的差別
  4. 知道了一些在Git的使用上的小技巧

為你自己學 Git

受益良多的大補帖,推推!!

 以上就是這篇的筆記內容

程式導師實驗計畫第三期