淺談使用git進行版本控制

     小編在學習可視化的時候,接觸到git,因此這裏寫一下關於GitHub的有關知識,寫這個的目的仍是鞏固本身的學習,一方面能夠提升本身,另外一方面回頭看一下,有什麼更深層次的東西還能夠再記錄。html

     首先說一下版本控制軟件,它可讓咱們可以拍攝處於可行狀態的項目的快照,修改項目(如實現新功能)後,若是項目不能正常運行,能夠恢復到前一個可行狀態。python

    經過使用版本控制,咱們能夠無憂無慮的改進項目,不用擔憂項目由於咱們犯錯而遭到破壞,對於大型項目來講,這顯得尤其重要,可是對於小項目來講,哪怕只包含一個文件的程序,也大有裨益。git

    GibHub的名字源於Git,Git是一個分佈式版本控制系統,讓程序員團隊可以協做開發項目,Git幫助你們管理爲項目所作的工做,避免一我的所作的修改影響其餘人所作的修改。你在項目中實現一個新功能的時候,Git將跟蹤你對每一個文件所作的修改。肯定代碼可行後,你將提交所作的修改,而Git將記錄項目最新的狀態,若是你犯了錯,想撤銷所作的修改,可輕鬆的返回之前的任何可行狀態。GitHub上的項目都存儲在倉庫中,後者包含與項目相關聯的一切:代碼,項目參與者的信息,問題和bug報告等程序員

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

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

            

第二步:安裝過程,此處省略,要想安裝能夠點擊下面連接

 【Git的安裝步驟博文http://www.cnblogs.com/wj-1314/p/7993819.htmlwindows

第三步:配置

Git跟蹤誰修改了項目,哪怕參與項目開發的只有一我的。爲此,Git須要知道你的用戶名和電子郵件。你必須提供用戶名,但可使用虛構的電子郵件地址:瀏覽器

git config --global  user.name "Username"
git config --global  user.email "Username@example.com"

 

         由於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上,而且沒有任何未提交的修改。

 

  這就是版本控制的基本操做,但願能多多練習,這樣咱們才能學會版本控制。

  要想好好了解GitHub的使用,請參考小編使用GitHub的點點滴滴的博客:http://www.javashuo.com/article/p-fjbqdcoi-gq.html

 

  • 推薦一個版本控制工具

  • CODING:研發管理系統:https://coding.net/ ,以 Git 代碼託管與發佈爲核心,涵蓋代碼提交、代碼審查、Bug 追蹤等開發場景,經過任務、文件、Wiki 等工具,獲取需求管理、任務追蹤、知識庫管理等一系列寫做功能。基於 Git 的版本控制保障了公司代碼資產安全,實現自動構建,減小人工干預,提高業務系統質量。

  • 系統基本架構:

 

 

  • 企業級項目工做一體化:

 

相關文章
相關標籤/搜索