




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、【Git【Git【Git【Git【Git【Git【Git【Git【Git【Git【Git【Git第 1 課】第 2 課】第 3 課】第 4 課】第 5 課】第 6 課】第 7 課】第 8 課】第 9 課】什么是 Git?1GitHub 是什么?3安裝 Git6創(chuàng)建 Git 倉庫7Git 工作流8文件狀態(tài)10忽略文件13移除文件15撤銷修改16第 10 課】第 11 課】第 12 課】版本回退18遠(yuǎn)程倉庫20抓取/推送數(shù)據(jù)22 【Git 第 1 課】 什么是 Git? 今天起,我會(huì)在微信推送文章里穿插一個(gè)新的系列:Git。和之前 Python 入門教程不同,這個(gè)系列需要有一點(diǎn)編程的經(jīng)驗(yàn)。倒不是因
2、為它很難,只是如果沒有開發(fā)過稍大一點(diǎn)的項(xiàng)目,或者沒有和別人合作開發(fā)過,你可能無法理解 Git 的用處, 對(duì)其中涉及的內(nèi)容也會(huì)感到不知所云。 這個(gè)系列不會(huì)天天更新,平時(shí)仍然會(huì)有一些基礎(chǔ)的編程知識(shí),以及編程學(xué)習(xí)相關(guān)的文章推送。大家各取所需。剛剛?cè)腴T的朋友也不用著急,按部就班地保持自己的節(jié)奏就好,學(xué)習(xí)是件長久的事情,欲速則不達(dá)。 學(xué)習(xí) Git 跟你使用的語言無關(guān),只要你參與到程序開發(fā)中,就很有可能接觸到Git,或者可以用 Git 幫助你進(jìn)行開發(fā)。因此在這一點(diǎn)上,你不用再糾結(jié)于是該 選擇 C+、Java、Python當(dāng)然,Git 也有同類產(chǎn)品可供選擇,但對(duì)于目前的你, 有足夠多的理由去學(xué)習(xí) Git,哪
3、怕以后你不再使用它。 說了這么多,還沒有進(jìn)入今天的正題:Git 到底是個(gè)什么東西? Git 是一個(gè)版本控制系統(tǒng)(Version Control System)。 那什么又是“版本控制系統(tǒng)”呢? 想象一下這樣的場景:你再寫一個(gè)程序,這個(gè)程序?qū)δ銇碚f有一點(diǎn)“大”,不是一個(gè)晚上就能解決的。比如我們之前的打飛機(jī)小游戲。于是編寫的過程中,你需要保 存代碼,下次接著寫。另外,當(dāng)你花了兩個(gè)晚上,完成了最基本的功能后,第三天晚上,你又想嘗試給你的游戲增加點(diǎn)新功能,比如你的飛機(jī)可以扔滅屏幕上 的所有敵人。那么你就得在之前的代碼上做改動(dòng)。 這時(shí)候,不幸的事情發(fā)生了! 消你發(fā)現(xiàn)你改動(dòng)了一些代碼之后,程序無法正常運(yùn)行
4、了。你想算了,還是恢復(fù)到之前那樣吧。但是代碼被改動(dòng)的地方比較瑣碎,你發(fā)現(xiàn)把印象中所有的改動(dòng)都改了回去,程序一樣無法運(yùn)行。于是你就陷入了抓狂。 即使你不是一個(gè)程序員,你也可能遭遇過類似的“悲劇”,比如誤刪了 word 文檔中的一段話后手賤地點(diǎn)了保存,之后又想把那段找回來的時(shí)候才追悔莫及。人世間的事情大多如此吧 于是,吃過苦頭的人會(huì)給自己留條后路,再保存文件的時(shí)候選擇“另存為 Save As”而不是直接在原文件上保存。于是你的文件夾中就出現(xiàn)了諸如: report131106.doc myslide-updated.ppt loveletter_old001.txt 之類的文件。 其實(shí)這就是一種最簡
5、陋的版本控制系統(tǒng)。 本人當(dāng)年上學(xué)的時(shí)候,第一次接觸到版本控制這個(gè)概念時(shí),就是用這種方式來解決的。我們從團(tuán)隊(duì)中挑選出一人(好吧,就是我)專門負(fù)責(zé)維護(hù)一臺(tái)電腦上的一個(gè)文件夾。文件夾里分門別類地保存著項(xiàng)目的文檔和代碼的不同版本。 現(xiàn)在回想起來,這是怎樣一種勤勞而又愚昧的做法。你需要去小心每個(gè)版本不要放錯(cuò)了位置,每天開發(fā)完要把代碼發(fā)給專人整理,甚至在宿舍斷網(wǎng)的時(shí)候要用 u 盤去 copy 最新的代碼,再把最新的代碼交給需要進(jìn)行修改的人 但其實(shí)早就不必如此。版本控制系統(tǒng)就是把你從這片苦海中拯救出來的工具。 通過版本控制系統(tǒng),可以有效地追蹤文件的變化。當(dāng)代碼出錯(cuò)的時(shí)候,可以很容易地恢復(fù)到之前的狀態(tài)。對(duì)于多
6、人協(xié)作開發(fā)的項(xiàng)目來說,版本控制系統(tǒng)更是必不可 少。它保證每個(gè)人都能夠獲取最近更新的代碼,每個(gè)人開發(fā)的代碼可以更方便地增加到項(xiàng)目中,避免不同代碼之前產(chǎn)生的沖突,減小溝通成本。 其實(shí)它做的事情本質(zhì)還是在某個(gè)地方,記錄下所有文件的所有版本,只不過比在電腦上建很多文件夾的方法更合理、更便捷、更穩(wěn)定。讓你可以把精力集中在開發(fā)代碼本身,而不用關(guān)注其他瑣碎的問題。 而 Git 就是時(shí)下最流行的版本控制系統(tǒng)。 關(guān)于 Git 有哪些具體的功能和特性,在以后的課程中會(huì)具體分析。另外,說 Git就不能不說到 GitHub。它又是什么?請(qǐng)看下節(jié)課。 【Git 第 2 課】 GitHub 是什么? 說 Git 就不能不
7、說 GitHub。 以下摘錄一段網(wǎng)上的文章片段,介紹一下 GitHub。 來自陽志平的網(wǎng)志如何高效利用 GitHub Q1:GitHub 是什么 A1:一家公司 位于舊金山,由 Chris Wanstrath, PJ Hyett 與 Tom Preston-Werner 三位開發(fā)者在 2008 年 4 月創(chuàng)辦。迄今擁有 59 名全職員工,主要提供基于 git 的版本托管服務(wù)。 在此之前,它是由 Tom 與 Chris 在本地程序員聚會(huì)中,開始的一個(gè)用于托管 git的項(xiàng)目。正如每個(gè)偉大的都開始于一場冒險(xiǎn),Tom 在這篇文章我如何辭掉微軟 30 萬年薪邀約,創(chuàng)辦 GitHub 中談到: 當(dāng)我老去,
8、回顧一生,我想說,“哇,那是一場冒險(xiǎn)“;而不是,“哇,我真的很安穩(wěn)。“ 另一位創(chuàng)始人 Chris 也詳細(xì)描述了 GitHub 初創(chuàng)的前因后果,他說道: Do whatever you want. 于是,在 2008 年 4 月 10 號(hào)這一天,GitHub 正式成立。 目前看來,GitHub 這場冒險(xiǎn)已經(jīng)勝出。根據(jù)來自 百科關(guān)于 GitHub 的描述,我們可以形象地看出 GitHub 的增長速度: 今天,GitHub 已是: 一個(gè)擁有 143 萬開發(fā)者的社區(qū)。其中不乏 Linux 發(fā)明者 Torvalds 這樣的頂級(jí),以及 Rails 創(chuàng)始人 DHH 這樣的年輕極客。 這個(gè)星球上最流行的開源托
9、管服務(wù)。目前已托管 431 萬 git 項(xiàng)目,不僅越來越多知名開源項(xiàng)目遷入 GitHub,比如 Ruby on Rails、jQuery、Ruby、Erlang/OTP;近三年流行的開源庫往往在 GitHub 首發(fā),例如:BootStrap、 Node.js、CoffeScript 等。 alexa 全球排名 414 的網(wǎng)站。 簡單來說,GitHub 就是一個(gè)基于 Git 的代碼托管網(wǎng)站。由于其上聚集了大量的優(yōu)秀代碼和優(yōu)秀程序員,使得它成為了一個(gè)極具價(jià)值的開發(fā)者社區(qū)。 在 GitHub 上,你可以免費(fèi)托管你的代碼,進(jìn)行版本控制,同別人協(xié)同開發(fā)。代碼必須開源,付費(fèi)用戶可以選擇私有項(xiàng)目。 除此之外
10、,你還可以通過 GitHub 來尋找牛人、參與開源項(xiàng)目,進(jìn)而提升你的編程能力。你可以在上面建立你的個(gè)人博客。你在 GitHub 上的參與度和代碼貢獻(xiàn), 會(huì)在求職的時(shí)候?yàn)槟慵臃植簧佟?在后續(xù)關(guān)于 Git 的課程中,我們將會(huì)用到 GitHub 作為代碼托管服務(wù)器。 另外,國內(nèi)也有一些 Git 托管網(wǎng)站,比如 CSDN code,GitOSC,gitcafe 等,可以去嘗試一下,尤其是如果需要私有項(xiàng)目的話。 【Git 第 3 課】 安裝 Git 要用 Git,首先肯定要安裝它。簡要說一下 Win,Mac 和 Linux 三種平臺(tái)的安裝方法。 Windows Git 的官網(wǎng)(http:/git-scm
11、.com)提供了 Windows 下 Git 客戶端的安裝包。也可以去 msysGit 項(xiàng)目的頁面上下載: / 安裝好之后,你會(huì)得到一個(gè) Git 的命令行工具 Git-Bash 和一個(gè)圖形界面工具Git-GUI。在后面的教程里,會(huì)主要以命令行下 Git 的使用為主。掌握基本的命令之后,使用圖形界面也就沒什么問題了。 另外,GitHub 提供了一個(gè)叫做 GitHub For Windows 的工具。這個(gè)工具也能實(shí)現(xiàn)Git 的功能,并且提供了一個(gè)更便于管理 GitHub 上項(xiàng)目的圖形化工具。也可以選擇安裝這個(gè),地址是: http:/windows.g
12、/ 不過它提供的是一個(gè)在線安裝包,網(wǎng)絡(luò)不好的時(shí)候就會(huì)安裝失敗。我自己安裝了很多次才成功。 Mac OS Git 官網(wǎng)同樣提供了 Mac 版的安裝包,或者去這里下載: /p/git-osx-installer Mac 上還有其他方法,對(duì)于已經(jīng)在 Mac 上安裝過 MacPorts 的用戶,可以通過如下命令安裝 Git: sudo port install git-core +svn +doc +bash_completion +gitweb Linux Git 最初是 Linux 的作者 Linus Torvalds 為了管理 Linu
13、x 內(nèi)核開發(fā)而創(chuàng)造出來的。所以相對(duì)來說,Git 更適用于 Linux/Unix 平臺(tái)。 各類 Linux 系統(tǒng)的包管理工具中都提供 Git 的安裝。如: Debian/Ubuntu $ apt-get install git Fedora $ yum install git Git 的官網(wǎng)上提供了Pro Git一書,并且有中文翻譯版本,這是一本關(guān)于 Git 由淺入深的詳細(xì)教程,大家可以結(jié)合此書來學(xué)習(xí) Git。關(guān)于上述安裝的內(nèi)容,它里面也有說明。 當(dāng)你安裝好合適的 Git 客戶端之后,可以通過 Git 命令行,到你電腦上的某一個(gè)文件夾中(關(guān)于命令行下的簡單操作,可以查看第 20 課)。執(zhí)行: g
14、it clone /crossin/CrossinClass.git 然后就可以在文件夾中看到我建好的項(xiàng)目,里面暫時(shí)還沒什么內(nèi)容,只有一本咱們教室的朋友幫忙整理的一個(gè) python 前 60 課合集的 word 文檔。以后我會(huì)在里面 陸續(xù)添加內(nèi)容,大家也可以通過學(xué)習(xí) git 的過程來同我一起添加和修改。 【Git 第 4 課】 創(chuàng)建 Git 倉庫 上次安裝了 Git 之后,我讓大家用命令: 1. git clone /crossin/CrossinClass.git 把我在 GitHub 上建立的項(xiàng)目“復(fù)制”到本地。這就是創(chuàng)建
15、 Git 倉庫的一種方法:從現(xiàn)有的倉庫“克隆”。 Git 中所謂的“倉庫”(repository),就是一個(gè)受 Git 版本控制的目錄。倉庫中文件的改動(dòng)都將被 Git 所記錄。 通過 got clone 命令,可以從一個(gè)已有的 Git 倉庫克隆出一個(gè)本地的鏡像倉庫。如果想指定創(chuàng)建的本地文件夾名稱,可以在倉庫的 url 地址后面加一個(gè)參數(shù)。如: 1. git clone /crossin/CrossinClass.git MyClass 這里,我們?cè)跀?shù)據(jù)傳輸是用了 https 協(xié)議。除此之外,Git 還支持 git:/ 或userserver:/path.git
16、 的方式進(jìn)行傳輸,暫時(shí)先不細(xì)說。 除了克隆已有倉庫,還有一種方法就是創(chuàng)建一個(gè)新的 Git 倉庫。在想要進(jìn)行版本控制的目錄下執(zhí)行: 1. git init 新的倉庫就被初始化了。這時(shí)目錄下會(huì)多出一個(gè) .git 的目錄,它里面放了 Git 所需要的一些文件,我們也先不去管它。 這時(shí)候,你已經(jīng)有了一個(gè)新的 Git 倉庫。往里面放一個(gè) readme.txt,隨便寫點(diǎn)內(nèi)容。然后在目錄下執(zhí)行: 1.2.3.git add readme.txt git commit -m my first commit OK。雖然你可能還很莫名,但你確實(shí)已經(jīng)開始用 Git 管理這個(gè) readme.txt 文件了。至于這兩行
17、命令的含義和這個(gè)文件的狀態(tài),請(qǐng)聽下回分解。 【Git 第 5 課】 Git 工作流 上次課中,我們創(chuàng)建了自己的 Git 倉庫,并向其中添加了一個(gè) readme.txt 的文件。在繼續(xù)深入介紹 Git 的使用方法之前,有必要先來講一講 Git 的工作流。在你自建的 Git 本地倉庫中,有三個(gè)區(qū)域:本地目錄、暫存區(qū)、HEAD。要搞清Git 的工作流就要理解這三個(gè)區(qū)域的作用。工作目錄,就是受 Git 控制的文件夾,所有被跟蹤記錄的文件都包括在其中;暫存區(qū)(index 或者 stage),類似一個(gè)緩存區(qū)域,臨時(shí)保存你做的改動(dòng);HEAD,指向最近一次提交后的結(jié)果。用一個(gè)比喻來描述一下這三個(gè)區(qū)域:假設(shè)你是
18、一個(gè)學(xué)生,你需要寫一門課的作業(yè), 作業(yè)有好幾張?jiān)嚲砗蛶妆揪毩?xí)題,寫好之后把作業(yè)交給老師。你把所有作業(yè)放在桌上開始寫,這里就是你的“工作目錄”。當(dāng)你寫完一張?jiān)嚲恚?把它放進(jìn)你的書包里,它就進(jìn)入了“暫存區(qū)”。等你把作業(yè)都寫完了,放在書包里帶到學(xué)校,全部交給了這門課的老師,他就是 HEAD 所指向的位置。而對(duì)于項(xiàng)目中的文件來說,分為未跟蹤(untracked)和已跟蹤(tracked)兩種狀態(tài)。未跟蹤的文件的改動(dòng)不受到 Git 的版本控制。而已跟蹤的文件,即被納入版本控制的文件,又分為未修改(unmodified)、已修改(modified)、已暫存(staged)三種狀態(tài)。當(dāng)在工作目錄中新加入一個(gè)
19、文件時(shí),它處于未跟蹤狀態(tài),這表示其沒有納入 Git的版本控制。通過 git add 命令可以將其加入跟蹤,并同時(shí)放入暫存區(qū)。一個(gè)已經(jīng)被跟蹤的文件,如果沒有做過新的修改,就是未修改狀態(tài)。一旦對(duì)其做了改動(dòng),就變成了已修改狀態(tài)。通過 git add 命令可以將已修改的文件放入暫存區(qū)。初次克隆某個(gè)倉庫時(shí),工作目錄中所有文件都是已跟蹤且未修改的狀態(tài)。git commit 命令會(huì)將暫存區(qū)中的文件提交至 HEAD 所指向的分支。關(guān)于分支的概念,我們后面再說。當(dāng)被 commit 之后,暫存區(qū)的文件將回到未修改狀態(tài)。另外,也可以通過 git rm 將已經(jīng)跟蹤的文件從 Git 中移除。再來套用前面的那個(gè)例子:作業(yè)
20、里要交的試卷和練習(xí)題都處于已跟蹤狀態(tài),那些不用交的就是未跟蹤。當(dāng)你寫了某張?jiān)嚲碇?,它就變成了已修改。寫完了把它放進(jìn) 書包,它就是已暫存。等你把它提交給老師之后,假設(shè)老師瞬間就把它批改完并發(fā)還給你,那這時(shí)對(duì)你來說,它又重新成為了未修改。git status 命令是用來查看倉庫中文件的狀態(tài)。在命令行中,你的工作目錄下運(yùn)行此命令,可以看到輸出文件狀態(tài)信息。試試執(zhí)行這條命令,然后修改 readme.txt 后再試試,看看有什么不同。下節(jié)課我們結(jié)合它來具體分析狀態(tài)的變化?!綠it 第 6 課】 文件狀態(tài) 在第 4 課的最后,我們用以下兩條命令: git add readme.txt git commi
21、t -m my first commit 向我們新建的 git 倉庫中添加了對(duì) readme.txt 文件的版本控制?,F(xiàn)在,我們要試圖對(duì)倉庫中的文件進(jìn)行一些改動(dòng),同時(shí)觀察它們的狀態(tài)變化,以此實(shí)踐上節(jié)課中說的 git 工作流。 首先,在命令行的本地倉庫工作目錄下執(zhí)行命令: git status 你會(huì)看到: # On branch master nothing to commit (working directory clean) 很好,你的目錄是干凈的,沒什么可提交的。說明所有的文件都是未修改的狀態(tài), 沒有未跟蹤的文件,也沒有修改過未提交的文件。輸出的提示還告訴你,目前在branch maste
22、r 上。關(guān)于 branch 的概念我們將在后面的課程中介紹。 接下來,隨便用一個(gè)文本編輯器去修改一下 readme.txt 里的文字。另外,再向目錄中新建一個(gè) test.py 文件(也可以從別處 copy 一個(gè)過來)。 再次執(zhí)行: git status 得到輸出: # On branch master # Changes not staged for commit: # (use git add . to update what will be committed) # (use git checkout - . to discard changes in working directory)
23、 # # modified: readme.txt # # Untracked files: # (use git add . to include in what will be committed) # # test.py no changes added to commit (use git add and/or git commit -a) 提示是比較清楚的:readme.txt 被修改過了,還有 untracked 的 test.py。提示里也說了,用git add .可以添加要提交文件。git add 的意思就是, 把文件添加到暫存區(qū),也就是我們說的暫存。 那么我們就來用這條命令:
24、 git add readme.txt git add test.py 然后繼續(xù): git status 再來看結(jié)果: # On branch master # Changes to be committed: # # # # # (use git reset HEAD . to unstage) modified: readme.txt new file: test.py Changes to be committed里列出的就是已暫存的文件,它們將在 commit 時(shí)被提交。 執(zhí)行: git commit -m test file status 將修改和增加的文件提交。-m 后面的參數(shù)是提
25、交時(shí)的注釋。輸出提示會(huì)告訴你這次提交做了哪些改動(dòng)。 最后再來執(zhí)行一遍: git status 可以看到又回到了最初未修改的狀態(tài)。剛剛做的所有改動(dòng)都已經(jīng)被 git 所記錄。 通過命令: git log 可以查看到之前提交的歷史記錄。 在前面的過程中,可能會(huì)因?yàn)槟闼镁庉嬈鞯膫浞輽C(jī)制,在目錄中產(chǎn)生一些奇怪的文件,比如 readme.txt。這類文件也會(huì)被列在未跟蹤的列表中。下節(jié)課我們來說下如何避免這些我們不想關(guān)注的文件,以及其他一些在提交過程中的常用到的命令。 【Git 第 7 課】 忽略文件 在文件夾中,經(jīng)常會(huì)有些“其他”文件,比如上節(jié)課最后提到的,編輯器產(chǎn)生結(jié)尾的備份文件,或者一些臨時(shí)文件。又
26、可能,某些文件我們只是在本地使用,并不 想提交到遠(yuǎn)程的倉庫中被別人看到。但如果我們不跟蹤這些文件,Git 會(huì)一直很執(zhí)著地提醒我們工作目錄中有一些未被跟蹤的文件。如果你想清凈一點(diǎn),就可以通 過.gitignore 文件忽略你不想看到的文件。要感受一下忽略文件的效果,首先你得有打算忽略的文件,所以我們強(qiáng)行創(chuàng)建一個(gè)叫做 readme.txt.tmp 的文件,假設(shè)它是 readme.txt 產(chǎn)生的臨時(shí)文件。git status 看一下效果,同上節(jié)課中一樣,在 untracked files 里列出了這個(gè)文件:# On branch master# Untracked files:#(use git a
27、dd . to include in what will be committed) #readme.txt.tmpnothing added to commit but untracked files present (use git add to track)然后我們?cè)诠ぷ髂夸浿行陆ㄒ粋€(gè).gitignore 文件,在里面寫上一行:*tmp保存退出,再運(yùn)行 git status:# On branch master# Untracked files:#(use git add . to include in what will be committed) #.gitignorenothing
28、 added to commit but untracked files present (use git add to track)readme.txt.tmp 文件消失了,untracked files 里只剩下剛創(chuàng)建的.gitignore 文件。來看一下Pro Git里對(duì).gitignore 格式規(guī)范的解釋:所有空行或者以注釋符號(hào) 開頭的行都會(huì)被 Git 忽略??梢允褂脴?biāo)準(zhǔn)的 glob 模式匹配。匹配模式最后跟反斜杠(/)說明要忽略的是目錄。要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(!)取反。所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式: 星號(hào)(*)匹
29、配零個(gè)或多個(gè)任意字符;abc 匹配任何一個(gè)列在方括號(hào)中的字符(這個(gè)例子要么匹配一個(gè) a,要么匹配一個(gè) b,要么匹配一個(gè) c);問號(hào)(?)只匹配一個(gè)任意字符;如果在方括號(hào)中使用短劃線分隔兩個(gè)字符,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配(比如 0-9 表示匹配所有 0 到 9 的數(shù)字)。所以我們前面寫的 *tmp,就是指忽略所有以 tmp 結(jié)尾的文件。再來看一個(gè).gitignore 文件的例子:# 此為注釋# 忽略所有*.a 將被 Git 忽略.a 結(jié)尾的文件# 但 lib.a 除外!lib.a# 僅僅忽略項(xiàng)目根目錄下的 TODO 文件# 不包括 subdir/TODO/TODO# 忽略build
30、/ # 忽略build/ 目錄下的所有文件doc 目錄下的所有 .txt 文件# 會(huì)忽略 doc/notes.txt# 但不包括 doc/server/arch.txt doc/*.txt當(dāng)然,你也可以把.gitignore 文件本身從 git 中忽略。但我不建議這么做,而是所有協(xié)作開發(fā)者使用統(tǒng)一的規(guī)范,避免有人因?yàn)闆]寫.gitignore 而提交上去一些奇怪的文件。在項(xiàng)目一開始就把.gitignore 設(shè)置好,不僅是為了好看,也是避免不必要的文件對(duì)代碼產(chǎn)生干擾。比如有些需要本地生成的文件,如果放在遠(yuǎn)程倉庫中被其他人下載使用,也可能會(huì)導(dǎo)致程序無法正常運(yùn)行。【Git 第 8 課】 移除文件 有進(jìn)
31、就有出,有借就得有還。有添加文件,自然也必須得有移除文件。當(dāng)不想繼續(xù)對(duì)某個(gè)文件進(jìn)行版本控制的時(shí)候,就需要把它從 Git 中移除。從 Git 中移除一個(gè)文件,本質(zhì)上做的事情就是把這個(gè)文件從暫存區(qū)中刪除,然后提交。完成這個(gè)任務(wù)要用到命令 git rm。為了演示刪除,我們先向工作目錄中添加一個(gè)待刪除的文件 to_be_deleted.txt, 然后 git add,git commit 把它提交到倉庫中。然后我們?cè)賹⑺鼜哪夸浿袆h除。運(yùn)行 git status 看下狀態(tài):# On branch master# Changes not staged for commit:# # # #(use git
32、add/rm . to update what will be committed)(use git checkout - . to discard changes in working directory)deleted:to_be_deleted.txtno changes added to commit (use git add and/or git commit -a)Git 發(fā)現(xiàn)了一處文件改動(dòng):有個(gè)文件被刪掉了。但這僅僅是從你的工作目錄中刪除了文件,而 Git 仍然在跟蹤這個(gè)文件,并將會(huì)一直提示這個(gè)文件的刪除狀態(tài)。同 git add 添加文件至?xí)捍鎱^(qū)類似,用 git rm 命令把文件
33、從暫存區(qū)中刪除:git rm to_be_deleted.txtgit status# On branch master# Changes to be committed:#(use git reset HEAD . to unstage) #deleted:to_be_deleted.txt刪除to_be_deleted.txt 文件的操作已經(jīng)被記錄在了暫存區(qū),換句話說就是,這個(gè)文件被從暫存區(qū)刪除。接下來:git commit -m remove file這樣一來,這個(gè)曾經(jīng)被跟蹤的文件就從 Git 中移除了,以后的版本就沒它什么事了。那么如果我們是手滑誤刪了文件呢?沒關(guān)系,這也是我們使用版本
34、控制的重要原因之一恢復(fù)文件。下節(jié)課來講?!綠it 第 9 課】 撤銷修改 前面說了,如果你手滑刪掉了一個(gè)文件,可以用 Git 幫你找回來。同樣,如果一個(gè)文件被你改來改去面目全非,直到程序無法運(yùn)行,你累感不愛想要回到開始的狀態(tài),Git 也可以幫你輕松搞定。 我們現(xiàn)在直接把 readme.txt 從文件夾中刪除??匆幌聽顟B(tài): # On branch master # Changes not staged for commit: # (use git add/rm . to update what will be committed) # (use git checkout - . to disca
35、rd changes in working directory) # # deleted: readme.txt # no changes added to commit (use git add and/or git commit -a) 注意其中有一句提示: use git checkout - . to discard changes in working directory 用 git checkout - 命令舍棄工作目錄中的修改。注意 checkout 后面的 -,沒有這兩個(gè)減號(hào)就是另一條命令了,后面關(guān)于分支的時(shí)候會(huì)去說它。 那我們就來試一下: git checkout - rea
36、dme.txt 看看文件夾中,消失的文件是不是又回來了?再看下 git status,也回到了沒有產(chǎn)生修改的狀態(tài)。 那么,如果一個(gè)修改后的文件已經(jīng)被暫存了,要如何恢復(fù)到之前的狀態(tài)呢? 我們來改一下 readme.txt,在文件中加點(diǎn)字,然后 git add 添加到暫存區(qū)。查看狀態(tài): # On branch master # Changes to be committed: # (use git reset HEAD . to unstage) # # modified: readme.txt # 這里 Git 又給出提示了: use git reset HEAD . to unstage 用
37、git reset HEAD 命令撤銷暫存。 git reset HEAD readme.txt 這條命令并不會(huì)更改 readme.txt 里的內(nèi)容,修改仍然存在,但是文件的狀態(tài)變回到已修改。 # On branch master # Changes not staged for commit: # (use git add . to update what will be committed) # (use git checkout - . to discard changes in working directory) # # modified: readme.txt # no chang
38、es added to commit (use git add and/or git commit -a) 你可以修改了重新暫存,也可以用前面的方法把文件恢復(fù)。 再進(jìn)一步,如果文件修改已經(jīng)被 commit 了,要如何撤銷? 一種情況是,你提交了之后發(fā)現(xiàn)還漏了幾個(gè)地方?jīng)]有改,或者提交的文件中有些小錯(cuò)誤,想要撤銷回來重新提交。那么你可以用 git commit -amend 來重新提交。 做完修改、暫存之后,運(yùn)行 git commit -amend 會(huì)開啟文本編輯器讓你修改上次的提交注釋,或者通過 -m 參數(shù)直接指定。保存退出后,這一次的改動(dòng)就會(huì)被直接加上上一次的提交里,不會(huì)產(chǎn)生新的 commit
39、。 你 也許覺得,直接再提交一次不就好了。但難免有時(shí)候不想因?yàn)楣P誤產(chǎn)生過多提交。再說,程序員調(diào)試代碼的時(shí)候總會(huì)有些惡趣味,諸如 print believe spring brother 之類的調(diào)試語句,如果最后忘了刪干凈就提交了,肯定不想再做一次提交去刪除。還是直接神不知鬼不覺地清理掉比較好。 還有另一種情況,就是整個(gè)上一次的提交你都不想要了,希望回退到上一個(gè)提交狀態(tài)。這時(shí)候就需要用到版本回退了。 【Git 第 10 課】 版本回退 上次說到,如果你已經(jīng)提交了代碼,但是又后悔了,想要放棄這次的改動(dòng),回到之前的版本。這時(shí)候就需要做版本回退。我們先在工作目錄中運(yùn)行 git log 命令,看看到目前
40、為止的提交記錄:commit 81e34d1d269b13bb23619d828495119492eabc5aAuthor: CrossinDate:Thu Nov 28 17:27:34 2013 +0800remove filecommit 1edcbf15f45359768b3fa9cd99ddddde792912feAuthor: CrossinDate:Thu Nov 28 15:16:37 2013 +0800add file to be deletedcommit 15547cb5e6bb661a4b9934c1ea55fe0aeceb0682Author: CrossinDat
41、e:Tue Nov 26 14:39:06 2013 +0800test file statuscommit c1310cffd37c4b7fe765986035e54a3c27c2887fAuthor: CrossinDate:Tue Nov 26 14:11:46 2013 +0800init readme也許你的提交歷史和我不一樣,這沒關(guān)系。還記得我們前面課里說過的 HEAD,它指向的是最新的提交。而上一次的提交就是HEAD,上上次是 HEAD,也可以寫成 HEAD2,以此類推。之前 30 次版本就是 HEAD30,或者你愿意也可以打 30 個(gè)。要回退上一個(gè)版本,只要:git reset
42、 -hard HEAD-hard 表示放棄所有的本地改動(dòng),其他的可選模式我們先不管。輸出提示:HEAD is now at 1edcbf1 add file to be deletedHEAD 已經(jīng)被移動(dòng)回“add file to be deleted”這個(gè)版本。如果想要移動(dòng)到某個(gè)指定的提交,也可以直接使用提交 id,就是的一串字符(你的版本中的提交 id 和我是不一樣的)。git log 里,commit 后面git reset -hard 15547id 不用輸全,前幾位就夠,git 會(huì)自動(dòng)去找匹配的提交。然后就可以看到:HEAD is now at 15547cb test file s
43、tatus順便說一下,你可以使用 git 里自帶的圖形化客戶端 gitk 來查看和管理版本變動(dòng)。在命令行里輸入 gitk,mac 上是 gitx,就可以打開(如果不幸沒有打開,可能你需要另行安裝以下)。回退前:回退后:注意,當(dāng)用 git reset -hard 回退版本后,所有的本地未提交改動(dòng)將被舍棄,而被回退掉的版本也不再出現(xiàn)在記錄里(雖然還是可以被找回來)。所以在使用此操作時(shí)請(qǐng)慎重考慮。 【Git 第 11 課】 遠(yuǎn)程倉庫 之前講了很多課,都是在本地倉庫里進(jìn)行操作。而 Git 的作用一方面在于對(duì)文件進(jìn)行版本控制,更重要的是便于多人協(xié)作開發(fā)。因此只有本地倉庫的 Git 算不上真正的 Git。而Gi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 5年級(jí)下冊(cè)英語書單詞表點(diǎn)讀
- 低空空中交通應(yīng)用場景
- 登山 法治宣傳活動(dòng)
- 4年級(jí)觀察日記三則怎么寫
- 超聲波塑料焊接 - 副本 - 副本
- 2025年貴陽幼兒師范高等??茖W(xué)校單招職業(yè)技能測試題庫帶答案
- 2025年云南商務(wù)職業(yè)學(xué)院單招職業(yè)傾向性測試題庫一套
- 2025年重慶市綿陽市單招職業(yè)傾向性測試題庫及參考答案
- 2025年天津公安警官職業(yè)學(xué)院單招職業(yè)技能測試題庫1套
- 2025年晉城職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫學(xué)生專用
- 谷物運(yùn)輸機(jī)傳動(dòng)裝置畢業(yè)設(shè)計(jì)
- GB/T 5778-1986膨脹合金氣密性試驗(yàn)方法
- GB/T 5455-2014紡織品燃燒性能垂直方向損毀長度、陰燃和續(xù)燃時(shí)間的測定
- GB/T 5117-2012非合金鋼及細(xì)晶粒鋼焊條
- GB/T 3782-2006乙炔炭黑
- 大國醫(yī)魂:800年滋陰派與600年大德昌課件
- 真核生物的轉(zhuǎn)錄
- 《電商企業(yè)財(cái)務(wù)風(fēng)險(xiǎn)管理-以蘇寧易購為例開題報(bào)告》
- 公司組織架構(gòu)圖(可編輯模版)
- 中小學(xué)綜合實(shí)踐活動(dòng)課程指導(dǎo)綱要
- 清淤工程施工記錄表
評(píng)論
0/150
提交評(píng)論