Git 的工作就是創(chuàng)建和保存你項目的快照及與之后的快照進(jìn)行對比。本章將對有關(guān)創(chuàng)建與提交你的項目快照的命令作介紹。
獲取與創(chuàng)建項目命令
git init
用 git init 在目錄中創(chuàng)建新的 Git 倉庫。 你可以在任何時候、任何目錄中這么做,完全是本地化的。
在目錄中執(zhí)行 git init,就可以創(chuàng)建一個 Git 倉庫了。比如我們創(chuàng)建 php 項目:
$ mkdir php $ cd php/ $ git init Initialized empty Git repository in /Users/tianqixin/www/php/.git/ # 在 /www/php/.git/ 目錄初始化空 Git 倉庫完畢。
現(xiàn)在你可以看到在你的項目中生成了 .git 這個子目錄。 這就是你的 Git 倉庫了,所有有關(guān)你的此項目的快照數(shù)據(jù)都存放在這里。
ls -a . .. .git
git clone
使用 git clone 拷貝一個 Git 倉庫到本地,讓自己能夠查看該項目,或者進(jìn)行修改。
如果你需要與他人合作一個項目,或者想要復(fù)制一個項目,看看代碼,你就可以克隆那個項目。 執(zhí)行命令:
git clone [url]
[url] 為你想要復(fù)制的項目,就可以了。
例如我們克隆 Github 上的項目:
$ git clone git@github.com:schacon/simplegit.git Cloning into 'simplegit'... remote: Counting objects: 13, done. remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13 Receiving objects: 100% (13/13), done. Resolving deltas: 100% (2/2), done. Checking connectivity... done.
克隆完成后,在當(dāng)前目錄下會生成一個 simplegit 目錄:
$ cd simplegit/ $ ls README Rakefile lib上述操作將復(fù)制該項目的全部記錄。
$ ls -a . .. .git README Rakefile lib $ cd .git $ ls HEAD description info packed-refs branches hooks logs refs config index objects
默認(rèn)情況下,Git 會按照你提供的 URL 所指示的項目的名稱創(chuàng)建你的本地項目目錄。 通常就是該 URL 最后一個 / 之后的項目名稱。如果你想要一個不一樣的名字, 你可以在該命令后加上你想要的名稱。
基本快照
Git 的工作就是創(chuàng)建和保存你的項目的快照及與之后的快照進(jìn)行對比。本章將對有關(guān)創(chuàng)建與提交你的項目的快照的命令作介紹。
git add
git add 命令可將該文件添加到緩存,如我們添加以下兩個文件:
$ touch README $ touch hello.php $ ls README hello.php $ git status -s ?? README ?? hello.php $
git status 命令用于查看項目的當(dāng)前狀態(tài)。
接下來我們執(zhí)行 git add 命令來添加文件:
$ git add README hello.php
現(xiàn)在我們再執(zhí)行 git status,就可以看到這兩個文件已經(jīng)加上去了。
$ git status -s A README A hello.php $
新項目中,添加所有文件很普遍,我們可以使用 git add . 命令來添加當(dāng)前項目的所有文件。
現(xiàn)在我們修改 README 文件:
$ vim README <pre> <p>在 README 添加以下內(nèi)容:<b># php Git 測試</b>,然后保存退出。</p> <p>再執(zhí)行一下 git status:</p> $ git status -s AM README A hello.php
"AM" 狀態(tài)的意思是,這個文件在我們將它添加到緩存之后又有改動。改動后我們在執(zhí)行 git add 命令將其添加到緩存中:
$ git add . $ git status -s A README A hello.php
當(dāng)你要將你的修改包含在即將提交的快照里的時候,需要執(zhí)行 git add。
git status
git status 以查看在你上次提交之后是否有修改。
我演示該命令的時候加了 -s 參數(shù),以獲得簡短的結(jié)果輸出。如果沒加該參數(shù)會詳細(xì)輸出內(nèi)容:
$ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: README new file: hello.php
git diff
執(zhí)行 git diff 來查看執(zhí)行 git status 的結(jié)果的詳細(xì)信息。
git diff 命令顯示已寫入緩存與已修改但尚未寫入緩存的改動的區(qū)別。git diff 有兩個主要的應(yīng)用場景。
尚未緩存的改動:git diff
查看已緩存的改動: git diff --cached
查看已緩存的與未緩存的所有改動:git diff HEAD
顯示摘要而非整個 diff:git diff --stat
在 hello.php 文件中輸入以下內(nèi)容:
<?php echo 'php中文網(wǎng):miracleart.cn'; ?>
$ git status -s A README AM hello.php $ git diff diff --git a/hello.php b/hello.php index e69de29..69b5711 100644 --- a/hello.php +++ b/hello.php @@ -0,0 +1,3 @@ +<?php +echo 'php中文網(wǎng):miracleart.cn'; +?>
git status 顯示你上次提交更新后的更改或者寫入緩存的改動, 而 git diff 一行一行地顯示這些改動具體是啥。
接下來我們來查看下 git diff --cached 的執(zhí)行效果:
$ git add hello.php $ git status -s A README A hello.php $ git diff --cached diff --git a/README b/README new file mode 100644 index 0000000..8f87495 --- /dev/null +++ b/README @@ -0,0 +1 @@ +# php Git 測試 diff --git a/hello.php b/hello.php new file mode 100644 index 0000000..69b5711 --- /dev/null +++ b/hello.php @@ -0,0 +1,3 @@ +<?php +echo 'php中文網(wǎng):miracleart.cn'; +?>
git commit
使用 git add 命令將想要快照的內(nèi)容寫入緩存區(qū), 而執(zhí)行 git commit 將緩存區(qū)內(nèi)容添加到倉庫中。
Git 為你的每一個提交都記錄你的名字與電子郵箱地址,所以第一步需要配置用戶名和郵箱地址。
$ git config --global user.name 'php' $ git config --global user.email test@php.cn
接下來我們寫入緩存,并提交對 hello.php 的所有改動。在首個例子中,我們使用 -m 選項以在命令行中提供提交注釋。
$ git add hello.php $ git status -s A README A hello.php $ $ git commit -m '第一次版本提交' [master (root-commit) d32cf1f] 第一次版本提交 2 files changed, 4 insertions(+) create mode 100644 README create mode 100644 hello.php
現(xiàn)在我們已經(jīng)記錄了快照。如果我們再執(zhí)行 git status:
$ git status # On branch master nothing to commit (working directory clean)
以上輸出說明我們在最近一次提交之后,沒有做任何改動,是一個"working directory clean:干凈的工作目錄"。
如果你沒有設(shè)置 -m 選項,Git 會嘗試為你打開一個編輯器以填寫提交信息。 如果 Git 在你對它的配置中找不到相關(guān)信息,默認(rèn)會打開 vim。屏幕會像這樣:
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.php # ~ ~ ".git/COMMIT_EDITMSG" 9L, 257C
如果你覺得 git add 提交緩存的流程太過繁瑣,Git 也允許你用 -a 選項跳過這一步。命令格式如下:
git commit -a
我們先修改 hello.php 文件為以下內(nèi)容:
<?php echo 'php中文網(wǎng):miracleart.cn'; echo 'php中文網(wǎng):miracleart.cn'; ?>
再執(zhí)行以下命令:
git commit -am '修改 hello.php 文件' [master 71ee2cb] 修改 hello.php 文件 1 file changed, 1 insertion(+)
git reset HEAD
git reset HEAD 命令用于取消已緩存的內(nèi)容。
我們先改動文件 README 文件,內(nèi)容如下:
# php Git 測試 # php中文網(wǎng)
hello.php 文件修改為:
<?php echo 'php中文網(wǎng):miracleart.cn'; echo 'php中文網(wǎng):miracleart.cn'; echo 'php中文網(wǎng):miracleart.cn'; ?>
現(xiàn)在兩個文件修改后,都提交到了緩存區(qū),我們現(xiàn)在要取消其中一個的緩存,操作如下:
$ git status -s M README M hello.php $ git add . $ git status -s M README M hello.pp $ git reset HEAD -- hello.php Unstaged changes after reset: M hello.php $ git status -s M README M hello.php
現(xiàn)在你執(zhí)行 git commit,只會將 README 文件的改動提交,而 hello.php 是沒有的。
$ git commit -m '修改' [master f50cfda] 修改 1 file changed, 1 insertion(+) $ git status -s M hello.php
可以看到 hello.php 文件的修改并為提交。
這時我們可以使用以下命令將 hello.php 的修改提交:
$ git commit -am '修改 hello.php 文件' [master 760f74d] 修改 hello.php 文件 1 file changed, 1 insertion(+) $ git status On branch master nothing to commit, working directory clean
簡而言之,執(zhí)行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的緩存。
git rm
git rm 會將條目從緩存區(qū)中移除。這與 git reset HEAD 將條目取消緩存是有區(qū)別的。 "取消緩存"的意思就是將緩存區(qū)恢復(fù)為我們做出修改之前的樣子。默認(rèn)情況下,git rm file 會將文件從緩存區(qū)和你的硬盤中(工作目錄)刪除。
如果你要在工作目錄中留著該文件,可以使用 git rm --cached:
如我們刪除 hello.php文件:
$ git rm hello.php rm 'hello.php' $ ls README
不從工作區(qū)中刪除文件:
$ git rm --cached README rm 'README' $ ls README
git mv
git mv 命令做得所有事情就是 git rm --cached 命令的操作, 重命名磁盤上的文件,然后再執(zhí)行 git add 把新文件添加到緩存區(qū)。
我們先把剛移除的 README 添加回來:
$ git add README
然后對其重名:
$ git mv README README.md $ ls README.md