摘要:完成本系列文章的閱讀以後,你將掌握git的基本概念與git的基本命令,可以在本地隨心所欲的完成代碼的提交撤銷保存修改等操作、可以流暢的參與多人協作,讓我們快點來學習吧!

上集回顧:

經過上一次的學習,傳送門 --> Git 版本控制,看這篇就夠了 (一)我們學會了下以內容,如果還不會的同學趕快補補課。

  • Git的基本概念
  • 知道了git的作用、歷史;
  • 學會安裝配置Git,使用Git創建項目託管以及工作區和暫存區的概念

我們這一次是一次孤獨的版本控制管理,因為這次只有一個人孤軍奮戰,等下一次我們就可以體驗到多人協作的魅力啦!

本文核心點:

  • 如何在本地提交你的代碼(創建、修改、刪除文件)
  • 如何優雅的拉代碼(拉代碼的兩種方式pull、fetch)
  • 什麼是分支以及分支操作 (創建、切換、刪除分支)

01

如何在本地提交你的代碼

還記得上次我們學習了工作區、版本庫、暫存區的概念,我們使用了淘寶商家、私人管家、私人倉庫來舉例,這一節我們還是用他們來舉例,你在本地隨心所欲的寫代碼,你會創建新的文件、修改歷史文件、甚至不滿意了就刪掉兩個文件這些都是可以的,因為你是老大聽你的。

你養了一個管家他就是你的本地版本倉庫,躲在根目錄下面,是名字叫 .git的一個隱藏文件夾,本地的所有直接針對代碼文件的操作都是在工作區完成的。

然後我們再用一系列命令給工作區的代碼放到暫存區里,再通過一系列命令提交到版本庫中去,並且在提交到版本庫的過程中可以標記每次提交的代碼是新增了什麼功能、改了什麼bug、刪除了哪些文件;非常的直觀舒服,請容我細細道來。

新文件與修改

$ ls
README.md

$ touch file1.txt

$ git add file1.txt

$ git status
On branch master
Your branch is up to date with origin/master.

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: file1.txt
$ git commit -m "[+]add new file1.txt"
[master 66cc488] [+]add new file1.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt

上圖操作包含:

  • 創建新文件file1.txt
  • add 添加修改的內容到索引
  • status 查看修改的內容
  • commit 把索引提交到本地分支

git add . :監控工作區的狀態樹,此命令會把工作區的所有變化提交到暫存區,包括文件內容修改(modified)以及新文件(new),但不包括被刪除的文件。

git add -u:他僅監控已經被add的文件(即tracked file),他會將被修改的文件提交到暫存區。add -u 不會提交新文件(untracked file)。(git add --update的縮寫),我們在寫一個的新的功能創建了一些新的代碼文件,我們暫時不想提交這些代碼,這種情況下就可以考慮此命令

git add -A :是上面兩個功能的合集(git add --all的縮寫),一般新創建和刪除的文件都是要加到暫存區的,所以我們通常直接用這個命令就可以了。

git show 列出最近一次的提交

對於commit:像這樣,你不斷對文件進行修改,然後不斷提交修改到版本庫里,就好比玩RPG遊戲時,每通過一關就會自動把遊戲狀態存檔,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打Boss之前,你會手動存檔,以便萬一打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當你覺得文件修改到一定程度的時候,就可以「保存一個快照」,這個快照在Git中被稱為commit。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

刪除文件

$ ls
README.md file1.txt

$ git rm file1.txt
rm file1.txt

$ ls
README.md

$ git status
On branch master
Your branch is ahead of origin/master by 1 commit.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: file1.txt

$ git commit -m "[-]delete file1.txt"
[master e278392] [-]delete file1.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 file1.txt

上圖操作包含:

  • 創建新文件file1.txt
  • git rm 刪除file1.txt文件
  • status 查看修改的內容
  • commit 把索引提交到本地分支

tip1: 如果沒有用git rm刪除文件,在本地刪除文件後,git add一下再提交可以達到同樣的效果

tip2: 要是你加班太晚,頭暈不小心刪除了不想刪除的文件怎麼辦?敬請期待以後的推送之後悔葯

02

如何優雅的拉代碼

方法一 pull

$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), 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 github.com:pzqu/git_test
5fd4d8f..7b54a8a master -> origin/master
Merge made by the recursive strategy.
share_file.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 share_file.txt

上圖命令:

  • git pull

查看本地倉庫變化git log

上圖可以看到向遠程倉庫pull的時候,出現了兩個新的commit,commit 7b54a8ae74...的提交信息為Create share_file.txt,另一個commit fdbb19cf4c51770的提交信息為Merge branch master of github.com:pzqu/git_test。事實上主線只有一個提交,為什麼會出現這種情況? 是因為pull其實會做兩個操作

  • 拉遠程倉庫代碼到本地
  • 自動與當前分支合併並生成一個合併成功的提交

注意這裡的第二個個步驟如果遠程有人和你改了同一個文件就會出現一個衝突,這個時候git會提示你哪些文件有衝突,手動改了再提交一次就可以了。詳情見合併衝突

方法二 fetch

我在遠程修改了文件,向share_file.txt加了一行內容tom modify,此時拉代碼。

$ git fetch

$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: [+]add new file1.txt
Applying: [-]delete file1.txt

上圖所示有以下兩個操作

  • fetch 拉取遠端代碼到本地
  • rebase 把本地代碼提交基於遠端分支重新replay

效果如下:

上圖是git log所輸出的提交內容,剛剛pull的時候忘記把pull自動產生的merge提交到遠程,rebase的時候把本地的提交放到了遠程提交之後,看起來就是一條直線,比較優雅,也是推薦的方式。

同樣的,如果在拉代碼的時候,有另一個人也向遠程倉庫提交了代碼,恰好你們的代碼都是修改的相同的文件,這就會發生一個衝突,必須要你來親自決定哪些代碼留下哪些代碼刪掉,詳情我們會在以後的文章合併衝突和大家一起分析,這次我們摒棄雜念,只考慮一個人的情況下。

03

什麼是分支以及分支操作

創建分支

分支是多人協同最經典的地方所在,我們來創建一個分支

$ git checkout -b dev/pzqu origin/master
Branch dev/pzqu set up to track remote branch master from origin.
Switched to a new branch dev/pzqu

$ git branch
* dev/pzqu
master

  • git checkout -b 分支名 其他分支,-b代表創建並切換到新建的分支,分支名代表新創建的分支叫什麼名字,這裡叫dev/pzqu其他分支代表基於哪一個分支來創建,這裡基於遠程的master分支origin/master,如果省略則代表基於當前分支
  • git branch展示本地的分支情況,加-a參數可以展示全部的分支,包括遠程分支
  • *在分支前,指明了現在所在的分支是dev/pzqu

切換分支

$ git checkout -b dev/pzqu2
Switched to a new branch dev/pzqu2

$ git branch
dev/pzqu
* dev/pzqu2
master

$ git checkout dev/pzqu
Switched to branch dev/pzqu
Your branch is up to date with origin/master.

$ git branch
* dev/pzqu
dev/pzqu2
master

  • 基於當前分支創建了一個新的分支並自動切換過去dev/pzqu2
  • git checkout 已存在的分支名切換分支回到dev/pzqu

刪除分支

$ git branch
* dev/pzqu
dev/pzqu2
master

$ git branch -D dev/pzqu2
Deleted branch dev/pzqu2 (was 7c9be37).

$ git branch
* dev/pzqu
master

  • 位於dev/pzqu,刪除了dev/pzqu2分支

小結

今天的三分鐘就到此結束了,通過本次的學習我們學會了

  1. 如何本地的工作區與暫存區之間提交你的代碼(創建、修改、刪除文件)
  2. 如何優雅的拉代碼(拉代碼的兩種方式pull、fetch)
  3. 什麼是分支以及分支操作 (創建、切換、刪除分支)

下回預告:

下次我們將給大家帶來多人使用Git時的代碼版本控制奇淫技巧——(合併衝突、暫存代碼)敬請期待哦~!


長按識別二維碼關注我,一起領略編程的魅力
推薦閱讀:
相关文章