Git 課程學習筆記

2017-02-04

掌握Git & Github 程式時光機

udemy課程網址以下為課程筆記,內容版權為原課程所有。

[TOC]


Table of Contents

整體流程圖

git

上傳流程

產生本地端數據庫 (Local Repository)

git init 產生本地端數據庫(local repository)

在工作目錄內新增檔案

1
2
3
4
5
6
# 產生index.html, index2.html檔案
touch index.html
touch index2.html
mkdir css
touch css/all.css
touch index.html

從工作目錄傳到索引

  • add changes from working directory to staging area
1
2
3
4
5
6
7
8
9
10
11
#把所有的檔案加到索引裡面,代表的是開始要追蹤這些檔案的變更 
git add .

#看看有沒有加到索引裡面
git status

#變更index2.html
touch index2.html

#因為index2.html變更了,所以要告訴git要追蹤這個變更
git add index2.html

把變更加入到本地儲存庫

  • commit changes from staging area to local repository
  • 確認這些變更
1
2
3
4
5
#commit之後會放到本地儲存庫
git commit -m 'update1'

#檢視過去git的紀錄
git log

不想上傳變更了

忽略追蹤

  • .gitignore
  • 不想追蹤的檔案,就放到.gitignore裡面
  • 可以參考 github的.gitignore
1
2
3
4
5
vim .gitignore
#在.gitignore可以加入下列幾行,表示不追蹤那些檔案
index.html
*.html
css/

不追蹤原本在索引中的檔案

reset head in staging area

git reset HEAD :不追蹤目前在staging area的檔案
git reset HEAD 檔案名稱 :不追蹤staging area特定的檔案名稱

從本地儲存庫還原檔案至工作目錄

check out files from local repository
效果就是還原檔案

git checkout 檔案名稱

還原工作目錄與索引

檔案內容會跟最後一次commit保持一樣
git reset --hard

本地及遠端儲存庫之間的操作

把本地儲存庫推到遠端儲存庫

git push

把遠端儲存庫複製到本地端儲存庫

git clone https://github.com/username/repo_name.git

分支分支分支

查看目前有哪些分支

git branch 瀏覽目前有哪些分支

HEAD:目前所在位置的指標

回到特定的commit

1
2
3
git log  # 看看要回到哪個commit
git checkout git_log_的前四碼 # 可以回到特定的 commit
git checkout master # 復原

創立分支

git branch branch_name

1
2
3
4
5
6
7
8
9
10
11
12
# 創立分支
git branch branch_name
# 編輯程式
touch b.txt
git add b.txt
git commit -m 'create b.txt'

# 切換到 master
git checkout master

# 切換到 branch_name
git checkout branch_name

fast forward 合併分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd desktop
mkdir project
cd project
git init
touch index.html
git branch feature1
echo "<head>this is title</head>" >> index.html

git add index.html
git commit -m 'add index.html'

git checkout master
git merge feature1
# now the content of index.html is the same between branch feature1 and master.

當兩個分支產生衝突

master, feature1 同時更新,卻發生衝突

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
cd desktop
mkdir project
touch index.html
vim index.html
<head>this is headline</head>

<body>
</body>
<h1> this is a test</h1>

git branch feature1
git checkout feature1
vim index.html
<head>this is headline</head>

<body>
<link rel='sytlesheet' href='css/all.css'>
</body>
<h1> this is a test</h1>
git add index.html
git commit index.html -m 'add css to index.html in branch feature1'

git chechout master
cat index.html
<head>this is headline</head>

<body>
</body>
<h1> this is a test</h1>
vim index.html
<head>this is headline</head>

<body>
<h1> add a line</h1>
</body>
<h1> this is a test</h1>

git add index.html
git commit index.html -m 'add h1 to body in branch master'

# 開始合併
# 在branch master中合併branch feature1
# 因為兩個分支改了同一行,所以會有衝突
git merge feature1

# 發現衝突的檔名
vim index.html
<head>this is headline</head>

<body>
<<<<<<< HEAD
<h1> add a line</h1>
=======
<link rel='sytlesheet' href='css/all.css'>
>>>>>>> feature1
</body>
<h1> this is a test</h1>

# 修改成
<head>this is headline</head>

<body>
<h1> add a line</h1>
<link rel='sytlesheet' href='css/all.css'>
</body>
<h1> this is a test</h1>

git add index.html
git commit -m 'mearge index.html in branch master and feature1'

# master 有最後合併的結果
# feature1 則是原本feature1,不會因為merge而改變

標籤

對commit做標籤,未來可以快速回到那個標籤。

git tag 查詢標籤
git tag -n查詢詳細標籤
git tag -d tag_name刪除標籤
git tag tag_name新增標籤
git tag -am '備註內容' tag_name新增有備註的標籤

git checkout tag_name 切換到標籤的commit

暫存

例如在工作目錄奮鬥了一陣子,卻臨時有需要先處理別的commit時,就先把目前的工作目錄的資料暫存起來。有需要將當前工作目錄中的修改帶到其他的分支時,也可以把當前工作目錄中的資料暫存起來,切換到其他的分支,然後還原暫存,如果檔案有衝突就處理衝突。
git stash 暫時儲存當前目錄
git stash list 瀏覽 git stash 列表
git stash pop 還原暫存
git stash drop 清除最新暫存
git stash clear 清除全部暫存

github團隊協作

git remote 看看有那些遠端數據庫
git remote rename 原名稱 修改名稱 修改遠端數據庫的名稱
git push origin master 把commit送到遠端主機的某個分支。origin是預設的遠端主機名稱 master是分支名稱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先在github上建立一個repository
git clone https://github.com/usernamte/repository_name.git
cd repository_name
touch index.html
git add index.html
git commit -m 'add index.html'
git push

git branch issue1
touch a.html
git add a.html
git commit -m 'add a.html'
git remote
git remote origin github
git push github issue1
# 把issue1分支也送到github上了

拉回遠端儲存庫的變更 (git pull)

  • 同事A開始要做專案時,先用git clone把專案抓下來到本地數據庫接下來git push origin把開發的index.html上傳到github。
  • 同事B上班後先用git pull把github上面的資料抓下來,然後開始撰寫b.html,最後git push送上去github。
  • 同事A上班後,使用git pull把異動抓下來,檢視目前專案最新的狀態。
  • git log可以協助檢視git pull抓回哪些commit。

推變更到遠端數據庫發生失敗時(先PULL變更)

  • 有些情況無法push,這時候需要pull再重新push
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
31
32
33
# 在github上新建立一個遠端儲存庫

# 同事A下載遠端數據庫
git clone https://github.com/username/reponame.git

touch index.html
git add index.html
git push origin master

# 同事B下載遠端數據庫
git clone https://github.com/username/reponame.git

# 同事A 晚上勤奮開發
touch index2.html
git add index2.html
git commin -m 'add index2.html'

# 同事B 隔天早上直接新增檔案
touch a.html
git add a.html
git push origin master

# 同事B 在push時出錯了,git告訴你應該要先做git pull
git pull
# 同事B 發現結果git pull時,git自動做了合併,之後同事B就可以push了
git push origin master

# 這個時候github上跟同事B的狀態就變成相同的

# 同事A 這個時候可以拉下來github上的遠端儲存庫
git pull origin master

# 這個時候同事A的狀態,就跟github上以及同事B相同了

Github pages

首先在github上面開個demosite網址是https://github.com/username/demosite.git

1
2
3
4
5
git clone https://github.com/usernmae/demosite.git
touch index.html
git add index.html
git commit -m 'add index.html'
git push origin master

上去github,在settings裡面設定github pages

小型團隊分支協作篇

git pull = git fetch + git merge

git fetch origin branch_name 此時會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到審視完沒問題後,再合併 FETCH_HEAD。