1. 程式人生 > >淺談使用git進行版本控制

淺談使用git進行版本控制

     小編在學習視覺化的時候,接觸到git,所以這裡寫一下關於GitHub的有關知識,寫這個的目的還是鞏固自己的學習,一方面可以提高自己,另一方面回頭看一下,有什麼更深層次的東西還可以再記錄。

     首先說一下版本控制軟體,它可以讓我們能夠拍攝處於可行狀態的專案的快照,修改專案(如實現新功能)後,如果專案不能正常執行,可以恢復到前一個可行狀態。

    通過使用版本控制,我們可以無憂無慮的改進專案,不用擔心專案因為我們犯錯而遭到破壞,對於大型專案來說,這顯得尤為重要,但是對於小專案來說,哪怕只包含一個檔案的程式,也大有裨益。

    GibHub的名字源於Git,Git是一個分散式版本控制系統,讓程式設計師團隊能夠協作開發專案,Git幫助大家管理為專案所做的工作,避免一個人所做的修改影響其他人所做的修改。你在專案中實現一個新功能的時候,Git將跟蹤你對每個檔案所做的修改。確定程式碼可行後,你將提交所做的修改,而Git將記錄專案最新的狀態,如果你犯了錯,想撤銷所做的修改,可輕鬆的返回以前的任何可行狀態。GitHub上的專案都儲存在倉庫中,後者包含與專案相關聯的一切:程式碼,專案參與者的資訊,問題和bug報告等

   下面講一下安裝Git(小編是windows系統,就只演示windows系統的安裝)

 第一步:下載(https://git-for-windows.github.io/),下載好如下圖

            

第二步:安裝過程,此處省略,要想安裝可以點選下面連結

第三步:配置

Git跟蹤誰修改了專案,哪怕參與專案開發的只有一個人。為此,Git需要知道你的使用者名稱和電子郵件。你必須提供使用者名稱,但可以使用虛構的電子郵件地址:

git config --global  user.name "Username"
git config --global  user.email "[email protected]
"

         因為Git是分散式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。你也許會擔心,如果有人故意冒充別人怎麼辦?這個不必擔心,首先我們相信大家都是善良無知的群眾,其次,真的有冒充的也是有辦法可查的。

        注意git config命令的--global引數,用了這個引數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名稱和Email地址。

第四步:建立專案

我們來建立一個要進行版本控制的專案(又稱版本庫)。在你的系統建立一個資料夾,並將其命名為learngit。

我建立learngit的程式如下:

mkdir  learngit   #建立檔案learngit
cd learngit #進入learngit檔案裡面
pwd #顯示learngit的存在目錄

我建立了一個hello.world.py程式,如下:

print("hello world")

第五步:忽略檔案

忽略副檔名為.pyc的檔案,它是根據.py檔案自動生成啊,我們無需讓Git去跟蹤。這些檔案儲存在目錄__pycache__中,未來讓git忽略它,我們建立一個名為.gitignore的特殊檔案,(這個檔案是以局點打頭,沒有副檔名,並且讓在其中新增下面一行內容)

_pycache_/

第六步:初始化倉庫

我們建立了一個檔案,並通過git init命令把這個目錄變成Git可以管理的倉庫:

$ git init
Initialized empty Git repository in C:/Users/learngit/.git/

         瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的檔案,不然改亂了,就把Git倉庫給破壞了。要是刪除這個東西,則丟棄專案的所有記錄。

       如果你沒有看到.git目錄,那是因為這個目錄預設是隱藏的,用ls -ah命令就可以看見。

      也不一定必須在空目錄下建立Git倉庫,選擇一個已經有東西的目錄也是可以的。不過,不建議你使用自己正在開發的公司專案來學習Git,否則造成的一切後果概不負責。

第七步:檢查狀態

在執行其他操作之前,先來看一下狀態:

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello_world.py

nothing added to commit but untracked files present (use "git add" to track)

    在Git中,分支是專案的一個版本,從這裡的輸出我們可以知道,我麼位於分支的,master

     我們每次檢視專案的狀態時候,輸出的都是我們位於分支master上,接下里的輸出表明,我們將進行初始專案的日叫,提交是專案在特定時間的快照。

  Git指出了專案中未被跟蹤的檔案,因為我們還沒有告訴他要跟蹤那些檔案,接下里我們被告知沒有任何東西新增到當前提交裡面,但我們可能需要將為跟蹤的檔案加入倉庫

第八步:將檔案加入到倉庫

$ git add .

。。。@▒▒▒▒▒ĵ▒▒▒ MINGW64 ~/learngit (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   hello_world.py

命令  git add .   將專案中未被跟蹤的檔案都加入到倉庫中,它不提交這些檔案,而只是讓git開始關注他們。現在我們檢查這個專案的狀態,發現Git找到了需要提交的檔案的一些修改,標籤 new file  表示這些檔案是新加入的。

第九步:執行提交

$ git commit -m "Started project"
[master (root-commit) 5d6ceca] Started project
 1 file changed, 1 insertion(+)
 create mode 100644 hello_world.py

     我們在執行   git commit -m "Started project"    的時候以拍攝專案的快照。標誌-m 讓Git接下里的訊息(“Started project")記錄到專案中的歷史記錄中,輸出表明我們在分支master 上,而且有一個檔案被修改了

     簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裡方便地找到改動記錄。

第十步:檢視提交歷史

$ git log
commit 5d6cecad80427924b94b14c6fd2bb82a4fa86840 (HEAD -> master)
Author: username <xxxxxxxxxx.example.com>
Date:   Sat Dec 9 20:16:17 2017 +0800

    Started project

我們每次提交的時候,Git都會生成一個包含40字元的獨一無二的引用ID,它記錄提交是誰執行的,提交的時間以及提交的指定訊息,並非在任何情況下你都需要所有的這些資訊,因此Git提供一個選項,讓我們能夠列印提交歷史條目的更簡單的版本。

$ git log --pretty=oneline
5d6cecad80427924b94b14c6fd2bb82a4fa86840 (HEAD -> master) Started project

標誌 --pretty=oneline   指定顯示一項最重要的資訊,提交的引用ID以及為提交記錄的訊息。

第十一步:第二次提交

為了顯示版本控制的強大,我們需要對專案進行修改,並提交所做的修改。為此,我們在檔案hello.world.py中再新增一行程式碼。

print("hello world")
print("hello git")

如果我們檢視專案的狀態,將發現Git注意到這個檔案的變化

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   hello_world.py

no changes added to commit (use "git add" and/or "git commit -a")

  這個之處了我們當前所在的分支為master,其中做出修改的檔案是hello_world.py,而且指出所做的修改還沒有提交。

    接下來我們提交所做操作,並在檢視操作。

     這一步,我們執行了提交,並且在執行命令git commit 的時候指定了標誌-am.標誌-a 讓Git 將倉庫中所有修改了的檔案都加入當前提交中,(如果我們兩次提交之間加入了新檔案,我們執行get add . 操作,將新檔案加入到倉庫中)標誌-m讓Git咱提交歷史中記錄一條訊息。

$ git commit -am "Extrended greeting."
[master b4ee15d] Extrended greeting.
 1 file changed, 2 insertions(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working tree clean
$ git log --pretty=oneline
b4ee15ddf5274f488db8c74c327065c6f331ec5e (HEAD -> master) Extrended greeting.
5d6cecad80427924b94b14c6fd2bb82a4fa86840 Started project

我們在檢視專案的狀態的時候,發現工作目錄也是乾淨的,最後我們發現提交歷史中包含兩個提交。

第十二步:撤銷修改

下面來看看如何放棄所做的修改,恢復到一個可行狀態,為此,我們首先在hello_world.py中新增一行程式碼

hello_world.py

print("hello world")
print("hello git")


print("the world is bad")

儲存並執行這個檔案

我們檢視狀態,發現Git注意到所做的修改

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   hello_world.py

no changes added to commit (use "git add" and/or "git commit -a")

Git注意到我們修改了hello_world.py,我麼可以提交所做的修改,但是我們不提交所做的修改,而要恢復到最後一個提交,為此我們不對hello_world.py執行任何操作————不刪除剛新增的程式碼行,也不使用文字編輯器的撤銷功能,而是在終端會話中執行如下命令:

$ git checkout .

命令  git checkout .  能夠讓我們恢復到以前的任何提交。命令git checkout . 放棄最後一次提交所做的所有操作,將專案恢復到最後一次提交的狀態。

$ git status
On branch master
nothing to commit, working tree clean

    就這個專案而言,我們恢復到前一個狀態微不足道,但是如果我們開發的是大型專案,其中數十個檔案都被修改了,那麼恢復到前一個狀態,將撤銷來自最後一次提交的對這個檔案所做的所有修改,這個功能很有用,比如:實現新功能,我們可以根據需要做任意數量的修改,如果這些修改都不行,可以撤銷他們,而不會對專案有任何傷害,你無需記住做了那些修改,因而不必手工撤銷所做的修改,Git會替我們完成所有的工作。

第十三步:檢查以前的提交

 我們可以檢查提交歷史中的任何一次提交,而不僅僅是最後一次,為此我們可以在命令git check末尾指定該提交的引用ID的前6個字元(而不是局點)。通過檢查出以前的提交,我們可以對其進行稽核麼然後返回到最後一次提交,或者放棄最近所做的工作,並選擇以前的提交。

$ git log --pretty=oneline
b4ee15ddf5274f488db8c74c327065c6f331ec5e (HEAD -> master) Extrended greeting.
5d6cecad80427924b94b14c6fd2bb82a4fa86840 Started project
$ git checkout 5d6cec
Note: checking out '5d6cec'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 5d6ceca... Started project

     檢查出以前的提交,我們將離開分支master,並進入Git所說的Git所說的分離頭指標(detached HEAD)狀態,HEAD表示專案的當前狀態,之所以說我們處於分離狀態是因為我們離開了一個命名分支(這裡是master)

      要回到分支master,可以檢查出它:

$ git checkout master
Previous HEAD position was 5d6ceca... Started project
Switched to branch 'master'

  這就會讓你回到分支master 。除非i使用Git的高階功能,否則在提交以前的專案後,最好不要對專案做任何修改,然而,如果參與專案開發的人只有我們自己,而我自己又想放棄所有提交,並恢復到以前的狀態,也可以將專案重置到以前的狀態,為此,可在處於分支master上的任何情況下,執行如下命令。

$ git status
On branch master
nothing to commit, working tree clean
$ git log --pretty=oneline
b4ee15ddf5274f488db8c74c327065c6f331ec5e (HEAD -> master) Extrended greeting.
5d6cecad80427924b94b14c6fd2bb82a4fa86840 Started project
$ git reset --hard 5d6cec
HEAD is now at 5d6ceca Started project
$ git status
On branch master
nothing to commit, working tree clean
$ git log --pretty=oneline
5d6cecad80427924b94b14c6fd2bb82a4fa86840 (HEAD -> master) Started project

首先,我們查看了狀態,確認我們在分支master上,檢視歷史提交時,我們看見了兩個提交。

然後,我們執行了命令    git reset --hard    ,並在其指定了要永久性的恢復到的提交的引用ID的前6個字元。

接下來,我們在次檢視狀態,大仙,我們在分支master上,並且沒有需要任何修改,

最後,我們再次檢視提交的歷史狀態時候,我們發現我們處於重新開始的提交中。

第十四步:刪除倉庫

  有時候,倉庫的歷史紀錄被我們搞亂了,而我們又不知道如何恢復,這時候我們首先應該考慮百度一下,看看自己的問題出在那裡,如果無法恢復,而且參與專案的人只有自己,可以繼續使用這些檔案,但需要將這些專案的歷史紀錄刪除——刪除.git 這不會影響任何檔案的當前狀態,而只會刪除檔案的所有提交,因此我們將無法檢查出專案的其他任何狀態。

   為此,可以開啟一個檔案瀏覽器,並將目錄.git 刪除,也可以通過命令完成這個任務。但是這樣做過我們需要建立一個新的倉庫,以重新對這些修改進行跟蹤。

  下面演示瞭如何在終端會話中完成這個過程。

$ git status
On branch master
nothing to commit, working tree clean
$ rm -rf .git
 rm -rf .git  表示刪除目錄.git,刪除後我們將繼續檢視狀態。
$ git status
fatal: Not a git repository (or any of the parent directories): .git

    這個意思是被告知我們,這不是一個倉庫,(git用來跟蹤倉庫的資訊都儲存愛資料夾.git中,因此刪除該資料夾也將會刪除整個倉庫)

接下來,我們用命令 git init 來建立一個新的倉庫,並檢視狀態

$ git init
Initialized empty Git repository in C:/Users//learngit/.git/
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello_world.py

nothing added to commit but untracked files present (use "git add" to track)

  從狀態中我們發現,又回到了初始狀態,等待第一次提交,我們下面將所有的檔案都新增到倉庫中,並執行第一次提交,最後檢查狀態,如下:

$ git add .
$ git commit -m "Starting over"
[master (root-commit) 81350ab] Starting over
 1 file changed, 1 insertion(+)
 create mode 100644 hello_world.py
$ git status
On branch master
nothing to commit, working tree clean

從檢查狀態我們發現,我們在分支master上,並且沒有任何未提交的修改。

  這就是版本控制的基本操作,希望能多多練習,這樣我們才能學會版本控制。