GIT 使用筆記

GIT 使用筆記

二月 11, 2018

GIT 基本筆記

1. 進入暫存區(ADD)、提交版本(COMMIT)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
git clone   
clone下來別人的專案到local端

git init
創建一個新的Repository (打開任何一個專案資料夾打上git init)

add add 主檔名.副檔名
將檔案提交入Staging Areagit add 整個資料夾提交入Staging Area

git commit -m '一行解說文字'
將檔案提交入Repository git commit -e 能用編輯器撰寫多行解說文字

git rm --cached 檔案名稱
將不在Repository的檔案移出Staging Area

git reset HEAD
將已經在Repository的檔案移出Staging Area

git status
查看目前檔案的狀態

git log
查看目前所有commit的歷史紀錄

如果已經被加入repository過的檔案,絕對不行用git rm –cached,因為這行指令是把檔案從Repository中幹掉:

  1. 若檔案不在Repository內 : git rm –cached幫我們從stage刪除,且檔案本來就是untracked,執行完還是untracked,還在預期之內。
  2. 若檔案已經在repository內 : git rm –cached會幫我們從repository刪除,並且從stage刪除,因為已經從repository刪除檔案,檔案會從tracked變成untracked。

因此要移除Staing Area中的檔案,我們必須根據檔案狀態採用不同的指令: __

  1. 若該檔案不在repository內 : git rm –cached 檔案名稱
  2. 若檔案已經在repository內 : git reset HEAD 檔案名稱

2. 查看目前狀態的常用指令 (DIFF, LOG, SHOW)

從Git命令列鍵入git diff就可以看到修改過後的紀錄。

git diff
1
2
3
4
5
6
7
8
diff --git a/hello.txt b/hello.txt
index e69de29..1029def 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1,2 @@
+print ('hello world')^M
+print ('I wanna fly')
\ No newline at end of file

要怎麼知道每一項commit確切到底改了什麼

git show來查看某項特定commit的修改內容:

1
2
3
4
5
6
7
8
9
10
11
12
$ git log
commit 8a85094b22edf4184e7228c3f849807dd7eed2c9
Author: Lynn19931205
Date: Wed Sep 7 19:07:21 2016 +0800

Add new line I wanna fly

commit 0dc97a8057e1f30139729ce2316f5be966a65ef2
Author: Lynn19931205
Date: Wed Sep 7 18:32:32 2016 +0800

Add a line.

然後我們把上面第一欄的commit代碼複製起來 (複製六碼或以上)後輸入在git show後面,就會顯示該次詳細的修改內容:

1
2
3
4
5
6
7
$ git show 8a8509
commit 8a85094b22edf4184e7228c3f849807dd7eed2c9
Author: Lynn19931205
Date: Wed Sep 7 19:07:21 2016 +0800

Add new line I wanna fly
diff --git a/hello.txt b/hello.txtindex e69de29..1029def 100644--- a/hello.txt+++ b/hello.t

在git diff後面輸入commit代碼,也可以比較兩次commit間修改的差異:

1
2
3
4
5
6
7
8
9
$ git diff 8a8509 0dc97a
diff --git a/hello.txt b/hello.txt
index 1029def..e69de29 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +0,0 @@
-print ('hello world')
-print ('I wanna fly')
\ No newline at end of file

總結

1
2
3
4
5
6
7
8
9
10
11
git log 
列出所有commit的歷史紀錄

git diff
比較文件或commit間修改的差異

git show
詳細列出該次commit的修改內容

git status
列出目前的檔案狀態

3. 推送程式碼至REMOTE端 (PUSH/PULL)

在GitHub上創建一個和本地端名稱相同的資料夾,專案描述可寫可不寫、權限設為開放、README不用勾選,最後按下 :
Imgur

將hello.txt檔案打開,在Remote端的第三行加入一排的驚嘆號「!!!!!!」、再打開Local端加入一排的問號「?????」。

Imgur

接下來一樣透過和git commit -m,將Local端的程式碼送進Repository。有趣的來了,當我們將輸入 git pull 將程式碼從Remote端拉下來到Local端這邊時:

1
2
3
4
5
6
7
8
9
10
 git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/Lynn19931205/project_1
260b7de..957b721 master -> origin/master
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.

Git表示:你們有一些衝突(conflicts),待解決完我才會幫你們成功把Remote端的東西融合到Local端這邊噢。先來打開Local端的hello.txt檔案:

Imgur
最後再一次git commit、git add,最後用git push將目前這個版本「推送」到Remote端 (一樣須輸入GitHub帳號密碼)。

這時回到GitHub網站重新整理,可以發現…Remote端的程式碼從驚嘆號變成最新修改完成的問號了!

4. 切換(CHECKOUT), 開分支(BRANCH)與融合(MERGE)

branch

Git作為分散式版本管理系統的好處是不需仰賴中央單一一條主幹道開發,可根據開發需求、隨時在某一時間點開分支(branch)獨立開發某一項功能,待開發完成後再融合(merge)回去主幹道。

概念圖:
Imgur
主幹(master)與分支(branch)是稱呼專案的主要版本和分支版本。在Git第一個建立的專案版本會被稱為master版本。

然而實際上master也僅是其中一條branch,所有branch間的關係都是平等的、彼此間無主從關係。一般習慣將穩定版本稱主幹,其餘的變動、開發中版本則都稱作分支。

開branch的方式非常簡單,直接輸入git branch 即可。
git branch branch_a

是意圖:
Imgur

checkout

目前master幹道上有五個commit的版本;若沒有指定要回溯至哪一個歷史版本,branch就會採用最新一次commit的版本。 但若我們想切到某一個commit版本開一條branch時

Imgur

我們可以先輸入git log查看所有commit的歷史紀錄:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
git log 
commit 372466ead9e54fd3a464cb85d78cd5304f335bc4 Merge: 6183031 957b721
Author: Lynn19931205
Date: Wed Sep 7 23:35:26 2016 +0800

Final Edit

commit 957b721541d834fb7a71157f0401bdd013ea6e08
Author: Lynn
Date: Wed Sep 7 23:23:16 2016 +0800

Update hello.txt

commit adb3238e29668c95130c1e6e82b5bab3faef5489
Author: Lynn19931205
Date: Wed Sep 7 20:30:07 2016 +0800

Add a if statement

commit 8a85094b22edf4184e7228c3f849807dd7eed2c9
Author: Lynn19931205
Date: Wed Sep 7 19:07:21 2016 +0800

Add new line I wanna fly

commit 0dc97a8057e1f30139729ce2316f5be966a65ef2
Author: Lynn19931205
Date: Wed Sep 7 18:32:32 2016 +0800

Add a line.

選好回溯的時間點後使用 git checkout (checkout後面輸入commit代碼至少6碼);待checkout過去之後,就可以開一條branch了:

1
2
3
$ git checkout adb3238

$ git branch branch_a

但這邊我們只是先建立了一個branch噢,實際上我們人還待在master這條幹道上。

因此我們必須利用checkout的另外一個功能、也就是切換各條branch的功能! (別忘了master也只是其中一條branch)。輸入git checkout :

1
2
$ git  ckeckout branch_a
Switched to branch 'branch_a'

輸入git branch -a可以查看目前我們開的所有branch:

1
2
$ git branch -a      
branch_a* master remotes/origin/master

輸入git branch -a可以查看目前我們開的所有branch(*代表當前所在位置):

1
2
3
4
$ git branch -a      
branch_a* master remotes/origin/master
$ git branch -a
branch_a* master remotes/origin/master

當我們不想要這條branch時,可以用git branch -d 刪除:

1
git branch -d branch_a

MERGE

首先必須利用checkout回到想要merge過去的主幹道上;比如在此例中我們用git checkout回到master線上之後,再輸入要merge過去的branch名稱git merge 。

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

$ git merge branch_a

進階 Git reset 取消上一次的操作

取消 merge

版本控制最大的好處之一就是讓你永遠可以後悔,因此我們常會希望把已暫存的檔案、已提交的 commit 或是已合併的 branch 取消修改,這時候我們可以使用 git reset 這個指令來幫助我們,像現在我若是想要取消剛剛的 merge 動作,我只要下:

1
2
$ git reset --hard ORIG_HEAD
HEAD is now at c126ff9 Config initialze

取消已暫存的檔案

有時候手殘不小心將還沒修改完的檔案使用 git add加入了 stage ,這時候可以使用 git reset HEAD <file> 來將這支檔案取消 stage:

Imgur

你可以看到我使用 git add 將檔案加入 stage 後,在我的 status 狀態顯示 lib/cat.rb 這支檔案現在已經準備好被 commit ,但這時我使用了 git reset HEAD 將這支檔案取消 stage,再使用 status 查看時它就變回一支還沒加入 stage 的檔案了。

取消修改過的檔案

連續剛剛的情況,若是我想完全放棄這次修改 (將檔案狀態回復到最新的一次 commit 時的狀態),我可以使用 git checkout -- <file> 來回復這支檔案:

1
2
$ git checkout -- lib/cat.rb
取消變更不會有任何訊息,但這時你去看檔案會發現他已經回復成沒修改過時的模樣了。

修改上一次的commit

手誤打太快, commit 訊息打錯時,我們可以使用 git commit –amend 來幫助我們重新修改:
Imgur.

Imgur

在上面我想要修改打錯字的 commit 訊息 “Cat initiae”,因此我使用 git commit –amend 來修改成正確的訊息。

強制回復到上一次 commit 的版本

有時候我們想要放棄所有修改回到 commit 時的狀態,這時候我們可以下 git reset --hard HEAD 來回復,HEAD 參數可以加上一些變化,例如 HEAD^ 表示目前版本的上一個版本 HEAD~2 則是再上一個,因此你可以自由的跳回去之前的狀態。

如果您想要保存修改過的檔案,請勿下此指令,請用上面的方式去解決。!!