Git的基本操作

  • 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)什么都沒有輸出。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鸠蚪,一起剝皮案震驚了整個濱河市今阳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茅信,老刑警劉巖盾舌,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汹押,居然都是意外死亡矿筝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門棚贾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榆综,你說我怎么就攤上這事妙痹。” “怎么了鼻疮?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵怯伊,是天一觀的道長。 經常有香客問我判沟,道長耿芹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任挪哄,我火速辦了婚禮吧秕,結果婚禮上,老公的妹妹穿的比我還像新娘迹炼。我一直安慰自己砸彬,他們只是感情好颠毙,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砂碉,像睡著了一般蛀蜜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上增蹭,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天滴某,我揣著相機與錄音,去河邊找鬼滋迈。 笑死壮池,一個胖子當著我的面吹牛,可吹牛的內容都是我干的杀怠。 我是一名探鬼主播椰憋,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赔退!你這毒婦竟也來了橙依?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤硕旗,失蹤者是張志新(化名)和其女友劉穎窗骑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漆枚,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡创译,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墙基。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软族。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖残制,靈堂內的尸體忽然破棺而出立砸,到底是詐尸還是另有隱情,我是刑警寧澤初茶,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布颗祝,位于F島的核電站,受9級特大地震影響恼布,放射性物質發(fā)生泄漏螺戳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一折汞、第九天 我趴在偏房一處隱蔽的房頂上張望倔幼。 院中可真熱鬧,春花似錦字支、人聲如沸凤藏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揖庄。三九已至栗菜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹄梢,已是汗流浹背疙筹。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禁炒,地道東北人而咆。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像幕袱,于是被迫代替她去往敵國和親暴备。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git们豌,從https:/...
    落魂灬閱讀 12,656評論 4 54
  • 1涯捻、直接克隆遠程倉庫的某個分支 git clone -b 遠程分支名 遠程倉庫地址 本地文件夾名 如...
    曹軒躍閱讀 632評論 0 1
  • Git 是一個以命令行為主的免費開源的分布式版本控制系統(tǒng),用于敏捷高效的處理任何或大或小的項目望迎。是Linus To...
    sunnyaxin閱讀 855評論 7 6
  • 昨天有一只大黃蜂飛到我的床前辩尊,掠過我的身影涛浙,只聽見你那嗡嗡作響的雙翅拍出的憂桑聲,黃蜂飛來兮摄欲,欲為何意也轿亮。 ...
    米瀾盛若閱讀 644評論 2 1
  • 【微公益】【786】【每日經典,伴您早起】【20170619孟子260】 孟子曰:“養(yǎng)心莫善于寡欲蒿涎。其為人也寡欲哀托,...
    北冥_鯤閱讀 324評論 3 6