Git版本控制工具(二)----本地版本庫的常用操作,git----
【聲明】
歡迎轉載,但請保留文章原始出處→_→
生命壹號:http://www.cnblogs.com/smyhvae/
文章來源:http://www.cnblogs.com/smyhvae/p/3994704.html
連絡方式:smyhvae@163.com
【本文】
在上一章節中,我們學習了關於Git最基本的用法,包括安裝Git、建立版本庫,以及提交本地代碼。本章節中將學習更多的提示。即:Git版本控制工具(一)----git的安裝及建立版本庫
我們先要做好準備工作,將某個項目建立版本庫,我這裡就建立一個Android項目GitTest,建立一個版本庫。開啟Git Bash,進入到這個項目的根目錄下,然後執行git init命令,如所示:
這樣,準備工作就做好了。
一、忽略檔案:
版本庫已經建立好了,接下來我們需要提交項目中的代碼,但是不是所有的檔案都需要加入到版本控制當中去呢?
我們需要知道,在Android項目結構中,bin目錄和gen下的檔案都是自動產生的,我們不應該將這部分檔案添加到版本控制當中,否則有可能會對檔案的自動產生造成影響。那如何才能實現這樣的效果呢?
其實,Git會檢查版本庫中的根目錄下是否存在一個名為.gitignore的檔案,如果存在的話,就去一行一行的讀取這個檔案中的內容,並把每一行指定的檔案或目錄排除在版本控制之外。注意,.gitignore的檔案中指定的檔案或者目錄是可以使用“*”萬用字元的。
【步驟】
現在,我們在GitTest項目的根目錄下建立一個名為.gitignore的檔案,然後去編輯這個檔案中的內容。如所示:
這樣就把bin目錄和gen下的檔案都忽略掉,從而使它們不會加入到版本控制中。
記住,.gitignore檔案的編碼方式必須為UTF-8:
然後就可以使用add提交代碼:
git add .
然後執行commit命令完成提交:
git commit -m "First commit"
註:以後每次修改忽略檔案之後,或者重新添加了檔案,都必須重新提交,檔案才會生效。
問:如果某個檔案被加入到忽略檔案中,即使被修改了內容,通過git status 和git diff也還是能夠看到的修改記錄,這是為什麼呢?是忽略檔案無效嗎?
二、查看修改的內容:(未提交之前)
Git比其他版本控制系統設計得優秀,因為Git跟蹤並管理的是修改,而非檔案。
在進行一次代碼提交之後,我們後面還需要對項目不斷地進行維護,添加新功能。理想的情況是:每完成一小塊功能,就執行一次提交。Git會記住每一次提交的狀態。
註:這裡能查看到的修改內容是指提交之前的修改。如果你已經提交了,馬上再輸入這個命令,就看不到修改的內容了。
1、查看被修改的檔案:git status
查看檔案修改的情況的方法非常簡單,只需在根目錄執行如下命令:
git status
然後Git會提示目前項目中沒有任何可提交的檔案,因為我們才剛剛提交過。現在我們在布局檔案中,添加一個Button,添加的代碼如下:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一個按鈕" />
然後再輸入git status看一下:
git status命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令告訴我們,activity_main.xml被修改過了,但這還只是沒有提交的修改。
2、查看檔案的具體修改內容:git diff
之前的git status命令可以查看被修改的檔案是什麼,如果要查看具體的修改內容,需要輸入如下命令:
git diff
執行結果如下:
git diff顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式。
如果只想查看activity_main.xml這個檔案的更改內容,可以使用如下命令:
git diff res/layout/activity_main.xml
執行結果如下:
3、撤銷未add的修改:git checkout
只要代碼未提交,所有修改的內容都是可以撤銷 的。可以執行git checkout這個命令。即執行如下命令:
git checkout -- res/layout/activity_main.xml
執行之後,我們對activity_main.xml這個檔案在提交之前所做的全部修改都被撤銷了。
重新運行git status命令檢查一下:
可以看到,當前項目沒有任何可以提交的檔案,撤銷成功。
4、撤銷未commit的修改:git reset和git checkout
不過上面這種方式只適用於還沒有執行過add命令的檔案,如果某個檔案已經被add過了,這種方式是無效的。
此時應該採取的步驟是:先使用reset命令取消添加,再使用checkout命令將修改的內容進行撤銷。即執行如下命令:
git reset HEAD res/layout/activity_main.xmlgit checkout -- res/layout/activity_main.xml
用暫存區中filename檔案來覆蓋工作區中的filename檔案。
【總結】
命令git checkout -- filename意思就是,把filename這個檔案在工作區的修改全部撤銷。
這裡有兩種情況:
- 一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
- 一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
一句話總結,即:用暫存區中filename檔案來覆蓋工作區中的filename檔案。
註:git checkout -- file命令中的“--”很重要,沒有“--”,就變成了“建立一個新分支”的命令,我們在後面的分支管理中會再次遇到git checkout命令。
5、刪除檔案:
當你直接在在檔案管理工具中把沒用的檔案(這裡以忽略檔案為例)刪了,這個時候,Git知道你刪除了檔案,因此,工作區和版本庫就不一致了,git status命令會立刻告訴你哪些檔案被刪除了:
現在你有兩個選擇,一是確實要從版本庫中刪除該檔案,那就用命令git rm刪掉,並且commit:
git rm .gitignoregit commit -m "delete .gitignore"
另一種情況是刪錯了,現在不想刪除,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢複到最新版本:
git checkout -- .gitignore
註:git checkout其實是用版本庫裡的版本(準確來說是暫存區的版本)替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
三、查看提交記錄:(log命令)
每當你覺得檔案修改到一定程度的時候,就可以“儲存一個快照”,這個快照在Git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢複,然後繼續工作,而不是把幾個月的工作成果全部丟失。
當某個項目開發了幾個月之後,我們可能已經執行過上百次的提交操作了。這個時候估計你早就忘記了每次提交都修改了哪些內容。不過沒關係,Git一直都幫我們記錄著呢。
我們現在將之前的修改進行提交:
git add .git commit -m "add button1"
然後執行如下命令查看提交記錄:
git log
執行的結果如下:
可以看到,每次提交都會包含提交id,提交人,提交日期,以及提交描述這四個資訊。
你看到的一大串類似“ 3628164...882e1e0”的是commit id(版本號碼),和SVN不一樣,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個非常大的數字,用十六進位表示,而且你看到的commit id和我的肯定不一樣,以你自己的為準。為什麼commit id需要用這麼一大串數字表示呢?因為Git是分布式的版本控制系統,後面我們還要好幾個人在同一個版本庫裡工作,如果大家都用1,2,3……作為版本號碼,那肯定就衝突了。
當提交記錄非常多的時候,我們只想查看其中的某條記錄,可以在該log命令的後面加上對應記錄的id,並加上-l參數。即:git log [id] -l
而如果想要查看這條記錄提交記錄的具體修改了什麼內容,可以繼續加上-p參數。即:git log [id] -l -p
四、版本回退:
我們現在進行第二次修改,也就是說,在布局檔案中添加一個按鈕button2,然後執行git log命令,顯示效果如下:
顯示,我們總共進行了三次提交。
每提交一個新版本,實際上Git就會把它們自動串成一條時間軸。執行如下命令進入可視化介面:
gitk
執行後彈出如下介面:
現在開始我們的版本回退工作。
首先,Git必須知道目前的版本是哪個版本,在Git中,用HEAD表示目前的版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較麻煩,所以寫成HEAD~100。
【新版本回到舊版本】
現在,我們從“版本3”回退到上一個版本,即回退到“版本2”,就可以使用git reset命令:
git reset --hard HEAD^
執行效果如下:
--hard參數有啥意義?這個後面再講,暫時先放心使用。
再執行git log命令,發現版本三已經不見了:
【舊版本回到新版本】
如果現在要從“版本2”回到“版本3”,該怎麼辦呢?辦法其實還是有的。
只要上面的命令列視窗還沒有被關掉,就可以順著往上找,只要找到版本3的id號就行了,即輸入如下命令:
git reset --hard 508972a
版本號碼沒必要寫全,寫前7位就可以了,Git會自動去找。
如果你想回退到某個版本,但是電腦已經關閉了,這個時候已經找不到新版本的commit id了,該怎麼辦呢?辦法總是有的。Git提供了一個命令git reflog用來記錄你的每一次命令。即輸入如下命令:
git reflog
於是,我們終於找到了版本三的commit id。又可以輸入同樣的命令回到版本三了。
現在我們可以做一個總結了:
- HEAD指向的版本就是目前的版本,因此,Git允許我們在版本的曆史之間穿梭,使用命令git reset --hard commit_id
- 穿梭前,用git log可以查看有哪些版本,以便確定要回退到哪個版本
- 要重返未來,用git reflog查看命令曆史,以便確定要回到未來的哪個版本
五、工作區和暫存區的概念:
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
- 工作區(Working Directory):就是你在電腦裡能看到的目錄;
- 版本庫(Repository):工作區有一個隱藏目錄“.git”,這個不算工作區,而是Git的版本庫
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
註:分支和HEAD的概念稍後再說。
我們把檔案往Git版本庫裡添加的時候,是分兩步執行的:
- 第一步是用“git add”把檔案添加進去,實際上就是把檔案修改添加到暫存區;
- 第二步是用“git commit”提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,commit就是往master分支上提交更改。可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的。即:nothing to commit (working directory clean)。
註:用“git diff HEAD -- filename”命令可以查看工作區和暫存區裡面最新版本的區別。
關於遠程倉庫的使用,我們將在下一章節中進行講解。
本文參考連結:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743858312764dca7ad6d0754f76aa562e3789478044000
教Git版本控制工具中的問題
簡單說,三個概念:遠程倉庫、本地倉庫、本地工作目錄。
clone是從遠程倉庫上down下本地倉庫+工作目錄:本地倉庫就是工作目錄裡.git這個目錄
commit是把工作目錄的修改提交給本地倉庫
pull把遠程倉庫的修改取回到本地倉庫+工作目錄
push把本地倉庫的修改提交給遠程倉庫
問,linux下的版本控制工具git,怎確認本地(是從server clone下來的)的更改已經update到server
命令列用git remote -v show origin,tortoisegit不太清楚。
origin是遠程那邊的名字,你可能不是這個
不過你既然git push用起來不行,最好還是先解決這個問題。不然可能整個remote功能都不能用。