Git 基本操作

2022-03-23 16:02 更新

Git 的工作就是創(chuàng)建和保存你的項(xiàng)目的快照及與之后的快照進(jìn)行對(duì)比。本章將對(duì)有關(guān)創(chuàng)建與提交你的項(xiàng)目的快照的命令作介紹。


獲取與創(chuàng)建項(xiàng)目命令

git init

用 git init 在目錄中創(chuàng)建新的 Git 倉庫。 你可以在任何時(shí)候、任何目錄中這么做,完全是本地化的。

在目錄中執(zhí)行 git init,就可以創(chuàng)建一個(gè) Git 倉庫了。比如我們創(chuàng)建 w3cschoolcc 項(xiàng)目:

$ mkdir w3cschoolcc
$ cd w3cschoolcc
$ git init
Initialized empty Git repository in /www/w3cschoolcc/.git/
# 在 /www/w3cschoolcc/.git/ 目錄初始化空 Git 倉庫完畢。

現(xiàn)在你可以看到在你的項(xiàng)目目錄中有個(gè) .git 的子目錄。 這就是你的 Git 倉庫了,所有有關(guān)你的此項(xiàng)目的快照數(shù)據(jù)都存放在這里。

ls -a
.    ..  .git

git clone

使用 git clone 拷貝一個(gè) Git 倉庫到本地,讓自己能夠查看該項(xiàng)目,或者進(jìn)行修改。

如果你需要與他人合作一個(gè)項(xiàng)目,或者想要復(fù)制一個(gè)項(xiàng)目,看看代碼,你就可以克隆那個(gè)項(xiàng)目。 執(zhí)行命令:

 git clone [url]

[url] 為你想要復(fù)制的項(xiàng)目,就可以了。

例如我們克隆 Github 上的項(xiàng)目:

$ git clone git://github.com/schacon/simplegit.git
Initialized empty Git repository in /private/tmp/simplegit/.git/
remote: Counting objects: 100, done.
remote: Compressing objects: 100% (86/86), done.
remote: Total 100 (delta 35), reused 0 (delta 0)
Receiving objects: 100% (100/100), 9.51 KiB, done.
Resolving deltas: 100% (35/35), done.
$ cd simplegit/
$ ls
README   Rakefile lib

上述操作將復(fù)制該項(xiàng)目的全部記錄。

$ ls -a
.        ..       .git     README   Rakefile lib
$ cd .git
$ ls
HEAD        description info        packed-refs
branches    hooks       logs        refs
config      index       objects

默認(rèn)情況下,Git 會(huì)按照你提供的 URL 所指示的項(xiàng)目的名稱創(chuàng)建你的本地項(xiàng)目目錄。 通常就是該 URL 最后一個(gè) / 之后的項(xiàng)目名稱。如果你想要一個(gè)不一樣的名字, 你可以在該命令后加上你想要的名稱。


基本快照

Git 的工作就是創(chuàng)建和保存你的項(xiàng)目的快照及與之后的快照進(jìn)行對(duì)比。本章將對(duì)有關(guān)創(chuàng)建與提交你的項(xiàng)目的快照的命令作介紹。

git add

git add 命令可將該文件添加到緩存,如我們添加以下兩個(gè)文件:

$ touch README
$ touch hello.php
$ ls
README      hello.php
$ git status -s
?? README
?? hello.php
$ 

git status 命令用于查看項(xiàng)目的當(dāng)前狀態(tài)。

接下來我們執(zhí)行 git add 命令來添加文件:

$ git add README hello.php 

現(xiàn)在我們?cè)賵?zhí)行 git status,就可以看到這兩個(gè)文件已經(jīng)加上去了。

$ git status -s
A  README
A  hello.php
$ 

新項(xiàng)目中,添加所有文件很普遍,可以在當(dāng)前工作目錄執(zhí)行命令:git add .。

現(xiàn)在我們改個(gè)文件,再執(zhí)行一下 git status:

$ vim README
$ git status -s
AM README
A  hello.php

"AM" 狀態(tài)的意思是,這個(gè)文件在我們將它添加到緩存之后又有改動(dòng)。改動(dòng)后我們?cè)趫?zhí)行 git add 命令將其添加到緩存中:

$ git add .
$ git status -s
A  README
A  hello.php

當(dāng)你要將你的修改包含在即將提交的快照里的時(shí)候,需要執(zhí)行 git add。

git status

git status 以查看在你上次提交之后是否有修改。

我演示該命令的時(shí)候加了 -s 參數(shù),以獲得簡(jiǎn)短的結(jié)果輸出。如果沒加該參數(shù)會(huì)詳細(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 命令顯示已寫入緩存與已修改但尚未寫入緩存的改動(dòng)的區(qū)別。git diff 有兩個(gè)主要的應(yīng)用場(chǎng)景。

  • 尚未緩存的改動(dòng):git diff
  • 查看已緩存的改動(dòng): git diff --cached
  • 查看已緩存的與未緩存的所有改動(dòng):git diff HEAD
  • 顯示摘要而非整個(gè) diff:git diff --stat

在 hello.php 文件中輸入以下內(nèi)容:

<?php echo 'www.o2fo.com'; ?>
$ git status -s
A  README
AM hello.php
$ git diff
diff --git a/hello.php b/hello.php
index e69de29..d1a9166 100644
--- a/hello.php
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php +echo 'www.o2fo.com'; +?>

git status顯示你上次提交更新至后所更改或者寫入緩存的改動(dòng), 而 git diff 一行一行地顯示這些改動(dòng)具體是啥。

接下來我們來查看下 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..704cce7
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+w3cschool.cn
diff --git a/hello.php b/hello.php
new file mode 100644
index 0000000..d1a9166
--- /dev/null
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php +echo 'www.o2fo.com'; +?>

git commit

使用 git add 命令將想要快照的內(nèi)容寫入了緩存, 而執(zhí)行 git commit 記錄緩存區(qū)的快照。

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

$ git config --global user.name 'w3cschool'
$ git config --global user.email w3c@w3cschool.cn

接下來我們寫入緩存,并提交對(duì) hello.php 的所有改動(dòng)。在首個(gè)例子中,我們使用 -m 選項(xiàng)以在命令行中提供提交注釋。

$ git add hello.php
$ git status -s
A  README
A  hello.php
$ git commit -m 'test comment from w3cschool.cn'
[master (root-commit) 85fc7e7] test comment from w3cschool.cn
 2 files changed, 4 insertions(+)
 create mode 100644 README
 create mode 100644 hello.php
 

現(xiàn)在我們已經(jīng)記錄了快照。如果我們?cè)賵?zhí)行 git status:

 $ git status
# On branch master
nothing to commit (working directory clean)

以上輸出說明我們?cè)谧罱淮翁峤恢?,沒有做任何改動(dòng),是一個(gè)"干凈的工作目錄"。

如果你沒有設(shè)置 -m 選項(xiàng),Git 會(huì)嘗試為你打開一個(gè)編輯器以填寫提交信息。 如果 Git 在你對(duì)它的配置中找不到相關(guān)信息,默認(rèn)會(huì)打開 vim。屏幕會(huì)像這樣:

# 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 ..." to unstage) # # modified: hello.php # ~ ~ ".git/COMMIT_EDITMSG" 9L, 257C

如果你覺得 git add 提交緩存的流程太過繁瑣,Git 也允許你用 -a 選項(xiàng)跳過這一步。命令格式如下:

git commit -a

如:

$ git commit -am 'changes to hello file'
[master 78b2670] changes to hello file
 1 files changed, 2 insertions(+), 1 deletions(-)
 

git reset HEAD

git reset HEAD 命令用于取消緩存已緩存的內(nèi)容。

這里我們有兩個(gè)最近提交之后又有所改動(dòng)的文件。我們將兩個(gè)都緩存,并取消緩存其中一個(gè)。

$ 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 文件的改動(dòng),并不含現(xiàn)在并不在緩存中的 hello.rb。

git rm

git rm 將文件從緩存區(qū)中移除。

如我們刪除 hello.php文件:

 $ git rm hello.php 
rm 'hello.php'
$ ls
README

默認(rèn)情況下,git rm file 會(huì)將文件從緩存區(qū)和你的硬盤中(工作目錄)刪除。 如果要在工作目錄中留著該文件,可以使用命令:

 git rm --cached。

git mv

git mv 命令做得所有事情就是 git rm --cached, 重命名磁盤上的文件,然后再執(zhí)行 git add 把新文件添加到緩存區(qū)。因此,雖然有 git mv 命令,但它有點(diǎn)多余 。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)