Latest web development tutorials

Git 基本操作

Git 的工作就是創建和保存你項目的快照及與之後的快照進行對比。 本章將對有關創建與提交你的項目快照的命令作介紹。


獲取與創建項目命令

git init

用git init 在目錄中創建新的Git 倉庫。 你可以在任何時候、任何目錄中這麼做,完全是本地化的。

在目錄中執行git init,就可以創建一個Git 倉庫了。 比如我們創建w3big 項目:

$ mkdir w3big
$ cd w3big/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/w3big/.git/
# 在 /www/w3big/.git/ 目录初始化空 Git 仓库完毕。

現在你可以看到在你的項目中生成了.git 這個子目錄。 這就是你的Git 倉庫了,所有有關你的此項目的快照數據都存放在這裡。

ls -a
.	..	.git

git clone

使用git clone 拷貝一個Git 倉庫到本地,讓自己能夠查看該項目,或者進行修改。

如果你需要與他人合作一個項目,或者想要復制一個項目,看看代碼,你就可以克隆那個項目。 執行命令:

 git clone [url]

[url] 為你想要復制的項目,就可以了。

例如我們克隆Github 上的項目:

$ git clone [email protected]: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># w3big 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 '本教程:www.w3big.com';
?>
$ 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 '本教程:www.w3big.com';
+?>

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 @@
+# w3big 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 '本教程:www.w3big.com';
+?>

git commit

使用git add 命令將想要快照的內容寫入緩存區, 而執行git commit 將緩存區內容添加到倉庫中。

Git 為你的每一個提交都記錄你的名字與電子郵箱地址,所以第一步需要配置用戶名和郵箱地址。

$ git config --global user.name 'w3big'
$ git config --global user.email [email protected]

接下來我們寫入緩存,並提交對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 '本教程:www.w3big.com';
echo '本教程:www.w3big.com';
?>

再執行以下命令:

git commit -am '修改 hello.php 文件'
[master 71ee2cb] 修改 hello.php 文件
 1 file changed, 1 insertion(+)

git reset HEAD

git reset HEAD 命令用於取消已緩存的內容。

我們先改動文件README 文件,內容如下:

# w3big Git 测试
# 本教程 

hello.php 文件修改為:

<?php
echo '本教程:www.w3big.com';
echo '本教程:www.w3big.com';
echo '本教程:www.w3big.com';
?>

現在兩個文件修改後,都提交到了緩存區,我們現在要取消其中一個的緩存,操作如下:

$ 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