git的官方網站:http://git-scm.comhtml
Git是一個開源的分佈式版本控制軟件,用以有效、高速的處理很小到大的項目版本管理。Git 最初是由Linus Torvalds設計開發的,用於管理Linux內核開發。Git 是根據GNU通用公共許可證版本2的條款分發的自由/免費軟件,安裝參見:http://git-scm.com/ Git就是一個用於幫助用戶實現版本控制的軟件。
GitHub是一個基於Git的遠程文件託管平臺。
Git自己徹底能夠作到版本控制,但其全部內容以及版本記錄都只能保存在本機,若是想要將文件內容以及版本記錄同時保存在遠程,則須要集合github來使用。
首先將咱們寫好的項目創建好,而且下載好git後,使用git管理。python
一、初始化,讓git把這個文件管理起來git
git init
會出現.git文件,若是沒有,將設置一下隱藏文件就能夠了,正常狀況下會是這種狀況github
Initialized empty Git repository in D:/python/gitdemo/.git/
二、查看當前文件夾的狀態web
git status
會顯示:面試
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) .idea/ app01/ gitdemo/ manage.py templates/ nothing added to commit but untracked files present (use "git add" to track)
這個時候文件都尚未被管理,因此都是紅色的緩存
三、咱們先隨便對一個文件進行管理,例如:manage.py安全
git add manage.py(文件名) # 就是對當前文件版本控制
而後在查看一下狀態:app
git status
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: manage.py Untracked files: (use "git add <file>..." to include in what will be committed) .idea/ app01/ gitdemo/ templates/
此刻,manage.py是已經被管理的文件,顏色從紅色變成了綠色。分佈式
四、對當前文件下的全部文件以及子目錄進行版本控制
git add .
在查看,就是全部文件都被管理了:
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git add . warning: LF will be replaced by CRLF in .idea/gitdemo.iml. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in .idea/misc.xml. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in .idea/modules.xml. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in .idea/workspace.xml. The file will have its original line endings in your working directory. 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .idea/gitdemo.iml new file: .idea/misc.xml new file: .idea/modules.xml new file: .idea/workspace.xml 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 new file: gitdemo/__init__.py new file: gitdemo/__pycache__/__init__.cpython-35.pyc new file: gitdemo/__pycache__/settings.cpython-35.pyc new file: gitdemo/settings.py new file: gitdemo/urls.py new file: gitdemo/wsgi.py new file: manage.py new file: templates/index.html
五、建立提交記錄(版本)
git commit -m "詳細描述版本信息"
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git commit -m '建立第一個版 本' [master (root-commit) 72d22fe] 建立第一個版本本 19 files changed, 504 insertions(+) create mode 100644 .idea/gitdemo.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/workspace.xml create mode 100644 app01/__init__.py create mode 100644 app01/admin.py create mode 100644 app01/apps.py create mode 100644 app01/migrations/__init__.py create mode 100644 app01/models.py create mode 100644 app01/tests.py create mode 100644 app01/views.py create mode 100644 gitdemo/__init__.py create mode 100644 gitdemo/__pycache__/__init__.cpython-35.pyc create mode 100644 gitdemo/__pycache__/settings.cpython-35.pyc create mode 100644 gitdemo/settings.py create mode 100644 gitdemo/urls.py create mode 100644 gitdemo/wsgi.py create mode 100644 manage.py create mode 100644 templates/index.html
若是在這一步報錯了,就是沒有寫名字,和郵箱。按照所說的步驟來就好了。
這個時候咱們再查看:
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master
nothing to commit, working tree clean
已經爲空,變成透明的了文件,實際上仍是存在的。
六、查看信息,提交的記錄
git reflog
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git reflog 72d22fe (HEAD -> master) HEAD@{0}: reset: moving to 72d22fe3836c39ae2a1e0e85e106 a41cc9b24898 c5cf29d HEAD@{1}: commit: 添加論文檢查3功能 72d22fe (HEAD -> master) HEAD@{2}: commit (initial): 建立第一個版本本
七、回滾
git reset --hard (版本號)
八、暫存,用於在開發過程當中臨時須要修復bug或臨時新功能的到來
stash用於將工做區發生變化的全部文件獲取臨時存儲在「某個地方」,將工做區還原當前版本未操做前的狀態;stash還能夠將臨時存儲在「某個地方」的文件再次拿回到工做區。
git stash 做用:幫助咱們暫時存儲已經開發的一些功能的代碼,繼續作其餘事情。作完以後再回來繼續開發。
git stash pop
特別的:執行 git stash pop 命令時,可能會遇到衝突,由於在緊急修復bug的代碼和經過stash存儲在「某個地方」的代碼會有重合部分,因此執行 git stash pop 時候就會出現衝突,有衝突解決衝突便可。
stash相關經常使用命令:
git stash 將當前工做區全部修改過的內容存儲到「某個地方」,將工做區還原到當前版本未修改過的狀態
git stash list 查看「某個地方」存儲的全部記錄
git stash clear 清空「某個地方」
git stash pop 將第一個記錄從「某個地方」從新拿到工做區(可能有衝突)
git stash apply 編號, 將指定編號記錄從「某個地方」從新拿到工做區(可能有衝突)
git stash drop 編號,刪除指定編號的記錄
九、與stash做用相同的是branch
分支學習:branch稱爲分支,默認僅有一個名爲master的分支。通常開發新功能流程爲:開發新功能時會在分支dev上進行,開發完畢後再合併到master分支。
git branch dev # 建立新分支,即:拷貝一份當前所在分支代碼到新分支 git checkout dev # 切換到dev分支
分支功能完成後,再合併。合併以前要回到master,在合併
git checkout master # 切換回master分支 git merge dev # 將dev分支內容合併到master分支
代碼:
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch dev # 建立分支 拷貝一份當前所在分支代碼到新支 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch # 查看一下分支 dev * master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git checkout dev # 切換到dev分支 Switched to branch 'dev' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git add . # 將修改文件添加到版本庫的暫存區 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git commit -m "論文修改3.1" # 將暫存區的內容提交到當前所在分支,即:dev分支 [dev beb0313] 論文修改3.1 1 file changed, 1 insertion(+) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git status # 查看狀態 On branch dev nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git checkout master # 切換到master Switched to branch 'master' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git status On branch master nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch picc 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git checkout picc Switched to branch 'picc' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc) $ git add . 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc) $ git commit -m "修改論文3.1.1" [picc 597a7e2] 修改論文3.1.1 1 file changed, 1 insertion(+), 1 deletion(-) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc) $ git checkout master Switched to branch 'master' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git merge picc # 合併 Updating c5cf29d..597a7e2 Fast-forward templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git log commit 597a7e216b13825f35a53932c7811fbbf7734187 (HEAD -> master, picc) Author: unknown <1079264692@qq.com> Date: Wed Mar 13 11:27:14 2019 +0800 修改論文3.1.1 commit c5cf29d6df4a152d82badeb414c89b2eb6711b28 Author: unknown <1079264692@qq.com> Date: Mon Mar 11 13:44:59 2019 +0800 添加論文檢查3功能 commit 72d22fe3836c39ae2a1e0e85e106a41cc9b24898 Author: unknown <1079264692@qq.com> Date: Mon Mar 11 13:35:18 2019 +0800 建立第一個版本本 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git atatus git: 'atatus' is not a git command. See 'git --help'. The most similar command is status 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git status On branch master nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch -d picc # 刪除這個分支 Deleted branch picc (was 597a7e2). 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch dev * master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git checkout dev Switched to branch 'dev' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git status On branch dev nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git status On branch dev nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git status On branch dev 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: templates/index.html no changes added to commit (use "git add" and/or "git commit -a") 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git add . 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git commit -m "論文暫時修改完" [dev 1ac93af] 論文暫時修改完 1 file changed, 1 insertion(+) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git checkout master Switched to branch 'master' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git merge dev Auto-merging templates/index.html CONFLICT (content): Merge conflict in templates/index.html Automatic merge failed; fix conflicts and then commit the result.
branch相關經常使用命令: git branch 分支名稱 建立分支 git checkout 分支名稱 切換分支 git branch -m 分支名稱 建立並切換到指定分支 git branch 查看全部分支 git branch -d 分支名稱 刪除分支 git merge 分支名稱 將指定分支合併到當前分支
面試題:
若是代碼出現bug,如何解決?
建立一個bug分支,而後進行bug處理,處理完畢後合併到master分支,而後刪除bug分支。最後回到dev分支繼續開發。
最後,咱們都寫完功能後,若是是在家裏邊寫完的,到公司之後若是沒帶電腦怎麼辦?這時候就有了GitHub託管平臺。
GitHub,一個基於Git實現的代碼託管的平臺,能夠將內容以及版本記錄在遠程也保存一份,這樣就不用U盤咯(相似於雲盤)。
PS: 相似GitHub的產品還有許多,如:GitLab、Bitbucket、碼雲等。
基於GitHub實現代碼託管,須要一下步驟:
在家裏,將開發完的功能提交到GitHub
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git remote add origin https://github.com/lllmy/gitdemo.git # 爲地址起一個別名origin 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git push origin master # 將本地master分支內容以及版本信息推送到GitHub
Enumerating objects: 42, done. Counting objects: 100% (42/42), done. Delta compression using up to 4 threads. Compressing objects: 100% (35/35), done. Writing objects: 100% (42/42), 9.41 KiB | 566.00 KiB/s, done. Total 42 (delta 10), reused 0 (delta 0) remote: Resolving deltas: 100% (10/10), done. To https://github.com/lllmy/gitdemo.git * [new branch] master -> master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git branch dev * master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master) $ git checkout dev Switched to branch 'dev' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git push origin dev # 將本地dev分支內容以及版本信息推送到GitHub Total 0 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'dev' on GitHub by visiting: remote: https://github.com/lllmy/gitdemo/pull/new/dev remote: To https://github.com/lllmy/gitdemo.git * [new branch] dev -> dev 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git pull origin dev remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (1/1), done. remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0 Unpacking objects: 100% (4/4), done. From https://github.com/lllmy/gitdemo * branch dev -> FETCH_HEAD 1ac93af..54efe99 dev -> origin/dev Updating 1ac93af..54efe99 Fast-forward templates/index.html | 1 + 1 file changed, 1 insertion(+)
在公司,咱們在GitHub上把在家裏寫的功能代碼給拉下來
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa $ git clone https://github.com/lllmy/gitdemo.git # 將項目從GitHub中獲取
Cloning into 'gitdemo'... remote: Enumera ting objects: 42, done. remote: Counting objects: 100% (42/42), done. remote: Compressing objects: 100% (25/25), done. remote: Total 42 (delta 10), reused 42 (delta 10), pack-reused 0 Unpacking objects: 100% (42/42), done. 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa $ ls gitdemo/ 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa $ cd gitdemo 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git branch # 默認獲取到得只有master分支 * master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git branch dev 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git checkout dev Switched to branch 'dev' 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git pull origin dev From https://github.com/lllmy/gitdemo * branch dev -> FETCH_HEAD Already up to date. 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git status On branch dev nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git status On branch dev 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: templates/index.html no changes added to commit (use "git add" and/or "git commit -a") 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git add . 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git commit -m "會員功能1/3" [dev 54efe99] 會員功能1/3 1 file changed, 1 insertion(+) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git push origin dev Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 368 bytes | 184.00 KiB/s, done. Total 4 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 2 local objects. To https://github.com/lllmy/gitdemo.git 1ac93af..54efe99 dev -> dev
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ ls 2.py app01/ gitdemo/ manage.py* templates/ 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git fetch origin dev # 從GitHub倉庫獲取dev分支最新內容到版本庫的分支 remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 3), reused 6 (delta 3), pack-reused 0 Unpacking objects: 100% (6/6), done. From https://github.com/lllmy/gitdemo * branch dev -> FETCH_HEAD d4cfd11..7f07a9e dev -> origin/dev 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ git merge origin/dev # 將版本庫的分支內容合併到工做區 Updating d4cfd11..7f07a9e Fast-forward 1.py | 0 3.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 1.py create mode 100644 3.py 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev) $ ls 1.py 2.py 3.py app01/ gitdemo/ manage.py* templates/
久而久之,將Git和GitHub結合使用作到避免電腦損壞形成數據丟失以及多地開發的問題,
上文執行過程當中執行 【git pull origin 分支】命令等同於【git fetch origin 分支】+ 【git merge origin/分支】,
而且在執行過程當中可能會出現衝突,緣由是因爲本地代碼和獲取的最新代碼有重合部分,那麼就須要本身手動解決衝忽然後再繼續開發。
面試題:
git rebase的做用?
我在公司寫代碼忘記提交了,在家繼續開發功能,在拉取代碼後提交,用git fetch和gitmerge提交的時候會有一個分叉記錄,咱們吧git merge換成git rebase會保持提交記錄的整潔。
以斜槓「/」開頭表示目錄; 以星號「*」通配多個字符; 以問號「?」通配單個字符 以方括號「[]」包含單個字符的匹配列表; 以歎號「!」表示不忽略(跟蹤)匹配到的文件或目錄; .gitignore
在git中若是想忽略掉某個文件,不讓這個文件提交到版本庫中,可使用修改 .gitignore 文件的方法。這個文件每一行保存了一個匹配的規則例如: # 此爲註釋 – 將被 Git 忽略 *.a # 忽略全部 .a 結尾的文件 !lib.a # 但 lib.a 除外 /TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目錄下的全部文件 doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt 這樣設置了之後 全部的 .pyc 文件都不會添加到版本庫中去。 另外 git 提供了一個全局的 .gitignore,你能夠在你的用戶目錄下建立 ~/.gitignoreglobal 文件,以一樣的規則來劃定哪些文件是不須要版本控制的。 須要執行 git config --global core.excludesfile ~/.gitignoreglobal來使得它生效。 其餘的一些過濾條件 * ?:表明任意的一個字符 * *:表明任意數目的字符 * {!ab}:必須不是此類型 * {ab,bb,cx}:表明ab,bb,cx中任一類型便可 * [abc]:表明a,b,c中任一字符便可 * [ ^abc]:表明必須不是a,b,c中任一字符 因爲git不會加入空目錄,因此下面作法會致使tmp不會存在 tmp/* //忽略tmp文件夾全部文件 改下方法,在tmp下也加一個.gitignore,內容爲 * !.gitignore 還有一種狀況,就是已經commit了,再加入gitignore是無效的,因此須要刪除下緩存 git rm -r --cached ignore_file 注意: .gitignore只能忽略那些原來沒有被track的文件,若是某些文件已經被歸入了版本管理中,則修改.gitignore是無效的。 正確的作法是在每一個clone下來的倉庫中手動設置不要檢查特定文件的更改狀況。 git update-index --assume-unchanged PATH 在PATH處輸入要忽略的文件。 另外 git 還提供了另外一種 exclude 的方式來作一樣的事情,不一樣的是 .gitignore 這個文件自己會提交到版本庫中去。用來保存的是公共的須要排除的文件。
而 .git/info/exclude 這裏設置的則是你本身本地須要排除的文件。 他不會影響到其餘人。也不會提交到版本庫中去。 .gitignore 還有個有意思的小功能, 一個空的 .gitignore 文件 能夠看成是一個 placeholder 。當你須要爲項目建立一個空的 log 目錄時, 這就變的頗有用。
你能夠建立一個 log 目錄 在裏面放置一個空的 .gitignore 文件。這樣當你 clone 這個 repo 的時候 git 會自動的建立好一個空的 log 目錄了。
git tag -a v1.0 -m '版本介紹' 本地建立Tag git show v1.0 查看 git tags -n 查看本地Tag git tag -l 'v1.4.2.*' 查看本地Tag,模糊匹配 git tag -d v1.0 刪除Tag git push origin :refs/tags/v0.2 更新遠程tag git checkout v.10 切換tag git fetch origin tag V1.2 git push origin --tags git pull origin --tags git clone -b v0.1 版本相關
先說一下相同點,兩者都是基於web的Git倉庫,在很大程度上GitLab是仿照GitHub來作的,
它們都提供了分享開源項目的平臺,爲開發團隊提供了存儲、分享、發佈和合做開發項目的中心化雲存儲的場所。
GitHub做爲開源代碼庫及版本控制系統,擁有超過900萬的開發者用戶,目前仍然是最火的開源項目託管系統。GitHub同時提供公共倉庫和私有倉庫,但若是要使用私有倉庫,是須要付費的。
而GitLab解決了這個問題,你能夠在上面建立私人的免費倉庫。
GitLab讓開發團隊對他們的代碼倉庫擁有更多的控制,相比於GitHub,它有很多的特點:
容許免費設置倉庫權限;容許用戶選擇分享一個project的部分代碼;容許用戶設置project的獲取權限,進一步的提高安全性;
能夠設置獲取到團隊總體的改進進度;經過innersourcing讓不在權限範圍內的人訪問不到該資源。
從代碼私有性方面來看,有時公司並不但願員工獲取到所有的代碼,這個時候GitLab無疑是更好的選擇。但對於開源項目而言,GitHub依然是代碼託管的首選。