Git 基本操作
Git 的工作就是創造並儲存你專案的快照及與之後的快照進行比較。本章將對建立與提交你的專案快照的命令作介紹。
取得與建立專案指令
git init
用 git init 在目錄中建立新的 Git 倉庫。 你可以在任何時候、任何目錄中這麼做,完全是在地化的。
在目錄中執行 git init,就可以建立一個 Git 倉庫了。例如我們建立 php 專案:
$ mkdir php $ cd php/ $ git init Initialized empty Git repository in /Users/tianqixin/www/php/.git/ # 在 /www/php/.git/ 目录初始化空 Git 仓库完毕。
現在你可以看到在你的專案中產生了 .git 這個子目錄。 這就是你的 Git 倉庫了,所有有關你的此項目的快照資料都存放在這裡。
ls -a . .. .git
git clone
使用 git clone 拷貝一個 Git 倉庫到本地,讓自己能夠查看該項目,或者進行修改。
如果你需要與他人合作一個項目,或者想要複製一個項目,看看程式碼,你就可以克隆那個項目。 執行指令:
git clone [url]
[url] 為你想要複製的項目,就可以了。
例如我們複製 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.
複製完成後,在目前目錄下會產生一個 simplegit 目錄:
$ cd simplegit/ $ ls README Rakefile lib上述操作將複製該項目的完整記錄。
$ ls -a . .. .git README Rakefile lib $ cd .git $ ls HEAD description info packed-refs branches hooks logs refs config index objects
預設情況下,Git 會按照你提供的 URL 所指示的項目的名稱建立你的本機專案目錄。 通常就是該 URL 最後一個 / 之後的項目名稱。如果你想要一個不一樣的名字, 你可以在該指令後面加上你想要的名稱。
基本快照
Git 的工作就是創建和保存你的專案的快照及與之後的快照進行比較。本章將對建立與提交你的專案的快照的命令作介紹。
git add
git add 指令可將該檔案新增至快取,如我們新增以下兩個檔案:
$ touch README $ touch hello.php $ ls README hello.php $ git status -s ?? README ?? hello.php $
git status 指令用於檢視專案的目前狀態。
接下來我們執行 git add 指令來新增檔案:
$ git add README hello.php
現在我們再執行 git status,就可以看到這兩個檔案已經加上去了。
$ git status -s A README A hello.php $
新專案中,新增所有檔案很普遍,我們可以使用 git add . 指令來新增目前專案的所有檔案。
現在我們修改 README 檔案:
$ vim README <pre> <p>在 README 添加以下内容:<b># php Git 测试</b>,然后保存退出。</p> <p>再执行一下 git status:</p> $ git status -s AM README A hello.php
"AM" 狀態的意思是,這個檔案在我們將它新增到快取之後又有改動。改動後我們在執行 git add 指令將其加入到快取中:
$ git add . $ git status -s A README A hello.php
當你要將你的修改包含在即將提交的快照裡的時候,需要執行 git add。
git status
git status 以查看在你上次提交之後是否有修改。
我示範該指令的時候加了 -s 參數,以獲得簡短的結果輸出。如果沒加該參數會詳細輸出內容:
$ 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
執行 git diff 來查看執行 git status 的結果的詳細資訊。
git diff 指令顯示已寫入快取與已修改但尚未寫入快取的變更的差異。 git diff 有兩個主要的應用場景。
尚未快取的變更:git diff
檢視已快取的變更: git diff -- cached
查看已快取的與未快取的所有變更:git diff HEAD
顯示摘要而非整個diff:git diff --stat
在hello.php 檔案中輸入以下內容:
<?php echo 'php中文网:www.php.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中文网:www.php.cn'; +?>
git status 顯示你上次提交更新後的變更或寫入快取的改動, 而git diff 一行一行地顯示這些改動具體是啥。
接下來我們來查看下git diff --cached 的執行效果:
$ 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中文网:www.php.cn'; +?>
git commit
使用git add 指令將想要快照的內容寫入快取區, 而執行 git commit 將快取區內容加入倉庫。
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
現在我們已經記錄了快照。如果我們再執行 git status:
$ git status # On branch master nothing to commit (working directory clean)
以上輸出說明我們在最近一次提交之後,沒有做任何改動,是一個"working directory clean:乾淨的工作目錄"。
如果你沒有設定 -m 選項,Git 會嘗試為你開啟一個編輯器以填寫提交資訊。 如果 Git 在你對它的配置中找不到相關訊息,預設會開啟 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 檔案為以下內容:
<?php echo 'php中文网:www.php.cn'; echo 'php中文网:www.php.cn'; ?>
再執行以下指令:
git commit -am '修改 hello.php 文件' [master 71ee2cb] 修改 hello.php 文件 1 file changed, 1 insertion(+)
git reset HEAD
git reset HEAD 指令用於取消已快取的內容。
我們先改動文件README 文件,內容如下:
# php Git 测试 # php中文网
hello.php 檔案修改為:
<?php echo 'php中文网:www.php.cn'; echo 'php中文网:www.php.cn'; echo 'php中文网:www.php.cn'; ?>
現在兩個檔案修改後,都提交到了快取區,我們現在要取消其中一個的緩存,操作如下:
$ 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
現在你執行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
簡而言之,執行git reset HEAD 以取消先前git add 新增,但不希望包含在下一提交快照中的快取。
git rm
git rm 會將條目從快取區移除。這與 git reset HEAD 將條目取消快取是有區別的。 "取消快取"的意思就是將快取區恢復為我們做出修改之前的樣子。預設情況下,git rm file 會將檔案從快取區和你的硬碟中(工作目錄)刪除。
如果你要在工作目錄中留著該文件,可以使用git rm --cached:
如我們刪除hello.php文件:
$ git rm hello.php rm 'hello.php' $ ls README
不從工作區中刪除檔案:
$ git rm --cached README rm 'README' $ ls README
git mv
git mv 指令做得所有事情就是git rm --cached 指令的動作, 重新命名磁碟上的文件,然後再執行git add 把新文件加入到快取區。
我們先把剛移除的 README 加回來:
$ git add README
然後重新命名:
$ git mv README README.md $ ls README.md