git_chapter2_基礎(chǔ)

Chapter2 基礎(chǔ)

參考自 https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80

2.1 獲取項(xiàng)目的倉(cāng)庫(kù)

  1. 在工作目錄中初始化新倉(cāng)庫(kù)

    如果要對(duì)本地的某個(gè)項(xiàng)目進(jìn)行版本管理弦追,只需要導(dǎo)航到項(xiàng)目所在目錄檐薯,執(zhí)行如下指令:

    $ git init
    

    執(zhí)行完畢后,目錄下會(huì)出現(xiàn)一個(gè) .git 文件夾,所有 git 需要的數(shù)據(jù)和資源都保存在這個(gè)目錄中唆缴。

    接下來(lái),將項(xiàng)目中需要進(jìn)行版本管理的文件納入到 git 版本控制中:

    $ git add *.c
    $ git add README
    $ git commit -m 'initial project version'
    

    add 命令告訴 git, 該項(xiàng)目的那些文件需要被跟蹤管理。commit 命令則是將文件暫存區(qū)的文件快照保存到本地?cái)?shù)據(jù)庫(kù)中。

  2. 從現(xiàn)有倉(cāng)庫(kù)克隆

    如果相對(duì)某個(gè)開(kāi)源項(xiàng)目出份力择浊,可以先把該項(xiàng)目的 git 倉(cāng)庫(kù)復(fù)制一份出來(lái),這就需要用到 git clone 命令逾条。注意琢岩,這跟 svn 的 checkout 不一樣。 git clone 命令會(huì)克隆項(xiàng)目的所有歷史數(shù)據(jù)(每一個(gè)文件的每一個(gè)版本)师脂,而 checkout 只是拉取服務(wù)器上項(xiàng)目的最新版本担孔。

    克隆倉(cāng)庫(kù)的命令格式為 git clone [url], 比如江锨,要克隆 Ruby 語(yǔ)言的 git 代碼倉(cāng)庫(kù) Grit, 可以用下面的命令:

    $ git clone git://github.com/schacon/grit.git
    

    這個(gè)命令執(zhí)行后,會(huì)在當(dāng)前目錄下新建一個(gè) grit 目錄糕篇,其中包含一個(gè) .git 目錄啄育,用于保存下載下來(lái)的所有版本記錄,然后從中取出最新版本的文件拷貝拌消。

2.2 把跟新記錄到倉(cāng)庫(kù)

工作目錄中的文件不外乎是兩種狀態(tài):已跟蹤或未跟蹤挑豌。已跟蹤的文件是本來(lái)就被納入版本控制的文件,在上次快照中有它們的記錄拼坎,工作一段時(shí)間后,它們的狀態(tài)可能是 未更新完疫、已修改或已放入暫存區(qū)泰鸡;而其他所有文件都屬于未跟蹤。初次克隆某個(gè)倉(cāng)庫(kù)時(shí)壳鹤,工作目錄中的所有文件都屬于已跟蹤文件盛龄,且狀態(tài)都為未修改。

在編輯過(guò)某些文件之后芳誓,git 將這些文件標(biāo)記為已修改余舶。我們逐步把這些修改過(guò)的文件放到暫存區(qū)域,直到最后一次性提交所有這些暫存起來(lái)的文件锹淌,如此重復(fù)匿值。

使用 git 時(shí)的文件狀態(tài)變化周期如下圖所示:

文件的狀態(tài)變化周期
文件的狀態(tài)變化周期

檢查當(dāng)前文件狀態(tài)

使用 git status 命令可以查看哪些文件當(dāng)前處于什么狀態(tài)。

上一節(jié)我們 clone 了 grit 項(xiàng)目赂摆,在這個(gè)項(xiàng)目的根目錄新建一個(gè) README 文件挟憔。然后運(yùn)行 git status 將會(huì)看到以下輸出:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README

nothing added to commit but untracked files present (use "git add" to track)

在狀態(tài)報(bào)告中可以看出 README 出現(xiàn)在 "Untracked files" 下面。表示 README 還沒(méi)有被 git 跟蹤烟号。

跟蹤新文件

使用 git add 命令可以跟蹤一個(gè)新文件:

$ git add README

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README

可以看到 README 的狀態(tài)變成了 "Changes to be committed" 表示它變成了已暫存狀態(tài)绊谭。如果此時(shí)提交,那么該文件此時(shí)此刻的版本將被留存到歷史記錄里汪拥。其實(shí) git add 的潛臺(tái)詞就是把目標(biāo)文件的快照放到已暫存區(qū)域达传,也就是 add file into staged area,這就好理解后續(xù) add 操作的實(shí)際意義了迫筑。

暫存已修改文件

修改一下目錄下 benchmarks.rb 文件宪赶,再用 git status 查看一下當(dāng)前狀態(tài):

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README

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:   benchmarks.rb

可以看到 benchmarks.rb 被放到了 "Changes to be committed", 這說(shuō)明已跟蹤文件的內(nèi)容發(fā)生了變化,但還沒(méi)有放到暫存區(qū)脯燃。要把它放到暫存區(qū)的話逊朽,還是用之前的 git add 命令就好了,這個(gè)命令的執(zhí)行效果和上一小節(jié)一樣曲伊,就不展示了叽讳。

忽略某些文件

如果不希望某些文件納入 git 的管理追他。可以在 根目錄 創(chuàng)建一個(gè)名為 .gitignore 的文件岛蚤,列出要忽略的文件模式邑狸。

  • 所有空行或者以注釋符號(hào) # 開(kāi)頭的行都會(huì)被 git 忽略;
  • 匹配模式最后跟反斜杠 (/) 說(shuō)明要忽略的是目錄涤妒;
  • 要忽略指定模式以外的文件或目錄单雾,可以在模式前加上感嘆號(hào) (!) 取反;
  • 可以使用標(biāo)準(zhǔn) glob 模式匹配:
    • 星號(hào) * 匹配零個(gè)或多個(gè)任意字符她紫;
    • 問(wèn)號(hào) ? 只匹配一個(gè)任意字符硅堆;
    • [abc] 匹配方括號(hào)中的某個(gè)字符;
    • [0-9] 匹配所有 0 到 9 的數(shù)字贿讹;

下面是一個(gè) .gitignore 文件的例子:

# 這行是注釋

# 忽略所有 .a 結(jié)尾的文件
*.a

# 但 lib.a 除外
!lib.a

# 只忽略根目錄下的 TODO.txt 文件渐逃,不包括子目錄
/TODO.txt

# 會(huì)忽略 doc/*.txt 但不包括子目錄
doc/*.txt

# 忽略 doc 目錄下所有 *.txt 文件
doc/**/*.txt

# 忽略 build/ 目錄下的所有文件
build/

查看具體修改

修改包括兩方面:工作目錄的修改(相對(duì)于暫存區(qū));暫存區(qū)的修改(相對(duì)于倉(cāng)庫(kù))民褂;

要顯示工作目錄與暫存區(qū)文件之間的差異茄菊,可以使用 git diff 命令:

$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
           @commit.parents[0].parents[0].parents[0]
         end

+        run_code(x, 'commits 1') do
+          git.commits.size
+        end
+
         run_code(x, 'commits 2') do
           log = git.commits('master', 15)
           log.size

要顯示暫存區(qū)與已提交文件之間的差異,可以使用 git diff --staged(或者用舊版 git diff --cached):

$ git diff --cached
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README2
@@ -0,0 +1,5 @@
+grit
+ by Tom Preston-Werner, Chris Wanstrath
+ http://github.com/mojombo/grit
+
+Grit is a Ruby library for extracting information from a Git repository

提交更新

提交更新使用如下指令:

$ git commit

上述會(huì)喚起編輯器來(lái)讓你輸入提交日志赊堪。也可以在后面加上 -m 參數(shù)寫(xiě)上簡(jiǎn)單日志:

$ git commit -m "some log text"

git commit 會(huì)將暫存區(qū)中的文件提交到倉(cāng)庫(kù)中面殖。如果想要省略 git add 直接把工作目錄的文件修改提交到倉(cāng)庫(kù),可以使用 -a 選項(xiàng):

$ git commit -a -m "skip git add"

移除文件

從倉(cāng)庫(kù)中移除一個(gè)文件哭廉,或者說(shuō)不再跟蹤某個(gè)文件脊僚,需要兩個(gè)步驟:

  1. 將文件從暫存區(qū)中移除,使用 git rm 命令遵绰,這個(gè)文件會(huì)從工作目錄中刪除吃挑,并不再被 Git 跟蹤;

  2. 將移除操作提交到倉(cāng)庫(kù)街立,使用 git commit 命令舶衬;

    $ git mv file_from file_to
    

    實(shí)際上它相當(dāng)于

    $ mv README.txt README
    $ git rm README.txt
    $ git add README
    

如果不想刪掉工作目錄中的文件,僅是移除 git 對(duì)文件的跟蹤赎离,可以使用 --cached 選項(xiàng):

$ git rm --cached readme.txt

git rm 指令后面也可以接 glob 模式匹配逛犹,下述指令將刪除 log/ 目錄下所有 .log 文件:

$ git rm log/\*.log

移動(dòng)文件

要進(jìn)行文件移動(dòng)操作,使用如下命令:

$ git mv file_from file_to

實(shí)際上它相當(dāng)于

$ mv README.txt README
$ git rm README.txt
$ git add README

2.3 查看提交歷史

提交了若干更新后梁剔,可以用 git log 命令查看虽画,它還有一些有空的選項(xiàng),具體可以參考 原文

除了使用 git log 指令荣病,還可以在 bash 里輸入 gitk, 打開(kāi) gitk 可視化工具來(lái)查看码撰。

2.4 撤銷操作

這一節(jié)介紹撤銷操作相關(guān)的命令。

撤銷最后一次提交

有的時(shí)候提交完了才發(fā)現(xiàn)有些文件沒(méi)有提交个盆,或者提交信息寫(xiě)錯(cuò)了脖岛。想要重寫(xiě)剛剛的提交操作朵栖,可以使用 --amend 選項(xiàng)來(lái)重新提交:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

如上,第一次提交時(shí)忘記了一個(gè)文件柴梆,通過(guò) git add 加上那個(gè)文件之后陨溅,再次使用 --amend 來(lái)提交。這樣做的話最后只會(huì)產(chǎn)生一次提交绍在,并且你有機(jī)會(huì)重寫(xiě)提交日志门扇。

取消已經(jīng)暫存的文件

如果不小心執(zhí)行了 git add 命令,把不想提交的代碼也提交到了暫存區(qū)偿渡,這個(gè)時(shí)候可以看一下 git status 中給出的恢復(fù)提示:

$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.txt
        modified:   benchmarks.rb

如上臼寄,根據(jù)提示,只要執(zhí)行 git reset HEAD <file> 命令溜宽,就可以取消已經(jīng)暫存的文件吉拳。

取消對(duì)文件的修改

如果修改了工作目錄中的文件,想會(huì)退到未修改之前的狀態(tài)坑质,這個(gè)時(shí)候可以看一下 git status 給出的提示:

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:   benchmarks.rb

如上合武,根據(jù)提示临梗,只要執(zhí)行 git checkout -- <file> 命令涡扼,就可以會(huì)退到未修改時(shí)的版本。

2.5 遠(yuǎn)程倉(cāng)庫(kù)的使用

遠(yuǎn)程倉(cāng)庫(kù)是指托管在網(wǎng)絡(luò)上的項(xiàng)目倉(cāng)庫(kù)盟庞,關(guān)于這部分的知識(shí)還沒(méi)有理解透徹吃沪,這里先記下操作方法,在實(shí)踐中繼續(xù)領(lǐng)會(huì)什猖。

查看當(dāng)前的遠(yuǎn)程倉(cāng)庫(kù):

要查看當(dāng)前配置有哪些遠(yuǎn)程倉(cāng)庫(kù)票彪,可以使用 git remote 命令。它會(huì)列出每個(gè)遠(yuǎn)程倉(cāng)庫(kù)的名字:

$ git clone git://github.com/schacon/ticgit.git
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

git remote -v 可以顯示出對(duì)應(yīng)的地址:

$ git remote -v
origin  git://github.com/schacon/ticgit.git (fetch)
origin  git://github.com/schacon/ticgit.git (push)

添加遠(yuǎn)程倉(cāng)庫(kù)

要添加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù)不狮,使用 git remote add [shortname] [url] 命令降铸,其中的 shortname 是為遠(yuǎn)程倉(cāng)庫(kù)取的別名。

$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin  git://github.com/schacon/ticgit.git
pb  git://github.com/paulboone/ticgit.git

抓取遠(yuǎn)程倉(cāng)庫(kù)中的數(shù)據(jù)

上述指令只是將遠(yuǎn)程倉(cāng)庫(kù)的 url 存在了本地摇零,并為它取了一個(gè)別名推掸,并沒(méi)有拉取倉(cāng)庫(kù)的數(shù)據(jù)。要拉取數(shù)據(jù)驻仅,使用 git fetch [shortname] 指令:

$ git fetch pb
remote: Counting objects: 58, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 44 (delta 24), reused 1 (delta 0)
Unpacking objects: 100% (44/44), done.
From git://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

可以看到谅畅, pb 倉(cāng)庫(kù)里有兩個(gè)新分支, master 和 ticgit.

需要注意的是 fetch 命令只是將遠(yuǎn)程倉(cāng)庫(kù)中的數(shù)據(jù)拉取到本地噪服,并不會(huì)自動(dòng)合并到當(dāng)前工作分支(也就是說(shuō)只是把數(shù)據(jù)存到了本地倉(cāng)庫(kù)里毡泻,并沒(méi)有把數(shù)據(jù)提取到工作目錄中)。

如果設(shè)置了某個(gè)分支用于跟蹤某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的分支粘优〕鹞叮可以使用 git pull 命令抓取數(shù)據(jù)呻顽,并將數(shù)據(jù)合并到本地倉(cāng)庫(kù)的當(dāng)前分支。實(shí)際上邪铲,默認(rèn)情況下 git clone 命令本質(zhì)上就是自動(dòng)創(chuàng)建了本地的 master 分支用于跟蹤遠(yuǎn)程倉(cāng)庫(kù)中的 master 分支(假設(shè)遠(yuǎn)程倉(cāng)庫(kù)確實(shí)有 master 分支)芬位。所以一般我們運(yùn)行 git pull,目的都是要從原始克隆的遠(yuǎn)端倉(cāng)庫(kù)中抓取數(shù)據(jù)后带到,合并到工作目錄的當(dāng)前分支昧碉。

推送數(shù)據(jù)到遠(yuǎn)程倉(cāng)庫(kù)

要將本地倉(cāng)庫(kù)中的數(shù)據(jù)推送到遠(yuǎn)程倉(cāng)庫(kù),可以使用 git push [remote-name] [branch-name]揽惹。如果我們要把本地的 master 分支推動(dòng)到 origin 服務(wù)器上被饿,可以使用如下命令:

$ git push origin master

查看遠(yuǎn)程倉(cāng)庫(kù)信息

你可以使用 git remote show [remote-name] 命令來(lái)查看某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的信息。

$ git remote show origin
* remote origin
  URL: git://github.com/schacon/ticgit.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branches
    master
    ticgit

遠(yuǎn)程倉(cāng)庫(kù)的刪除和重命名

使用 git remote rename 可以修改遠(yuǎn)程倉(cāng)庫(kù)的別名:

$ git remote rename pb paul
$ git remote
origin
paul

使用 git remote rm 命令可以移除不需要的遠(yuǎn)程倉(cāng)庫(kù):

$ git remote rm paul
$ git remote
origin

2.6 打標(biāo)簽

顯示已有標(biāo)簽

使用 git tag 可以顯示已有的標(biāo)簽:

$ git tag
v0.1
v1.3

新建標(biāo)簽

Git 使用的標(biāo)簽有兩種類型:輕量級(jí)的(lightweight) 和 含附注的(annotated)搪搏。我們一般推薦后者狭握,因?yàn)樗軌驍y帶更詳細(xì)的信息。

含附注的標(biāo)簽

要?jiǎng)?chuàng)建含附注的標(biāo)簽疯溺,只需要加上 -a 參數(shù)即可:

$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

輕量級(jí)標(biāo)簽

直接輸入標(biāo)簽名论颅,即可創(chuàng)建輕量級(jí)標(biāo)簽:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市囱嫩,隨后出現(xiàn)的幾起案子恃疯,更是在濱河造成了極大的恐慌,老刑警劉巖墨闲,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件今妄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸳碧,警方通過(guò)查閱死者的電腦和手機(jī)盾鳞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞻离,“玉大人腾仅,你說(shuō)我怎么就攤上這事√桌” “怎么了推励?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)日裙。 經(jīng)常有香客問(wèn)我吹艇,道長(zhǎng),這世上最難降的妖魔是什么昂拂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任受神,我火速辦了婚禮,結(jié)果婚禮上格侯,老公的妹妹穿的比我還像新娘鼻听。我一直安慰自己财著,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布撑碴。 她就那樣靜靜地躺著撑教,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醉拓。 梳的紋絲不亂的頭發(fā)上伟姐,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音亿卤,去河邊找鬼愤兵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛排吴,可吹牛的內(nèi)容都是我干的秆乳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钻哩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屹堰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起街氢,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扯键,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阳仔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忧陪,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扣泊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年近范,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片延蟹。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡评矩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阱飘,到底是詐尸還是另有隱情斥杜,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布沥匈,位于F島的核電站蔗喂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏高帖。R本人自食惡果不足惜缰儿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望散址。 院中可真熱鬧乖阵,春花似錦宣赔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至对蒲,卻和暖如春钩蚊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹈矮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工两疚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人含滴。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓诱渤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谈况。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勺美,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容