如何使用git命令管理本地項目

如何使用git命令管理本地項目

創建版本庫

版本庫即repository,這個目錄下的所有文件都可以被git管理,每個文件的修改刪除,git都能跟蹤,以便任何時候都能追蹤歷史,還原至某一版本。
首先需要在本機創建一個專門的文件夾用來當作repository

$ mkdir repository
$ cd repository

然後通過git init命令將倉庫變成git可以管理的倉庫,成功之後就會生成一個.git隱藏文件目錄

$ git init
Initialized empty Git repository in /Users/_why/repository/.git/

並不一定是要使用空文件夾作爲起始repository,完全可以用一個項目作爲起始repository,這裏使用空的是避免個人學習時候搞壞項目。

添加文件至版本庫

首先這裏再明確一下,所有的版本控制系統,其實只能跟蹤文本文件的改動,比如TXT文件,網頁,所有的程序代碼等等,git也不例外。版本控制系統可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統不知道,也沒法知道。
一個合格的項目至少要有一個readme.md文件,內容如下:

my first git repository.
i feel fucking good.

該文件可以在我們本地repository文件夾的任何地方,除了之前說的.git隱藏文件夾。
這個時候我們要將該文件加入到repository

$ git add readme.md

然後要使用命令提交到repository

$ git commit -m 'i wrote my first readme.md'
[master (root-commit) d5f1491] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.md

這裏的git commit -m 中的 -m 參數是本次提交的說明
任何一次成功的commit 都必須將 需要提交的文件都 add 進repository

可以一次將多個文件加入到repository

$ git add file1.txt file2.txt file3.txt

改動追蹤

這個時候我們對readme.md 做一些改動

my first git repository.
i feel fucking good.
i made some changes in readme.me

然後運行 git status 命令:

$ git status
On branch master
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:   readme.md

no changes added to commit (use "git add" and/or "git commit -a")

這裏git 會告訴我們我們將加入本地repository的文件 改動了哪些
如果想要具體看改動了寫什麼東西,可以運行 git diff

$ git diff
diff --git a/readme.md b/readme.md
index dfe9329..770654e 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,3 @@
 my first git repository.
 i feel fucking good.
+i made some changes in readme.md

這次提交仍然需要兩步 git add readme.mdgit commit

git add readme.md
git commit -m "some changes"
[master 52cece9] some changes
 1 file changed, 1 insertion(+)

這個時候我們再用 git status 查看,就會告訴我們當前已是最新版本

$ git status
On branch master
nothing to commit, working directory clean

版本回退

實際開發過程中,我們可能對項目工程做了若干次提交,這個時候想要看我所有提交做的改變使用 git log 命令

$ git log
Author: HeapStakk <heapstakk@gmail.com>
Date:   Tue Aug 9 17:55:48 2016 +0800

    some changes

commit db9ee49571799e483242c04621f4bbcc2061dfde
Author: HeapStakk <heapstakk@gmail.com>
Date:   Tue Aug 9 17:39:48 2016 +0800

    i wrote my first readme.md

commit af62a67628018b7119e9b63aa59ef52ce8a32663
Author: HeapStakk <heapstakk@gmail.com>
Date:   Tue Aug 9 17:36:06 2016 +0800

    add 3 files

commit 7e6912a5c4f8ef307707e5fbd90a84d2d21bcc7f
Author: _why <_why@why.local>
Date:   Tue Aug 9 17:32:53 2016 +0800

按照提交日期的最新至最遠排序。
如果覺得這種排列方式看的不好可以嘗試加入 --pretty=oneline 參數

$ git log --pretty=oneline
52cece995a1b2c9b14f19b6b154ee6c39e1aafdd some changes
db9ee49571799e483242c04621f4bbcc2061dfde i wrote my first readme.md
af62a67628018b7119e9b63aa59ef52ce8a32663 add 3 files
7e6912a5c4f8ef307707e5fbd90a84d2d21bcc7f wrote a readme file

看到一大串 52cec...aafdd 則是版本好,這是利用SHA1計算出來的。
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交52cec...aafdd (注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。

現在我們會退至上一個版本

$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed

然後再使用 git log --pretty=oneline 查看

git log --pretty=oneline
db9ee49571799e483242c04621f4bbcc2061dfde i wrote my first readme.md
af62a67628018b7119e9b63aa59ef52ce8a32663 add 3 files
7e6912a5c4f8ef307707e5fbd90a84d2d21bcc7f wrote a readme file

發現確實會退到上個版本
但是我回退後就後悔了,我想回到上個版本怎麼辦?
如果當前命令行還沒有關閉,可以使用HEAD值進行回退
我之前最新版本你HEAD值爲 52cec...aafdd 我們不一定要寫全

$ git reset --hard 52cec
HEAD is now at 52cece9 some changes

好的 我們再用 git log --pretty-oneline 看看吧

$ git log --pretty=oneline
52cece995a1b2c9b14f19b6b154ee6c39e1aafdd some changes
db9ee49571799e483242c04621f4bbcc2061dfde i wrote my first readme.md
af62a67628018b7119e9b63aa59ef52ce8a32663 add 3 files
7e6912a5c4f8ef307707e5fbd90a84d2d21bcc7f wrote a readme file

但是如果我們回退之後直接關掉了命令行工具,怎麼辦,可以使用 git relog 查看

git reflog
db9ee49 HEAD@{0}: reset: moving to HEAD^
52cece9 HEAD@{1}: reset: moving to 52cec
db9ee49 HEAD@{2}: reset: moving to HEAD^
52cece9 HEAD@{3}: commit: some changes
db9ee49 HEAD@{4}: commit: i wrote my first readme.md
af62a67 HEAD@{5}: commit: add 3 files
7e6912a HEAD@{6}: commit (amend): wrote a readme file
d5f1491 HEAD@{7}: commit (initial): wrote a readme file

這裏我們按照我們的操作順序,我們可以看到 我們最新的版本應該是 52cec...aafdd
這次我們就可以再次成功的恢復之前的操作了。

移除文件

我們通常可以直接從文件目錄裏移除沒用的文件

$ rm readme.md

這個時候使用 git status ,git 就會提示哪些文件被刪除

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    readme.md
#
no changes added to commit (use "git add" and/or "git commit -a")

現在有兩個選擇,一個是我確實要移除,另外個是我刪錯了。
前者使用 git rm 刪除掉,並且 git commit

$ git rm readme.md
rm 'readme.md'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 readme.me

後者則是恢復誤刪除文件 git checkout

$ git checkout -- readme.md

git本地暫存區

git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
工作區(Working Directory)
就是你在電腦裏能看到的目錄,比如我的repository文件夾就是一個工作區

版本庫(Repository)
工作區有一個隱藏目錄.git,這個不算工作區,而是git的版本庫。
git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
這裏寫圖片描述
前面講了我們把文件往git版本庫裏添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因爲我們創建git版本庫時,git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解爲,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
俗話說,實踐出真知。現在,我們再練習一遍,先對readme.txt做個修改,比如加上一行內容:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

然後,在工作區新增一個LICENSE文本文件(內容隨便寫)。
先用git status查看一下狀態:

$ git status
# On branch master
# 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:   readme.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       LICENSE
no changes added to commit (use "git add" and/or "git commit -a")

git非常清楚地告訴我們,readme.txt被修改了,而LICENSE還從來沒有被添加過,所以它的狀態是Untracked

現在,使用兩次命令git add,把readme.txtLICENSE都添加後,用git status再查看一下:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   LICENSE
#       modified:   readme.txt
#

現在,暫存區的狀態就變成這樣了
這裏寫圖片描述
所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章