Git 单机版
簡介:
Git 是一款開源的分布式版本控制系統,是當今最流行、先進的版本控制軟件,沒有之一。
Git 是一個分布式的版本控制系統,相反 SVN 就是一個集中式的版本控制系統了。SVN 每修改完一個文件要提交到服務端進行保存,而 Git 在本地有一個完整的版本庫。
一、安裝 Git
1、Linux( CentOS )
shell > yum -y install git## 沒錯,已經安裝完成了
2、Windows( WIN7 )
下載地址:https://github-windows.s3.amazonaws.com/GitHubSetup.exe > 雙擊圖標,選擇 install( 會自動下載程序包 ) > 選擇 skip ,如果你有 github 用戶,也可以登陸哦 > 點擊左上角的 "+" ,添加自己的版本庫,輸入版本庫名、選擇版本庫路徑,最后點擊創建 > 然后就可以添加文件到版本庫了,可以使用 Git Shell 命令行操作喲二、Git( CentOS )
1、創建版本庫
shell > git config --global user.name "wang" shell > git config --global user.email "wang@163.com" shell > git config --global color.ui true## 第一、二條是設置自己的用戶名、郵件地址,分布式版本控制系統嘛,用來證明你是你。由于是全局配置,本地所有的版本庫都是這個名,也可以單獨為某個版本庫設置( 這是必須設置的 )
## 第三條是智能顏色顯示,輸出的結果有顏色區分,看著方便、顯著高大上,對就是這個意思
## 使用 git init 初始化版本庫( 在哪個目錄下執行,哪個目錄就是版本庫目錄 )
## 這樣就創建好了一個 gitdb 的版本庫了,版本庫的相關文件全保存在隱藏目錄 .git 下,一般不要手動去修改里面的東西,否則會把版本庫玩壞
2、向版本庫中添加文件
## 關于 Git 的操作,沒有特殊說明情況下,操作目錄都是 /git/gitdb/ 這里
shell > head -5 /etc/passwd | tee passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin## 把 /etc/passwd 文件中的前 5 行數據重定向到了 /git/gitdb/passwd 文件中,內容如上
shell > git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # passwd nothing added to commit but untracked files present (use "git add" to track)## 這時通過 git status 指令可以看到,工作區有一個名為 passwd 的文件,還沒有提交( 提交前要使用 git add <file> 指令將文件添加到暫存區 )
## 工作區:版本庫目錄即為工作區( 在版本庫目錄中創建一個文件,就是在工作區創建一個文件 )
## 暫存區:使用 git add 指令時,實際上就是把文件從工作區添加到暫存區的過程
## 分支:創建版本庫時,git 會自動創建一個 master 分支,使用 git commit 指令時,實際上就是把暫存區的所有文件提交到 master 分支
## 所以這三者之間的關系是:工作區-->暫存區-->分支
## git add 可以多次添加、也可以一次添加多個文件到暫存區,git commit 會一次性把暫存區的所有修改提交到分支
## 添加完成后,發現暫存區有一個名為 passwd 的文件還沒有提交( 可以使用 git rm --cached <file> 指令將暫存區的文件刪除,注意:不是工作區的文件 )
shell > git rm --cached passwd rm 'passwd'## 刪除后,你會發現:工作區的 passwd 文件還在,當使用 git status 指令時,狀態又變回了沒有 git add 時的狀態
shell > git add passwd shell > git commit passwd -m "one" git commit -m "one" [master (root-commit) 7af25e2] one 1 files changed, 5 insertions(+), 0 deletions(-) create mode 100644 passwd## 提交時,-m 參數用來做個標記,你可以標注一些有意思的東西,例如你做了什么修改之類的...
shell > git status # On branch master nothing to commit (working directory clean)## 這時使用 git status 指令發現工作區已經沒有東西了( 提交完成 )
3、恢復到上個版本或某個版本
shell > sed -i 's/nologin/login/g' passwd shell > git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: passwd # no changes added to commit (use "git add" and/or "git commit -a")## 由于把文件中 nologin 字段修改成了 login ,git status 發現 passwd 文件被修改了,但是還沒有更新( git checkout -- <file> 待會說 )
shell > git diff HEAD -- passwd diff --git a/passwd b/passwd index 03dab68..96635c1 100644 --- a/passwd +++ b/passwd @@ -1,5 +1,5 @@ root:x:0:0:root:/root:/bin/bash -bin:x:1:1:bin:/bin:/sbin/nologin -daemon:x:2:2:daemon:/sbin:/sbin/nologin -adm:x:3:4:adm:/var/adm:/sbin/nologin -lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin +bin:x:1:1:bin:/bin:/sbin/login +daemon:x:2:2:daemon:/sbin:/sbin/login +adm:x:3:4:adm:/var/adm:/sbin/login +lp:x:4:7:lp:/var/spool/lpd:/sbin/login## 可以使用 git diff 指令查看工作區跟版本庫( 分支 )的文件( 改動 )差異( HEAD 代表分支中( 版本庫 )當前版本,即最新版本 )
shell > git add passwd shell > git commit -m "two" [master 6fd5803] two 1 files changed, 4 insertions(+), 4 deletions(-) shell > git status # On branch master nothing to commit (working directory clean)## 將修改后的文件提交到了版本庫中,搞了個標記叫 two ,呃,代表第二次提交
## 提交完成后,工作區就沒有東西了
## 第三次提交完成,使用 git diff 指令發現版本庫中最新版本跟工作區文件完全相同
shell > git log git log commit 4cba14306c482080f442043b33f1dd640352a3f9 Author: wang <wang@163.com> Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a Author: wang <wang@163.com> Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062 Author: wang <wang@163.com> Date: Tue Jul 21 18:54:41 2015 +0200one## 通過 git log 指令可以清楚的看到總共有三次提交,標記為 one 、two 、three ,現在想回到上次版本( two )怎么辦 ?
shell > git reset --hard HEAD^ HEAD is now at 6fd5803 two shell > cat passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/login daemon:x:2:2:daemon:/sbin:/sbin/login adm:x:3:4:adm:/var/adm:/sbin/login lp:x:4:7:lp:/var/spool/lpd:/sbin/login## 使用 git reset 指令,HEAD^ 代表上個版本,HEAD^^ 代表上兩個版本,現在已經回到了 two 版本了( three 版本的 bash 變為 python 已經又恢復成 bash 了 )
shell > git log commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a Author: wang <wang@163.com> Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062 Author: wang <wang@163.com> Date: Tue Jul 21 18:54:41 2015 +0200one## 現在就剩兩個版本了,最上面 two 為最新版本,即當前版本
## 恢復到某個版本,假設有好多好多個版本,使用 HEAD^^^^ 或 HEAD~[number] 的方式就很不方便了( 都要數 )
## 既然 HEAD 代表版本號,那么恢復時直接輸入版本號不就可以了?非常方便,git log 指令輸出的 commit 字段( 7af25e23a89ba16e5ff14a8da305542bc9cc6062 )就是版本號
## 使用 git reset 指令時,只需輸出版本號的前幾位即可,可以看到已經恢復到了第一版,文件內容也變回了最初的狀態
shell > git log commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062 Author: wang <wang@163.com> Date: Tue Jul 21 18:54:41 2015 +0200one## 這時使用 git log 指令發現只有第一次提交的版本了,那么現在想回到 two 或 three 版本該怎么辦?( 版本號沒有了 )
shell > git reflog 7af25e2 HEAD@{0}: 7af25e2: updating HEAD 6fd5803 HEAD@{1}: HEAD^: updating HEAD 4cba143 HEAD@{2}: commit: three 6fd5803 HEAD@{3}: commit: two shell > git reset --hard 4cba143 HEAD is now at 4cba143 three## 使用 git reflog 指令可以看到操作記錄,第一列就是我們想要的版本號,再次使用 git reset 指令恢復即可
shell > cat passwd root:x:0:0:root:/root:/bin/python bin:x:1:1:bin:/bin:/sbin/login daemon:x:2:2:daemon:/sbin:/sbin/login adm:x:3:4:adm:/var/adm:/sbin/login lp:x:4:7:lp:/var/spool/lpd:/sbin/login shell > git log commit 4cba14306c482080f442043b33f1dd640352a3f9 Author: wang <wang@163.com> Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a Author: wang <wang@163.com> Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062 Author: wang <wang@163.com> Date: Tue Jul 21 18:54:41 2015 +0200one## 文件內容、版本信息都回來了,現在的版本恢復到了 three 狀態
4、git checkout -- <file> :還記得這個不 ?
shell > sed -i '1d' passwd shell > git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: passwd # no changes added to commit (use "git add" and/or "git commit -a")## 當修改了工作區文件內容后,使用 git status 指令可以看到這樣的提示( git checkout -- <file> 可以撤銷工作區文件的修改 )
shell > cat passwd bin:x:1:1:bin:/bin:/sbin/login daemon:x:2:2:daemon:/sbin:/sbin/login adm:x:3:4:adm:/var/adm:/sbin/login lp:x:4:7:lp:/var/spool/lpd:/sbin/loginshell > git checkout -- passwd## 使用 git checkout 指令撤銷工作區文件的改動( 恢復到跟版本庫一樣的狀態,就是剛才所有的修改全部被撤回 )
shell > sed -i '1d' passwd shell > git add passwd shell > sed -i '1d' passwd shell > git status shell > git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: passwd # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: passwd ### 現在是一個什么情況呢 ?首先刪除了文件第一行,執行了 git add 指令( 文件的修改被添加到了暫存區 ),接著又刪除了一次,那么現在執行 git checkout 指令文件被恢復成什么樣 ?
shell > git checkout -- passwd## 實踐證明:文件被恢復到了暫存區的狀態,也就是刪除一次的狀態
shell > git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: passwd ### 這是暫存區的狀態,怎么恢復暫存區的狀態,也就是把第一次的刪除也撤銷( 注意:這已經 git add 了 )
shell > git reset HEAD passwd Unstaged changes after reset: M passwd## 還記得 git reset 這個指令不,沒錯用來恢復文件到上個版本的,也可以用來將暫存區的改動回退到工作區
shell > git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: passwd # no changes added to commit (use "git add" and/or "git commit -a")## 再次查看狀態,提示工作區有改動,可以使用 git checkout -- <file> 將工作區的改動也撤銷
## git reset 將文件回退到上一次版本 / 將暫存區的改動回退到工作區
## git checkout 將工作區的改動撤銷 / 將工作區的改動回退到暫存區
5、刪除文件
shell > git rm passwd rm 'passwd' shell > git commit -m "delete passwd" [master 3be8d7a] delete passwd 1 files changed, 0 insertions(+), 5 deletions(-) delete mode 100644 passwd## 使用 git rm 指令將版本庫中的文件刪除,然后提交刪除( 文件就被刪除了,版本庫目錄下也沒有了 )
shell > git log commit 3be8d7a3ade6f8947135843832bb6cfa075638a4 Author: wang <wang@163.com> Date: Wed Jul 22 13:18:23 2015 +0200delete passwdcommit 4cba14306c482080f442043b33f1dd640352a3f9 Author: wang <wang@163.com> Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a Author: wang <wang@163.com> Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062 Author: wang <wang@163.com> Date: Tue Jul 21 18:54:41 2015 +0200oneshell > git reset --hard 4cba14 HEAD is now at 4cba143 three## ... 好不容易刪除了,結果又給恢復了 ^_^ ,不要高興太早,如果修改完文件,沒有提交就刪除了文件,那么剛才的修改就真的丟失了..
shell > rm -rf passwd shell > git reset --hard 4cba14 HEAD is now at 4cba143 three## 是不是再也不用擔心誤刪除文件了 ^_^ ( 單機情況下你別物理磁盤爆炸了,那就真的啥也沒有了 )
## 參考教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
轉載于:https://www.cnblogs.com/wangxiaoqiangs/p/5336347.html
總結
- 上一篇: 【three.js】库
- 下一篇: objective-C Collecti