使用git就是將本地文件(工做目錄workspace)的文件,添加到暫存區(stage),而後提交到本地倉庫(repository),最終能夠協同開發,推送到遠程倉庫(remote)git
git版本庫,也叫作git倉庫(repository),也就是一個文件夾。github
這個目錄的全部內容被git軟件管理,全部的修改,刪除,git都會跟蹤記錄,便於能夠跟蹤歷史記錄,之後能夠還原文件。web
兩種場景需求:django
1.把已有的項目代碼,歸入git管理app
cd mysite mysite項目所在代碼
git init 初始化git倉庫
git init命令會建立一個.git隱藏子目錄,這個目錄包含初始化git倉庫全部的核心文件。
此步僅僅是初始化,此時項目裏的代碼尚未被git跟蹤,所以還須要git add對項目文件跟蹤,而後git commit提交到本地倉庫
想知道.git文件作了什麼事,請看git原理 >Git 內部原理 ide
2.新建一個項目,直接用git管理gitlab
cd 某個文件夾
git init mysite 此步會在當前路徑建立mysite文件夾,mysite文件夾中包含了.git的初始化文件夾,全部配置
那麼.git文件夾中有什麼呢?post
[root@pyyuc ~/git_learning/mysite 11:08:19]#tree .git .git ├── branches ├── config 這個項目獨有的配置 ├── description ├── HEAD head文件指示目前被檢出的分支 ├── hooks hooks目錄包含服務端和客戶端的鉤子腳本 hook scripts │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── prepare-commit-msg.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ └── update.sample ├── index index文件保存暫存區的信息,只有git add以後纔會生成,默認尚未這個文件 ├── info info目錄是全局性排除文件,用於放置不想被記錄在.gitignore文件中的忽略模式(ignored patterns) │ └── exclude ├── objects 存儲全部數據內容 │ ├── info │ └── pack └── refs refs目錄存儲指向數據(分支)的提交對象的指針 ├── heads └── tags
3.獲取遠程倉庫代碼spa
若是你想獲取github上的代碼,或者你公司gitlab私有倉庫的代碼,可使用git clone命令,下載克隆遠程倉庫的代碼。指針
git clone https://github.com/django/django.git
你會發現全部的項目文件都在這裏,等待後續開發。
還記得git的四個區域嗎?本地文件夾,暫存區,本地倉庫,遠程倉庫嗎?
本地文件夾未初始化,git是不認識的
本地文件git init後,就成了git倉庫
請記住,在工做文件夾的每個文件,只有兩種狀態,一個是未跟蹤,一個是已跟蹤
已跟蹤的指的是已經被歸入git版本管理的文件,在git快照中有他的記錄
未跟蹤的是這個文件既不在git快照中,也不在暫存區
git init初始化時的工做文件夾,都屬於已跟蹤了,後續的編輯操做都會標記爲,已修改文件,所以須要將修改後的文件,加入暫存區,而後提交暫存區的文件。
git status 此命令查看git工做目錄的文件,處於生命週期的哪個狀態 注意,只能在git工做目錄中輸入這個命令,他會去找.git文件夾
第一次輸入git status會看到此狀態,沒有任何東西須要提交 [root@pyyuc ~/git_learning/mysite 12:00:34]#git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
說明當前工做目錄很乾淨,全部的已跟蹤文件,已經被提交且未更改。
此時處在master默認分支。
請看代碼
git init mysite 初始化git倉庫 git status 查看git狀態 echo 'print("掙了一個億")' > main.py 新建一個代碼文件,此時是未被git跟蹤的 git status 查看狀態 On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) main.py nothing added to commit but untracked files present (use "git add" to track)
git add main.py 開始跟蹤main.py文件
git status 此時再看已經被跟蹤,如今已經是能夠被提交的狀態,此時處於暫存區
git commit -m "echo main.py" 告訴git,把暫存區的main.py提交到本地倉庫
git log 查看剛纔的commit記錄
咱們仍是在git版本庫中操做 修改main.py爲mymain.py mv main.py mymain.py 查看狀態 git status
直接mv的操做,會被git記錄爲兩個形容,1、刪除原有文件、2、新建了mymain.py文件
此時新文件還未被跟蹤,須要git add , git commit
本來的main.py還須要從暫存區刪除
[root@pyyuc ~/mysite 14:57:57]#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: main.py # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # mymain.py no changes added to commit (use "git add" and/or "git commit -a")
git rm main.py 刪除暫存區的main.py
git commit -m "mv mymain.py" 提交新的mymain.py
這樣的步驟很麻煩,能夠直接git mv 命令便可
剛纔的mv記錄,能夠經過git log查看歷史記錄,已經提交的id
能夠經過git reset 回退歷史版本,回退到更名以前
[root@pyyuc ~/mysite 15:10:12]#git log commit f60fa7f1312843aa57edc9464192c9d891f23fb5 Author: pyyu <yc_uuu@163.com> Date: Sat Dec 22 15:08:02 2018 +0800 mv mymain.py commit 65e0a2239909fd5aabc5928ec4431de3f163a195 Author: pyyu <yc_uuu@163.com> Date: Sat Dec 22 14:51:07 2018 +0800 echo main.py 回退到上一次commit版本,(注意這個命令,很危險,慎用) git reset --hard 65e0a2239909fd5aabc5928ec4431de3f163a195 --hard 清空暫存區和工做目錄資料
更名最正確的姿式
git mv main.py mymain.py git commit -m "mv mymain.py"
在咱們使用git的時候,會對代碼文件不停的修改,不斷的提交到代碼倉庫。
這個就如同咱們打遊戲時候,保存關卡記錄的操做。
在打boss以前,先作一個存檔,防止你這個渣渣,被boss一招秒殺,又得從頭再來。。。。。
所以被boss弄死,能夠從存檔,從新開始遊戲。。。。
當你的代碼寫好了一部分功能,就能夠保存一個"存檔",這個存檔操做就是git commit,若是代碼出錯,能夠隨時回到"存檔"記錄
查看"存檔"記錄,查看commit提交記錄的命令 git log
git log命令顯示,從最新的commit記錄到最遠的記錄順序。
git log --oneline 一行顯示git記錄 git log --oneline --all 一行顯示全部分支git記錄 git log --oneline --all -4 --graph 顯示全部分支的版本演進的最近4條 git log -4 顯示最近4條記錄 git log --all 顯示全部分支的commit信息 git branch -v 查看分支信息 git help --web log 以web界面顯示log的參數
git log能夠查看歷史版本記錄 git reset --hard命令能夠回退版本 git reset --hard HEAD^ 回退到上個版本 HEAD表示當前版版本 HEAD^表示上個版本 HEAD^^上上個版本
也能夠直接git reset --hard 版本id號
當你發現你git reset --hard回退錯了。。。怎麼辦?別怕git reflog 記錄了你每一次命令
git reflog 80f9496 HEAD@{1}: reset: moving to HEAD^ b7a8740 (HEAD -> master) HEAD@{2}: commit: echo 123 80f9496 HEAD@{3}: commit: echo my.txt bf5879e HEAD@{4}: commit (initial): echo my.txt
我想回到某一個點,能夠再次git reset --hard 版本id
在咱們進行git init mygit初始化一個git項目時,這個mygit文件夾,就是一個工做區(working Directory)
yudanL-2:mygit root# pwd /data/mygit yudanL-2:mygit root# ls .git my.txt
工做區裏有一個.git隱藏文件夾,就是git的本地倉庫
.git文件夾裏有一個index文件,就是git的暫存區,也叫作stage
.git文件夾裏的HEAD文件就是git的一個指針
原理圖
撤銷修改記錄,只能在未提交到暫存區以前
git status
git checkout -- my.txt 放棄工做區的修改操做
若是你修改了文件,還添加到了暫存區 git add,那麼只能撤銷暫存區的操做,再撤銷修改記錄
git status
git reset HEAD readme.txt 撤銷暫存區的修改,unstage操做
git checkout -- readme.txt
若是你直接在工做區刪除文件,動做會被git記錄 rm -rf my.txt 刪除了工做區的文件,git倉庫還有記錄 git status 查看狀態,能夠檢測到my.txt被刪除 若是確認文件無用,能夠commit到git倉庫 git rm "my.txt" git commit -m "remove my.txt"
若是你想恢復文件,能夠經過git倉庫的代碼,替換工做區的代碼
rm -rf my.txt
git checkout -- my.txt
保存當前暫存區和工做區的改動存儲起來,執行完畢git stash以後,再次運行git status就會發現當前已經是個乾淨的工做區,經過git stash list查看結果
命令整理
git stash 保存暫存區,工做區進度 git stash list 查看stash保存的列表以及id git stash pop 恢復最新的stash進度到工做區 git stash pop stash_id 恢復指定的stash進度 git stash clear 清空全部存儲的stash進度 git stash drop stash_id 刪除一個存儲的stash進度
git stash apply 恢復stash存儲,且不刪除stash list中的記錄
git stash
會把全部未提交的修改(包括暫存的和非暫存的)都保存起來,用於後續恢復當前工做目錄。
好比下面的中間狀態,經過git stash
命令推送一個新的儲藏,當前的工做目錄就乾淨了。
[root@yugo mydjango]# ls manage.py mydjango #好比我臨時想新建一個app01,進行開發,可是忽然開發到一半,線上代碼出bug了,我得當即去修復,我但願能臨時存儲一下,我目前的修改操做,bug完畢了,再找回來繼續開發 [root@yugo mydjango]# django-admin startapp app01 [root@yugo mydjango]# [root@yugo mydjango]# [root@yugo mydjango]# git add .
[root@yugo mydjango]# git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: app01/__init__.py # new file: app01/admin.py # new file: app01/apps.py # new file: app01/migrations/__init__.py # new file: app01/models.py # new file: app01/tests.py # new file: app01/views.py # [root@yugo mydjango]# [root@yugo mydjango]# [root@yugo mydjango]# git stash Saved working directory and index state WIP on master: b16ccc0 v1 mydjango HEAD is now at b16ccc0 v1 mydjango
#此時app01被放入暫存區,看不到了 [root@yugo mydjango]# ls manage.py mydjango
#這裏應該使用 git stash save 存儲名
git stash save "my app01 stash"
找回stash
[root@yugo mydjango]# ls manage.py mydjango
[root@yugo mydjango]# git stash pop # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: app01/__init__.py # new file: app01/admin.py # new file: app01/apps.py # new file: app01/migrations/__init__.py # new file: app01/models.py # new file: app01/tests.py # new file: app01/views.py # Dropped refs/stash@{0} (5758c689354a34a168063a5bfa5d4bb3ca291f3b)
[root@yugo mydjango]# ls app01 manage.py mydjango
查看stash列表
[root@yugo mydjango]# git stash list stash@{0}: WIP on master: b16ccc0 v1 mydjango
移除stash
默認刪除第一個stash [root@yugo mydjango]# git stash drop Dropped refs/stash@{0} (8af1c158977d5fe8bd398561ad8777514f8d22d1)