摘要:本篇文章將記錄git常用命令介紹和使用,主要包括clone、init、add、mv、reset、rm、log、status、branch、checkout、commit、fetch、pull、push。
clone:克隆一個倉庫到新目錄
從遠程主機克隆一個版本庫。
$ gitclone<版本庫的網址>
比如版本庫網址為https://github.com/naffitary/gitstudy.git。
$ gitclonehttps://github.com/naffitary/gitstudy.git
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名 。
如果要指定不同的目錄名,可以將目錄名作為git clone命令的第二個參數。
$ git clone<版本庫的網址><本地目錄名>
比如
$ gitclonehttps://github.com/naffitary/gitstudy.git project.git
該命令會在當前目錄下生成project.git 內容從版本庫的網址中克隆。
git clone支持多種協議,除了HTTP(s)以外,還支持SSH、Git、本地文件協議等。
init:創建一個空的Git倉庫或重新初始化現有的Git倉庫
運用mkdir命令創建一個git目錄
$mkdirproject.git
創建了project.git 目錄,但沒有輸出。
切換到xxx.git目錄(這里我用的是project)下
$cdproject.git/
切換到project.git目錄下,沒有輸出。
顯示目標列表,跟后面產生對比
$ls
沒有輸出。
初始化倉庫
$ git--bare init
輸出Initialized empty Git repository in D:/php相關/git/Git/project.git/,表示初始化完畢,沒有出錯。而且project.git 目錄會有bare標志,顯示為project.git (BARE:master)
再次顯示目標列表,跟前面產生對比
$ls
輸出project.git 下的目標列表config description HEAD hooks/ info/ objects/ refs/
add: 添加文件內容到索引
git add , 只將那些創建或修改并且沒有被刪除的文件添加到索引,其中可以是文件,也可以是目錄。(aa就是我建的一個目錄。)
$gitaddaa
這里我遇到一個問題,正確add任何存在的文件會提示錯誤信息,其它git所屬命令(除init)也會提示錯誤信息:fatal: This operation must be run in a work tree。通過查找資料和實踐發現,可能是我創建的是空倉庫的緣故,在git --bare init之后,先后輸入git init和git remote add origin命令然后git add aa,就可以正確添加了。
git add -u ,把中所有跟蹤文件中被修改過或已刪除文件的信息添加到索引庫。 它不會處理沒有跟蹤的文件。
$gitadd-u? aa
git add -A ,把中所有跟蹤文件中被修改過或已刪除文件和所有未跟蹤的文件信息添加到索引庫。
比如,$git add -A aa
git add -i , 查看中被所有修改過或已刪除文件但沒有提交的文件,
并通過其revert子命令可以查看中所有未跟蹤的文件,同時進入一個子命令系統。
比如
$gitadd -iaa
git add --all,添加當前目錄下的所有的目錄和文件。
$ gitadd--all
以上前4點,都可以用.表示路徑path,表示當前目錄。$git add .,$ git add -u. ,$ git add -A .,$ git add -i .。
比如 輸入
$ gitadd-i .
輸出以下信息。
staged? ? unstaged path
1:? ? ? ? +1/-0+0/-0gitstudy
*** Commands ***
1:status2: update3:revert4: add untracked
5: patch6:diff7:quit8: help
選擇子命令command(注意:可以輸入序號,也可以輸入命令單詞),命令1是狀態,顯示路徑上的變化;命令2是更新,將工作狀態樹添加到更改組 ;命令3是還原,還原更改組到頭版本;命令4是添加未跟蹤,添加未跟蹤文件的內容到更改組;命令5是修補程序即補丁,挑選可行的以及選擇性更新;命令6是差異, 比較單個文件或者目錄內容;命令7是退出,退出該命令選項;命令8是幫助,顯示其他命令的作用,幫助使用。
mv:移動或重命名文件,目錄或符號鏈接
用$ ls查看當前目錄下的文件和目錄,可以看看準備移動的文件存不存在,為后面操作做準備。可以看到當前目錄下有以下文件和目錄11.txt aa/ pro.git/ README.md。
移動11.txt到aa目錄下:
$ git mv11.txtaa
移動完后,查看一下狀態,看看有沒有移動成功。
$ git status-s
可以看到狀態結果如下:
Aaa/11.txt
?? pro.git/
或者再用$ ls查看當前目錄下的文件和目錄,可以看到,當前目錄下文件和目錄為aa/ pro.git/ README.md,aa目錄下多了11.txt,也能說明移動成功。
reset: 將當前HEAD復位為指定狀態
如果發現錯誤的將不想staging的文件add進入index之后,想回退取消,則可以使用如下命令:
gitresetHEAD...
同時git add完畢之后,git也會做相應的提示。
git reset[--mode ][或HEAD]
將當前的分支重設(reset)到指定的或者HEAD(如果不顯示指定commit,默認是HEAD,即最新的一次提交)。mode的取值可以是hard、mixed。
gitreset--hard
重設index和working directory,自從以來在working directory中的任何改變都被丟棄,并把HEAD指向。
gitreset--mixed
僅重設index,但是不重設working directory。這個模式是默認模式,即當不顯示告知git reset模式時,會使用mixed模式。這個模式的效果是,working directory中文件的修改都會被保留,不會丟棄,也不會被標記成"Changes to be committed"。
rm:從工作樹和索引中刪除文件
使用格式:
git rm [] [--] ...
-n, --dry-run? ? ? ? ? 干運行
-q, --quiet? ? ? ? ? ? ? 不列出刪除的文件
--cached? ? ? ? ? ? ? ? 只能從索引中刪除
-f, --force? ? ? ? ? ? ? ? 覆蓋最新的檢查
-r? ? ? ? ? ? ? ? ? ? ? ? ? ? 允許遞歸刪除
--ignore-unmatch? ? 退出零狀態即使沒有匹配
注意:$ git rm文件名 ,必須在跟蹤并提交到倉庫中即add和commit后,才能刪除。如果是已提交并修改后的文件和目錄,需要用git commit -a -m文件名或git commit -a選擇提交,不然會提示錯誤信息,error: the following file has local modifications:文件在本地被修改了。直接用git commit -m文件名或git commit選擇提交是無法正常刪除的,因為雖然沒有提示錯誤信息但實際上并沒有commit成功。
log:顯示提交日志
不帶參數,會顯示所有的歷史記錄
$gitlog
按時間輸出,最近的在最上面,
commit8deb05890c4a3d3a5da0085e8d93fde6a8105076 (HEAD->master, origin/master, origin/HEAD)
Author: naffitary <2219165492@qq.com>
Date:? Wed Jul513:32:372017+0800
Initialcommit
帶參數-p,按補丁顯示每個更新間的差異。
commit8deb05890c4a3d3a5da0085e8d93fde6a8105076 (HEAD->master, origin/master, origin/HEAD)
Author: naffitary <2219165492@qq.com>
Date:? Wed Jul513:32:372017+0800
Initialcommit
diff--git a/README.md b/README.md
newfilemode100644
index0000000..a077ed0
--- /dev/null
+++ b/README.md
@-0,0+1@@
+# gitstudy
\Nonewlineatendoffile
帶參數--stat,顯示每次更新的修改文件的統計信息,每個提交都列出了修改過的文件,以及其中添加和移除的行數,并在最后列出所有增減行數小計
$ git status-s
輸出信息沒有-p命令詳細。
AD aa/gitstudy.git
??11.txt
??? pro.git
status:顯示工作樹狀態
輸出詳細狀態信息用$ git status,輸出簡短狀態信息用$ git status -s。
branch:列表,創建或刪除分支
git branch命令的-r選項,可以用來查看遠程分支。
$ gitbranch-r
輸出
origin/master
-a選項查看所有分支。
$ gitbranch-a
輸出
*master
remotes/origin/master
上面命令表示,本地主機的當前分支是master,遠程分支是origin/master。
checkout:切換分支或恢復工作樹文件
使用git checkout命令創建一個新的分支。
$ git checkout -bnewBrachorigin/master
上面命令表示,在origin/master的基礎上,創建一個新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并遠程分支。
$ git merge origin/master
或者
$git rebase origin/master
上面命令表示在當前分支上,合并origin/master。
commit:將更改記錄添加到倉庫中
注意:養成在一開始就輸入以下命令,來事先設置郵箱和用戶名,以防遠程操作的命令出錯。
$ gitconfig--global user.email “2219165492@qq.com”
$ gitconfig--global user.name “naffitary”
$git commit? -m"提交的描述信息"
如果我們這里不用-m參數的話,即$ git commit;git將調到一個文本編譯器(通常是vim)來讓你輸入提交的描述信息,前面有#將會被無視,若想被commit去掉前面的#并ZZ或:wq保存并退出,git commit -a也是如此。
$ git commit -a-m"提交的描述信息"
git commit命令的-a選項可只將所有被修改或者已刪除的且已經被git管理的文檔提交到倉庫中。如果只是修改或者刪除了已被Git管理的文檔,是沒必要使用git add命令的。
git add .命令除了能夠判斷出當前目錄(包括其子目錄)所有被修改或者已刪除的文檔,還能判斷用戶所添加的新文檔,并將其信息追加到索引中。
$ gitcommit--amend
對于已經修改提交過的注釋,如果需要修改,可以借助git commit --amend來進行。
fetch:從另一個存儲庫下載對象和引用
將遠程主機的版本庫的更新(Git術語叫做commit)取回本地。默認情況下,git fetch取回所有分支(branch)的更新。
$ git fetch<遠程主機名>
比如,
$git fetch origin
如果只想取回特定分支的更新,可以指定分支名。
$ git fetch<遠程主機名><分支名>
比如,
$ git fetch originmaster
pull:從另一個存儲庫或本地分支中拉取并集成
取回遠程主機某個分支的更新,再與本地的指定分支合并。
$ git pull<遠程主機名><遠程分支名>:<本地分支名>
比如,取回origin主機的next分支,與本地的master分支合并:
$ git pull originnext:master
如果遠程分支是與當前分支合并,則冒號后面的部分可以省略。
$git pull originnext
上面命令表示,取回origin/next分支,再與當前分支合并。實質上,這等同于先做git fetch,再做git merge。
$git fetch origin
$git merge origin/next
如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名。
$git pull origin
上面命令表示,本地的當前分支自動與對應的origin主機”追蹤分支”進行合并。
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
$git pull
上面命令表示,當前分支自動與唯一一個追蹤分支進行合并。
push:推送更新遠程引用以及關聯的對象
將本地分支的更新,推送到遠程主機。
$ git push<遠程主機名><本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,所以git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。
如果省略遠程分支名,則表示將本地分支推送與之存在”追蹤關系”的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
$ gitpushoriginmaster
上面命令表示,將本地的master分支推送到origin主機的master分支。如果后者不存在,則會被新建。
如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同于推送一個空的本地分支到遠程分支。
$ gitpushorigin:master
等同于
$ gitpushorigin--deletemaster
上面命令表示刪除origin主機的master分支。
如果當前分支與遠程分支之間存在追蹤關系,則本地分支和遠程分支都可以省略。
$ gitpushorigin
上面命令表示,將當前分支推送到origin主機的對應分支。
如果當前分支只有一個追蹤分支,那么主機名都可以省略。
$ gitpush
如果當前分支與多個主機存在追蹤關系,則可以使用-u選項指定一個默認主機,這樣后面就可以不加任何參數使用git push。
$ gitpush-uoriginmaster
上面命令將本地的master分支推送到origin主機,同時指定origin為默認主機,后面就可以不加任何參數使用git push了。不帶任何參數的git push,默認只推送當前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有對應的遠程分支的本地分支。如果要修改這個設置,可以采用git config命令。
$ gitconfig--global push.defaultmatching
或者
$ gitconfig--global push.defaultsimple
還有一種情況,就是不管是否存在對應的遠程分支,將本地的所有分支都推送到遠程主機,這時需要使用–all選項。
$git push --allorigin
上面命令表示,將所有本地分支都推送到origin主機。