一.創建版本庫
1.創建空目錄(這里目錄名為learngit)
$ mkdir learngit
2.進入目錄
$ cd learngit
3.顯示當前目錄
$ pwd
4.將當前目錄變為Git可以管理的倉庫
$ git init
.git
目錄是Git來跟蹤管理版本庫的,要放到Git倉庫的文件要放在該目錄或者其子目錄下
二.把文件添加到版本庫
1.在分支中新建文件(這里文件為readme.txt)
$ touch readme.txt
2.vim編輯文件
$ vi readme.txt
按 “i” 進入編輯,按 “esc” “:wq”保存並推出
3.把文件添加到倉庫
$ git add readme.txt
4.把文件提交到倉庫
$ git commit -m "wrote a readme file"
commit
可以一次提交很多文件,所以你可以多次add
不同的文件
Git告訴我們當前沒有需要提交的修改(nothing to commit
),而且,工作目錄是干凈(working tree clean)的。
三.修改文件、查看修改
1.查看倉庫當前的狀態(如:是否修改了文件、修改是否已提交、刪除了什么文件、沖突的文件等)
$ git status
2.查看具體修改了什么內容
$ git diff readme.txt
四.版本回退
每當你覺得文件修改到一定程度的時候,就可以“保存一個快照”,這個快照在Git中被稱為commit
。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個commit
恢復,然后繼續工作,而不是把幾個月的工作成果全部丟失。
1.查看提交日志的歷史記錄
$ git log
簡略版
$ git log --pretty=oneline
一大串類似1094adb...
的是commit id
(版本號)
在Git中,用HEAD
表示當前版本,最新的提交上一個版本是HEAD^
,
上上一個版本就是HEAD^^
2.回退到上一個版本
$ git reset --hard HEAD^
3.指定回到未來的某個版本
(1)只要上面的命令行窗口還沒有被關掉,你就可以順着往上找,找到那個未來版本的commit id,這里
是1094adb...
$ git reset --hard 1094a
(2)已經關閉了命令行,想恢復到新版本
- 查看命令日志的歷史記錄(為了找commit id)
$ git reflog
- 找到待恢復版本的commit id,用$ git reset --hard 1094a回到新版本
五.撤銷修改
1.丟棄工作區的修改
$ git checkout -- readme.txt
自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態
git checkout -- file
命令中的--
很重要,沒有--
,就變成了“切換到另一個分支”的命令
2.修改后已經git add
到暫存區,但是還沒有提交
$ git reset HEAD readme.txt
git reset
命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD
時,表示最新的版本。
接下來通過命令$ git checkout -- readme.txt
丟棄工作區的修改
3.已經提交到版本庫(前提是沒有推送到遠程庫)
想要撤銷本次提交,參考四.版本回退
六.刪除文件
1.從工作空間刪除文件(和直接在文件管理器刪除相同)
$ rm test.txt
2.從版本庫刪除文件
如果該文件已經提交到了版本庫,從工作空間刪除文件后,那么此時工作區和版本庫就不一致了
$ git rm test.txt 然后 $ git commit -m "remove test.txt"
文件就從版本庫中被刪除了
3.從版本庫恢復工作空間誤刪的文件
$ git checkout -- test.txt
git checkout
其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
注意:從來沒有被添加到版本庫就被刪除的文件,是無法恢復的!
補充概念:
1.工作區和暫存區:
在這里learngit
文件夾就是一個工作區。工作區的隱藏目錄.git
不算工作區,而是Git的版本庫
- 第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區; - 第二步是用
git commit
提交更改,實際上就是把暫存區的所有內容提交到當前分支。
2.Git管理的是修改,那么Git如何跟蹤修改
每次修改,如果不用git add
到暫存區,那就不會加入到commit
中。
- 第一次修改 ->
git add
-> 第二次修改 ->git commit
。當你用git add
命令后,在工作區的第一次修改被放入暫存區,准備提交,但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit
只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
- 第一次修改 ->
git add
-> 第二次修改 ->git add
->git commit
現在把第二次修改也提交了。
參考資料:廖雪峰老師博客