git專案建立及日常管理簡單命令
阿新 • • 發佈:2019-01-11
Git是目前世界上最先進的分散式版本控制系統(沒有之一) 。
在Linux上安裝Git
首先, 你可以試著輸入 git , 看看系統有沒有安裝Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令, 有很多Linux會友好地告訴你Git沒有安裝, 還會告訴你如何安裝Git。
msysgit是Windows版的Git, 從http://msysgit.github.io/下載, 然後按默認選項安裝即可。
安裝完成後, 在開始菜
安裝完成後, 還需要最後一步設置, 在命令列輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
注意 git config 命令的 --global 引數, 用了這個引數, 表示你這臺機器上所有的Git倉庫都會使用這個配置, 當然也可以對某個倉庫指定不同的用戶名和Email地址。
創建版本庫
什麼是版本庫呢?版本庫又名錄, 這個目錄裡面的所有檔案都可以被Git管理起來, 每個檔案的修改、 刪除, Git
都能跟蹤, 以便任何時刻都可以追蹤歷史, 或者在將來某個時刻可以“還原”。
所以, 創建一個版本庫非常簡單, 首先, 選擇一個合適的地方, 創建一個空目錄:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
第二步, 通
過
git init
命令把
這
個目
錄變
成
Git
可以管理的
倉庫
:瞬 間 Git 就把 倉庫 建好了, 而且告 訴 你是一個空的 倉庫 ( empty Git repository ) , 細 心的 讀 者可以 發現 當前目 錄 下多了一個 .git 的目 錄 , 這 個目 錄 是 Git 來跟蹤管理版本 庫 的, 沒事千萬不要手 動 修改 這 個目 錄 裡面的檔案, 不然改亂了, 就把 Git 倉庫給 破壞了。$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
如果你沒有看到 .git 目錄, 那是因為這個目錄默認是隱藏的, 用 ls -ah 命令就可以看見。
現在我們編寫一個 readme.txt 檔案, 內容如下:
Git is a version control system.
Git is free software.
第一步, 用命令
git add
告
訴
Git
, 把檔案新增到
倉庫
:$ git add readme.txt
第二步, 用命令
git commit
告
訴
Git
, 把檔案提交到
倉庫
:$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
簡單
解
釋
一下
git commit
命令,
-m
後面
輸
入的是本次提交的
說
明, 可以
輸
入任意內容, 當然最好是有意
義
的,
這樣
你就能從
歷
史
記錄
裡方便地找到改
動記錄
。
git commit
命令
執
行成功後會告
訴
你,
1
個檔案被改
動
(我
們
新新增的
readme.txt
檔案) , 插入了
兩
行內容(
readme.txt
有
兩
行內容) 。為 什麼 Git 新增檔案需要 add , commit 一共 兩 步呢?因 為 commit 可以一次提交很多檔案, 所以你可以多次 add 不同的檔案, 比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
我
們繼續
修改
readme.txt
檔案, 改成如下內容:Git is a distributed version control system.
Git is free software.
現
在,
運
行
git status
命令看看
結
果:
$ 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: readme.txt
# n
o changes added to commit (use "git add" and/or "git commit -a")
雖
然
Git
告
訴
我
們
readme.txt
被修改了, 但如果能看看具體修改了什麼內容, 自然是很好的。 比如你休假 兩 周從國外回來, 第一天上班 時 , 已 經記 不清上次怎麼修改的
readme.txt , 所以, 需要用 git diff 這 個命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff
顧
名思
義
就是
查
看
difference
,
顯
示的格式正是
Unix
通用的
diff
格式, 可以從上面的命令
輸
出看到, 我
們
在第一行添加了一個
“distributed”
單詞
。
知道了 對 readme.txt 作了什麼修改後, 再把它提交到 倉庫 就放心多了, 提交修改和提交新檔案是一 樣 的 兩 步, 第一步是 git add :
$ git add readme.txt
同
樣
沒有任何
輸
出。 在
執
行第二步
git commit
之前, 我
們
再
運
行
gitstatus 看看當前 倉庫 的狀 態 :
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# #
modified: readme.txt
#
git status
告
訴
我
們
, 將要被提交的修改包括
readme.txt
, 下一步, 就可以放心地提交了:
$ git commit -m "add distributed"
[master ea34578] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交後, 我
們
再用
git status
命令看看
倉庫
的當前狀
態
:$ git status
# On branch master
nothing to commit (working directory clean)
Git必須知道當前版本是哪個版本, 在Git中, 用 HEAD 表示當前版本, 也就是最新的提交 3628164...882e1e0 (注意我的提交ID和你的肯定不一樣) , 上一個版本就是 HEAD^ , 上上一個版本就是 HEAD^^ , 當然往上100個版本寫100個 ^ 比較容易數不過來, 所以寫成 HEAD~100 。
小結
要隨時掌握工作區的狀態, 使用 git status 命令。- 如果 git status 告訴你有檔案被修改過,
- 用 git diff 可以查看修改內容。
- HEAD 指向的版本就是當前版本, 因此, Git允許我們在版本的歷史之間穿梭
- 使用命令 git reset --hard commit_id 。
- 穿梭前, 用穿梭前, 用 git log 可以查看提交歷史, 以便確定要回退到哪個版本。
- 要重返未來, 用 git reflog 查看命令歷史, 以便確定要回到未來的哪個版本
- 看看readme.txt的內容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
工作區和暫存區
工作區(Working Directory)就是你在電腦裡能看到的目錄, 比如我的 learngit 檔案夾就是一個工作區 : 版本 庫 ( Repository )
工作區有一個 隱 藏目 錄 .git , 這 個不算工作區, 而是 Git 的版本 庫 。 Git 的版本 庫 裡存了很多 東 西, 其中最重要的就是稱 為 stage (或者叫 index ) 的 暫 存區, 還 有 Git 為 我 們 自 動創 建的第一個分支 master , 以及指向 master 的一個指 針 叫 HEAD 。
前面 講 了我 們 把檔案往 Git 版本 庫 裡新增的 時 候, 是分 兩 步 執 行的:
第一步是用 git add 把檔案新增 進 去, 實際 上就是把檔案修改新增到 暫 存區;
第二步是用 git commit 提交更改, 實際 上就是把 暫 存區的所有內容提交到當前分支。
因 為 我 們創 建 Git 版本 庫時 , Git 自 動為 我 們創 建了唯一一個 master 分支, 所以,現在, git commit 就是往 master 分支上提交更改。 你可以 簡單 理解 為 , 需要提交的檔案修改通通放到 暫 存區, 然後, 一次性提交 暫 存區的所有修改。
撤銷修改
git checkout -- file 可以 丟 棄工作區的修改:$ git checkout -- readme.txt
命令
git checkout -- readme.txt
意思就是, 把
readme.txt
檔案在工作區的修改全部撤 銷 , 這 裡有 兩 種情況:
一種是 readme.txt 自修改後 還 沒有被放到 暫 存區, 現 在, 撤 銷 修改就回到和版本 庫 一模一 樣 的狀 態 ;
一種是 readme.txt 已 經 新增到 暫 存區後, 又作了修改, 現 在, 撤 銷 修改就回到新增到 暫 存區後的狀 態 。
在 commit 之前, 你 發現 了 這 個 問題 。 用 git status 查 看一下, 修
改只是新增到了 暫 存區, 還 沒有提交:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# #
modified: readme.txt
#
Git
同
樣
告
訴
我
們
, 用命令
git reset HEAD file
可以把
暫
存區的修改撤
銷
掉( unstage ) , 重新放回工作區:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既可以回退版本, 也可以把
暫
存區的修改回退到工作區。 當我
們用 HEAD 時 , 表示最新的版本。
刪除檔案
用命令
git rm
刪
掉, 並且
git commit
:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
現
在, 檔案就從版本
庫
中被
刪
除了。
git log退出方法:英文狀態下按q。