git進(jìn)行版本控制心得詳談
小編在學(xué)習(xí)可視化的時(shí)候,接觸到git,所以這里寫一下關(guān)于GitHub的有關(guān)知識(shí),寫這個(gè)的目的還是鞏固自己的學(xué)習(xí),一方面可以提高自己,另一方面回頭看一下,有什么更深層次的東西還可以再記錄。
首先說(shuō)一下版本控制軟件,它可以讓我們能夠拍攝處于可行狀態(tài)的項(xiàng)目的快照,修改項(xiàng)目(如實(shí)現(xiàn)新功能)后,如果項(xiàng)目不能正常運(yùn)行,可以恢復(fù)到前一個(gè)可行狀態(tài)。
通過(guò)使用版本控制,我們可以無(wú)憂無(wú)慮的改進(jìn)項(xiàng)目,不用擔(dān)心項(xiàng)目因?yàn)槲覀兎稿e(cuò)而遭到破壞,對(duì)于大型項(xiàng)目來(lái)說(shuō),這顯得尤為重要,但是對(duì)于小項(xiàng)目來(lái)說(shuō),哪怕只包含一個(gè)文件的程序,也大有裨益。
GibHub的名字源于Git,Git是一個(gè)分布式版本控制系統(tǒng),讓程序員團(tuán)隊(duì)能夠協(xié)作開(kāi)發(fā)項(xiàng)目,Git幫助大家管理為項(xiàng)目所做的工作,避免一個(gè)人所做的修改影響其他人所做的修改。你在項(xiàng)目中實(shí)現(xiàn)一個(gè)新功能的時(shí)候,Git將跟蹤你對(duì)每個(gè)文件所做的修改。確定代碼可行后,你將提交所做的修改,而Git將記錄項(xiàng)目最新的狀態(tài),如果你犯了錯(cuò),想撤銷所做的修改,可輕松的返回以前的任何可行狀態(tài)。GitHub上的項(xiàng)目都存儲(chǔ)在倉(cāng)庫(kù)中,后者包含與項(xiàng)目相關(guān)聯(lián)的一切:代碼,項(xiàng)目參與者的信息,問(wèn)題和bug報(bào)告等
下面講一下安裝Git(小編是windows系統(tǒng),就只演示windows系統(tǒng)的安裝)
第一步:下載(https://git-for-windows.github.io/),下載好如下圖
第二步:安裝過(guò)程,此處省略,要想安裝可以點(diǎn)擊下面鏈接
第三步:配置
Git跟蹤誰(shuí)修改了項(xiàng)目,哪怕參與項(xiàng)目開(kāi)發(fā)的只有一個(gè)人。為此,Git需要知道你的用戶名和電子郵件。你必須提供用戶名,但可以使用虛構(gòu)的電子郵件地址:
git config --global user.name "Username" git config --global user.email "Username@example.com"
因?yàn)镚it是分布式版本控制系統(tǒng),所以,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和Email地址。你也許會(huì)擔(dān)心,如果有人故意冒充別人怎么辦?這個(gè)不必?fù)?dān)心,首先我們相信大家都是善良無(wú)知的群眾,其次,真的有冒充的也是有辦法可查的。
注意git config
命令的--global
參數(shù),用了這個(gè)參數(shù),表示你這臺(tái)機(jī)器上所有的Git倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉(cāng)庫(kù)指定不同的用戶名和Email地址。
第四步:創(chuàng)建項(xiàng)目
我們來(lái)創(chuàng)建一個(gè)要進(jìn)行版本控制的項(xiàng)目(又稱版本庫(kù))。在你的系統(tǒng)創(chuàng)建一個(gè)文件夾,并將其命名為learngit。
我創(chuàng)建learngit的程序如下:
mkdir learngit #創(chuàng)建文件learngit
cd learngit #進(jìn)入learngit文件里面
pwd #顯示learngit的存在目錄
我創(chuàng)建了一個(gè)hello.world.py程序,如下:
print("hello world")
第五步:忽略文件
忽略擴(kuò)展名為.pyc的文件,它是根據(jù).py文件自動(dòng)生成啊,我們無(wú)需讓Git去跟蹤。這些文件存儲(chǔ)在目錄__pycache__中,未來(lái)讓git忽略它,我們創(chuàng)建一個(gè)名為.gitignore的特殊文件,(這個(gè)文件是以局點(diǎn)打頭,沒(méi)有擴(kuò)展名,并且讓在其中添加下面一行內(nèi)容)
_pycache_/
第六步:初始化倉(cāng)庫(kù)
我們創(chuàng)建了一個(gè)文件,并通過(guò)git init
命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù):
$ git init Initialized empty Git repository in C:/Users/learngit/.git/
瞬間Git就把倉(cāng)庫(kù)建好了,而且告訴你是一個(gè)空的倉(cāng)庫(kù)(empty Git repository),細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git
的目錄,這個(gè)目錄是Git來(lái)跟蹤管理版本庫(kù)的,沒(méi)事千萬(wàn)不要手動(dòng)修改這個(gè)目錄里面的文件,不然改亂了,就把Git倉(cāng)庫(kù)給破壞了。要是刪除這個(gè)東西,則丟棄項(xiàng)目的所有記錄。
如果你沒(méi)有看到.git
目錄,那是因?yàn)檫@個(gè)目錄默認(rèn)是隱藏的,用ls -ah
命令就可以看見(jiàn)。
也不一定必須在空目錄下創(chuàng)建Git倉(cāng)庫(kù),選擇一個(gè)已經(jīng)有東西的目錄也是可以的。不過(guò),不建議你使用自己正在開(kāi)發(fā)的公司項(xiàng)目來(lái)學(xué)習(xí)Git,否則造成的一切后果概不負(fù)責(zé)。
第七步:檢查狀態(tài)
在執(zhí)行其他操作之前,先來(lái)看一下?tīng)顟B(tài):
$ 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中,分支是項(xiàng)目的一個(gè)版本,從這里的輸出我們可以知道,我么位于分支的,master
我們每次查看項(xiàng)目的狀態(tài)時(shí)候,輸出的都是我們位于分支master上,接下里的輸出表明,我們將進(jìn)行初始項(xiàng)目的日叫,提交是項(xiàng)目在特定時(shí)間的快照。
Git指出了項(xiàng)目中未被跟蹤的文件,因?yàn)槲覀冞€沒(méi)有告訴他要跟蹤那些文件,接下里我們被告知沒(méi)有任何東西添加到當(dāng)前提交里面,但我們可能需要將為跟蹤的文件加入倉(cāng)庫(kù)
第八步:將文件加入到倉(cāng)庫(kù)
$ 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 . 將項(xiàng)目中未被跟蹤的文件都加入到倉(cāng)庫(kù)中,它不提交這些文件,而只是讓git開(kāi)始關(guān)注他們。現(xiàn)在我們檢查這個(gè)項(xiàng)目的狀態(tài),發(fā)現(xiàn)Git找到了需要提交的文件的一些修改,標(biāo)簽 new file 表示這些文件是新加入的。
第九步:執(zhí)行提交
$ git commit -m "Started project" [master (root-commit) 5d6ceca] Started project 1 file changed, 1 insertion(+) create mode 100644 hello_world.py
我們?cè)趫?zhí)行 git commit -m "Started project" 的時(shí)候以拍攝項(xiàng)目的快照。標(biāo)志-m 讓Git接下里的消息(“Started project")記錄到項(xiàng)目中的歷史記錄中,輸出表明我們?cè)诜种aster 上,而且有一個(gè)文件被修改了
簡(jiǎn)單解釋一下git commit
命令,-m
后面輸入的是本次提交的說(shuō)明,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。
第十步:查看提交歷史
$ git log commit 5d6cecad80427924b94b14c6fd2bb82a4fa86840 (HEAD -> master) Author: wangjian <1171737614.qq.com> Date: Sat Dec 9 20:16:17 2017 +0800 Started project
我們每次提交的時(shí)候,Git都會(huì)生成一個(gè)包含40字符的獨(dú)一無(wú)二的引用ID,它記錄提交是誰(shuí)執(zhí)行的,提交的時(shí)間以及提交的指定消息,并非在任何情況下你都需要所有的這些信息,因此Git提供一個(gè)選項(xiàng),讓我們能夠打印提交歷史條目的更簡(jiǎn)單的版本。
$ git log --pretty=oneline 5d6cecad80427924b94b14c6fd2bb82a4fa86840 (HEAD -> master) Started project
標(biāo)志 --pretty=oneline 指定顯示一項(xiàng)最重要的信息,提交的引用ID以及為提交記錄的消息。
第十一步:第二次提交
為了顯示版本控制的強(qiáng)大,我們需要對(duì)項(xiàng)目進(jìn)行修改,并提交所做的修改。為此,我們?cè)谖募ello.world.py中再添加一行代碼。
print("hello world") print("hello git")
如果我們查看項(xiàng)目的狀態(tài),將發(fā)現(xiàn)Git注意到這個(gè)文件的變化
$ 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")
這個(gè)之處了我們當(dāng)前所在的分支為master,其中做出修改的文件是hello_world.py,而且指出所做的修改還沒(méi)有提交。
接下來(lái)我們提交所做操作,并在查看操作。
這一步,我們執(zhí)行了提交,并且在執(zhí)行命令git commit 的時(shí)候指定了標(biāo)志-am.標(biāo)志-a 讓Git 將倉(cāng)庫(kù)中所有修改了的文件都加入當(dāng)前提交中,(如果我們兩次提交之間加入了新文件,我們執(zhí)行g(shù)et add . 操作,將新文件加入到倉(cāng)庫(kù)中)標(biāo)志-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
我們?cè)诓榭错?xiàng)目的狀態(tài)的時(shí)候,發(fā)現(xiàn)工作目錄也是干凈的,最后我們發(fā)現(xiàn)提交歷史中包含兩個(gè)提交。
第十二步:撤銷修改
下面來(lái)看看如何放棄所做的修改,恢復(fù)到一個(gè)可行狀態(tài),為此,我們首先在hello_world.py中添加一行代碼
hello_world.py
print("hello world") print("hello git") print("the world is bad")
保存并運(yùn)行這個(gè)文件
我們查看狀態(tài),發(fā)現(xiàn)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,我么可以提交所做的修改,但是我們不提交所做的修改,而要恢復(fù)到最后一個(gè)提交,為此我們不對(duì)hello_world.py執(zhí)行任何操作————不刪除剛添加的代碼行,也不使用文本編輯器的撤銷功能,而是在終端會(huì)話中執(zhí)行如下命令:
$ git checkout .
命令 git checkout . 能夠讓我們恢復(fù)到以前的任何提交。命令git checkout . 放棄最后一次提交所做的所有操作,將項(xiàng)目恢復(fù)到最后一次提交的狀態(tài)。
$ git status On branch master nothing to commit, working tree clean
就這個(gè)項(xiàng)目而言,我們恢復(fù)到前一個(gè)狀態(tài)微不足道,但是如果我們開(kāi)發(fā)的是大型項(xiàng)目,其中數(shù)十個(gè)文件都被修改了,那么恢復(fù)到前一個(gè)狀態(tài),將撤銷來(lái)自最后一次提交的對(duì)這個(gè)文件所做的所有修改,這個(gè)功能很有用,比如:實(shí)現(xiàn)新功能,我們可以根據(jù)需要做任意數(shù)量的修改,如果這些修改都不行,可以撤銷他們,而不會(huì)對(duì)項(xiàng)目有任何傷害,你無(wú)需記住做了那些修改,因而不必手工撤銷所做的修改,Git會(huì)替我們完成所有的工作。
第十三步:檢查以前的提交
我們可以檢查提交歷史中的任何一次提交,而不僅僅是最后一次,為此我們可以在命令git check末尾指定該提交的引用ID的前6個(gè)字符(而不是局點(diǎn))。通過(guò)檢查出以前的提交,我們可以對(duì)其進(jìn)行審核么然后返回到最后一次提交,或者放棄最近所做的工作,并選擇以前的提交。
$ 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
檢查出以前的提交,我們將離開(kāi)分支master,并進(jìn)入Git所說(shuō)的Git所說(shuō)的分離頭指針(detached HEAD)狀態(tài),HEAD表示項(xiàng)目的當(dāng)前狀態(tài),之所以說(shuō)我們處于分離狀態(tài)是因?yàn)槲覀冸x開(kāi)了一個(gè)命名分支(這里是master)
要回到分支master,可以檢查出它:
$ git checkout master Previous HEAD position was 5d6ceca... Started project Switched to branch 'master'
這就會(huì)讓你回到分支master 。除非i使用Git的高級(jí)功能,否則在提交以前的項(xiàng)目后,最好不要對(duì)項(xiàng)目做任何修改,然而,如果參與項(xiàng)目開(kāi)發(fā)的人只有我們自己,而我自己又想放棄所有提交,并恢復(fù)到以前的狀態(tài),也可以將項(xiàng)目重置到以前的狀態(tài),為此,可在處于分支master上的任何情況下,執(zhí)行如下命令。
$ 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
首先,我們查看了狀態(tài),確認(rèn)我們?cè)诜种aster上,查看歷史提交時(shí),我們看見(jiàn)了兩個(gè)提交。
然后,我們執(zhí)行了命令 git reset --hard ,并在其指定了要永久性的恢復(fù)到的提交的引用ID的前6個(gè)字符。
接下來(lái),我們?cè)诖尾榭礌顟B(tài),大仙,我們?cè)诜种aster上,并且沒(méi)有需要任何修改,
最后,我們?cè)俅尾榭刺峤坏臍v史狀態(tài)時(shí)候,我們發(fā)現(xiàn)我們處于重新開(kāi)始的提交中。
第十四步:刪除倉(cāng)庫(kù)
有時(shí)候,倉(cāng)庫(kù)的歷史紀(jì)錄被我們搞亂了,而我們又不知道如何恢復(fù),這時(shí)候我們首先應(yīng)該考慮百度一下,看看自己的問(wèn)題出在那里,如果無(wú)法恢復(fù),而且參與項(xiàng)目的人只有自己,可以繼續(xù)使用這些文件,但需要將這些項(xiàng)目的歷史紀(jì)錄刪除——?jiǎng)h除.git 這不會(huì)影響任何文件的當(dāng)前狀態(tài),而只會(huì)刪除文件的所有提交,因此我們將無(wú)法檢查出項(xiàng)目的其他任何狀態(tài)。
為此,可以打開(kāi)一個(gè)文件瀏覽器,并將目錄.git 刪除,也可以通過(guò)命令完成這個(gè)任務(wù)。但是這樣做過(guò)我們需要?jiǎng)?chuàng)建一個(gè)新的倉(cāng)庫(kù),以重新對(duì)這些修改進(jìn)行跟蹤。
下面演示了如何在終端會(huì)話中完成這個(gè)過(guò)程。
$ git status On branch master nothing to commit, working tree clean
$ rm -rf .git
rm -rf .git 表示刪除目錄.git,刪除后我們將繼續(xù)查看狀態(tài)。
$ git status fatal: Not a git repository (or any of the parent directories): .git
這個(gè)意思是被告知我們,這不是一個(gè)倉(cāng)庫(kù),(git用來(lái)跟蹤倉(cāng)庫(kù)的信息都存儲(chǔ)愛(ài)文件夾.git中,因此刪除該文件夾也將會(huì)刪除整個(gè)倉(cāng)庫(kù))
接下來(lái),我們用命令 git init 來(lái)創(chuàng)建一個(gè)新的倉(cāng)庫(kù),并查看狀態(tài)
$ 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)
從狀態(tài)中我們發(fā)現(xiàn),又回到了初始狀態(tài),等待第一次提交,我們下面將所有的文件都添加到倉(cāng)庫(kù)中,并執(zhí)行第一次提交,最后檢查狀態(tài),如下:
$ 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
從檢查狀態(tài)我們發(fā)現(xiàn),我們?cè)诜种aster上,并且沒(méi)有任何未提交的修改。
這就是版本控制的基本操作,希望能多多聯(lián)系,這樣我們才能學(xué)會(huì)版本控制。
相關(guān)文章
Python使用matplotlib的pie函數(shù)繪制餅狀圖功能示例
這篇文章主要介紹了Python使用matplotlib的pie函數(shù)繪制餅狀圖功能,結(jié)合實(shí)例形式分析了Python使用matplotlib的pie函數(shù)進(jìn)行餅狀圖繪制的具體操作技巧,注釋中對(duì)pie函數(shù)的用法進(jìn)行了詳細(xì)的說(shuō)明,便于理解,需要的朋友可以參考下2018-01-01Python requests timeout的設(shè)置
這篇文章主要介紹了Python requests timeout的設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04python 實(shí)現(xiàn)語(yǔ)音聊天機(jī)器人的示例代碼
這篇文章主要介紹了python 實(shí)現(xiàn)語(yǔ)音聊天機(jī)器人的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python+opencv實(shí)現(xiàn)車道線檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)車道線檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02pytorch LayerNorm參數(shù)的用法及計(jì)算過(guò)程
這篇文章主要介紹了pytorch LayerNorm參數(shù)的用法及計(jì)算過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05