- Git是什么?
Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一),簡單點講就是可以記錄你對文件每一次的改動,而且還可以讓同事協(xié)作編輯。
-
在Linux上安裝Git
首先可以先在終端輸入git鞠呈,查看系統(tǒng)有沒有安裝:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
查看版本:
$ git --version
git version 2.7.4
-
創(chuàng)建遠程倉庫
創(chuàng)建完賬號后,可以開始創(chuàng)建倉庫:
-
SSH 公私鑰的使用
講解如何使用 ssh-keygen 生成公私鑰右钾,在終端輸入命令蚁吝,然后建議一路按enter就可以(會把密鑰文件放置再默認路徑~/.ssh/
)
$ ssh-keygen
查看兩個密鑰文件,后綴為 .pub 的就是公鑰文件霹粥,另一個沒有后綴的就是私鑰文件;
-
關聯(lián)公鑰到 Github 賬號下
首先復制公鑰文件中的內容灭将,也就是 ssh-rsa 開頭到 用戶名@主機名 這段字符串(全部復制就對了);打開Setting ->SSH and GPG keys后控,選擇new SSH key庙曙,填寫title和以及將剛才的復制內容粘貼到key:
配置用戶名與郵箱
### 如果想設置為全局生效,添加 --global 參數(shù)
$ git config --global user.name "你的用戶名"
$ git config --global user.email "你的郵箱"
- 克隆倉庫到本地的個人PC
首先到遠程倉庫中浩淘,點擊 Clone or download 按鈕捌朴,選擇使用 Use SSH,然后點擊復制鏈接按鈕
#命令用法:git clone "你復制的倉庫鏈接"
$ git clone git@github.com:Jackpon/Test3.git
正克隆到 'Test3'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收對象中: 100% (3/3), 完成.
檢查連接... 完成张抄。
$ ls
Test3
clone完在你的當前目錄下就有你克隆的文件(我的是Test3)砂蔽,接下來進入Test3,你就可以進行編輯操作了署惯。
- git的基本流程如下
1左驾、 創(chuàng)建或修改文件
2、 使用git add命令添加新創(chuàng)建或修改的文件到本地的緩存區(qū)(Index)
3、 使用git commit命令提交到本地代碼庫
4诡右、 使用git push命令將本地代碼庫同步到遠端代碼庫
- 讀取文件
jackpon@jackpon:~/MyGit_repository$ cd Test3
jackpon@jackpon:~/MyGit_repository/Test3$ ls
README.md
jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md
# Test3
add a repository -Test3
- 添加文件
//$ git add filename
jackpon@jackpon:~/MyGit_repository/Test3$ echo 'file1'>file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ ls
file1 README.md
- 刪除文件
jackpon@jackpon:~/MyGit_repository/Test3$ git rm README.md
rm 'README.md'
-
撤銷
要把倉庫里的改動撤銷回克隆下來的狀態(tài)(注意安岂,如果改動之后執(zhí)行了提交就無法再撤銷,只能從遠程倉庫重新克隆一份到本地)帆吻,可以使用 git reset 命令域那,具體步驟如下:
比如我們要把剛才刪除的 README.md 文件給還原回來,就可以在倉庫目錄下猜煮,敲入 git reset --hard HEAD 來回退
jackpon@jackpon:~/MyGit_repository/Test3$ git reset --hard HEAD
HEAD 現(xiàn)在位于 953adc8 Initial commit
jackpon@jackpon:~/MyGit_repository/Test3$ ls
README.md
jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md
# Test3
add a repository -Test3
-
補充(版本回退):
- HEAD指向的版本就是當前版本次员,因此,Git允許我們在版本的歷史之間穿梭王带,使用命令git reset --hard commit_id淑蔚;
- 穿梭前,用git log可以查看提交歷史辫秧,以便確定要回退到哪個版本束倍;
- 要重返未來被丧,用git reflog查看命令歷史盟戏,以便確定要回到未來的哪個版本.
- 提交倉庫的改動*
在倉庫的每一次改動操作之后,推送同步到遠程倉庫之前甥桂,都需要對這一次或這一批次的操作做提交柿究,命令為 git commit,用法是 git commit -m "你的提交備注"黄选,只有做好提交動作蝇摸,才可以開始推送改動到遠程倉庫同步
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'add file1'
[master da2439b] add file1
1 file changed, 1 insertion(+)
create mode 100644 file1
- 推送改動到遠程倉庫中
當我們提交了倉庫的改動后,就可以開始推送改動的內容到遠程倉庫了办陷,可以使用 git push 命令來推送貌夕,用法是 git push [-u] origin <分支名>,分支名默認是 master 具體步驟如下
第一次推送改動可以使用 -u 參數(shù)民镜,使用之后會綁定你這一次的倉庫分支名啡专,這樣的話下一次推送就不需要加上分支名了,如圖
jackpon@jackpon:~/MyGit_repository/Test3$ git push
對象計數(shù)中: 3, 完成.
Delta compression using up to 4 threads.
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 274 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Jackpon/Test3.git
953adc8..da2439b master -> master
操作完后制圈,在你的github上的Test3中就有file1们童。
- 同步到本地倉庫
$ git pull
<div class="divider"></div>
- 分支與合并
Git的分支可以讓你在主線(master分支)之外進行代碼提交,同時又不會影響代碼庫主線鲸鹦。分支的作用體現(xiàn)在多人協(xié)作開發(fā)中慧库,比如一個團隊開發(fā)軟件,你負責獨立的一個功能需要一個月的時間來完成馋嗜,你就可以創(chuàng)建一個分支齐板,只把該功能的代碼提交到這個分支,而其他同事仍然可以繼續(xù)使用主線開發(fā),你每天的提交不會對他們造成任何影響甘磨。當你完成功能后听皿,測試通過再把你的功能分支合并到主線。
1宽档、 分支
// 創(chuàng)建一個新的叫 Mybranch的分支:
$ git branch Mybranch
//查看現(xiàn)在處于哪個分支:
$ git branch
Mybranch
* master
master分支是Git系統(tǒng)默認創(chuàng)建的主分支尉姨。星號標識了你當工作在哪個分支下,輸入git checkout 分支名
可以切換到其他分支:
jackpon@jackpon:~/MyGit_repository/Test3$ git checkout Mybranch
切換到分支 'Mybranch'
jackpon@jackpon:~/MyGit_repository/Test3$ ls
file1 README.md
我們來修改下Mybranch分支下的file1成‘修改-file1’吗冤,為待會的合并做準備
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git status
位于分支 Mybranch
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動)
修改: file1
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'Mybranch:file1'
[Mybranch e10ee96] Mybranch:file1
1 file changed, 1 insertion(+), 1 deletion(-)
2又厉、 合并
跳轉回master并對file1修改成‘master:file1’
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git checkout master
M file1
切換到分支 'master'
您的分支與上游分支 'origin/master' 一致。
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
file1
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'master:file1'
[master b1730e4] master:file1
1 file changed, 1 insertion(+), 1 deletion(-)
這時椎瘟,兩個分支就有了各自不同的修改覆致,分支的內容都已經不同,如何將多個分支進行合并呢肺蔚?
可以通過下面的git merge命令來合并Mybranch到主線分支master:
# 切換到master分支
$ git checkout master
# 將Mybranch分支合并到master
$ git merge -m 'merge Mybranch branch' Mybranch
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
<<<<<<< HEAD
master:file1
=======
修改-file1
>>>>>>> Mybranch
可以看到沖突的內容被加到file1中了煌妈,我們使用vim編輯這個文件,去掉git自動產生標志沖突的<<<<<<等符號后宣羊,根據需要只保留我們需要的內容后保存璧诵,然后使用git add file1和git commit命令來提交合并后的file1內容,這個過程是手動解決沖突的流程仇冯。
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m '合并file1'
[master 67493f3] 合并file1
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
master:file1
修改-file1
- 合并形象化命令:
$ git log --graph --pretty=oneline
* 67493f39d9383ed394e3fa95e5a30dee2e2c1416 合并file1
|\
| * e10ee96d7ac0500702229347d94c9dc4ff34ef14 Mybranch:file1
* | b1730e4c8e8832e6cdd47b4be66139086fb1b458 master:file1
|/
* da2439b93eb8c7538ca037b4dab940d1a40a0452 add file1
- 撤銷一個合并
如果你覺得你合并后的狀態(tài)是一團亂麻之宿,想把當前的修改都放棄,你可以用下面的命令回到合并之前的狀態(tài):
$ git reset --hard HEAD^
# 查看file1的內容苛坚,已經恢復到合并前的master上的文件內容
$ cat file1
- 刪除分支
當我們完成合并后比被,不再需要Mybranch時,可以使用下面的命令刪除:
$ git branch -d Mybranch
git branch -d
只能刪除那些已經被當前分支的合并的分支. 如果你要強制刪除某個分支的話就用git branch –D
-
比較分支
我們先創(chuàng)建分支test泼舱,并改變編輯test中的文件等缀,最后比較兩個分支的不同處:
$ echo "branch test">>file1
$ echo "new file2">>file2
$ git add *
$ git commit -m "update test branch"
[test 0bc3710] update test branch
2 files changed, 2 insertions(+)
create mode 100644 file2
$ git diff master test
diff --git a/file1 b/file1
index fa49b07..17059cd 100644
--- a/file1
+++ b/file1
@@ -1 +1,2 @@ //意思就是目標文件的第1行開始的2行與源文件第一行有差異
new file
+branch test //目標文件的差異就在這了
diff --git a/file2 b/file2
new file mode 100644
index 0000000..80e7991
--- /dev/null //源文件沒有該文件
+++ b/file2
@@ -0,0 +1 @@
+new file2
注釋:
//git diff 結果分析
---代表源文件
+++代表目標文件
-開頭的行,是只出現(xiàn)在源文件中的行
+開頭的行娇昙,是只出現(xiàn)在目標文件中的行
空格開頭的行尺迂,是源文件和目標文件中都出現(xiàn)的行
差異按照差異小結進行組織,每個差異小結的第一行都是定位語句涯贞,由@@開頭枪狂,@@結尾。
- 更多的比較選項
如果你要查看當前的工作目錄與另外一個分支的差別宋渔,你可以用下面的命令執(zhí)行:
$ git diff test
你也以加上路徑限定符州疾,來只比較某一個文件或目錄:
$ git diff test file1
--stat參數(shù)可以統(tǒng)計一下有哪些文件被改動,有多少行被改動:
$ git diff test --stat
file1 | 1 -
file2 | 1 -
2 files changed, 2 deletions(-)
<div class="divider"></div>
- Git日志
git log命令可以顯示所有的提交(commit):
$ git log
//具體使用查閱help
$ git help log
- 比較提交 - Git Diff
現(xiàn)在我們對項目做些修改:
jackpon@jackpon:~/MyGit_repository$ cd gitproject/
jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new line" >> README.md
jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new file" >> file1
使用git status查看當前修改的狀態(tài):
jackpon@jackpon:~/MyGit_repository/gitproject$ git status
位于分支 master
您的分支與上游分支 'origin/master' 一致皇拣。
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動)
修改: README.md
未跟蹤的文件:
(使用 "git add <文件>..." 以包含要提交的內容)
file1
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
可以看到一個文件修改了严蓖,另外一個文件添加了薄嫡。如何查看修改的文件內容呢,那就需要使用git diff命令颗胡。git diff命令的作用是比較修改的或提交的文件內容毫深。
jackpon@jackpon:~/MyGit_repository/gitproject$ git diff
diff --git a/README.md b/README.md
index 21781dd..410e719 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
gitproject
==========
+new line
命令輸出當前工作目錄中修改的內容,并不包含新加文件毒姨,請注意這些內容還沒有添加到本地緩存區(qū)哑蔫。
將修改內容添加到本地緩存區(qū),通配符可以把當前目錄下所有修改的新增的文件都自動添加:
$ git add *
再執(zhí)行git diff會發(fā)現(xiàn)沒有任何內容輸出弧呐,說明當前目錄的修改都被添加到了緩存區(qū)闸迷,如何查看緩存區(qū)內與上次提交之間的差別呢?需要使用--cached參數(shù):
jackpon@jackpon:~/MyGit_repository/gitproject$ git diff --cached
diff --git a/README.md b/README.md
index 21781dd..410e719 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
gitproject
==========
+new line
diff --git a/file1 b/file1
new file mode 100644
index 0000000..fa49b07
--- /dev/null
+++ b/file1
@@ -0,0 +1 @@
+new file
可以看到輸出中已經包含了新加文件的內容俘枫,因為file1已經添加到了緩存區(qū)腥沽。
最后我們提交代碼再執(zhí)行git diff --cached
:
$ git commit -m 'update code'
[master 96b0176] update code
2 files changed, 2 insertions(+)
create mode 100644 file1
可以發(fā)現(xiàn)什么都沒有輸出。