安裝
https://git-scm.com/downloadshtml
一直點下一步就能夠,安裝完後打開方法:‘開始菜單’-->'Git'-->''Git Bashjava
安裝完成後設置名字和電子郵件python
bash基本操做git
1)、cd : 改變目錄。 2)、cd . . 回退到上一個目錄,直接cd進入默認目錄 3)、pwd : 顯示當前所在的目錄路徑。 4)、ls(ll): 都是列出當前目錄中的全部文件,只不過ll(兩個ll)列出的內容更爲詳細。 5)、touch : 新建一個文件 如 touch index.js 就會在當前目錄下新建一個index.js文件。 6)、rm: 刪除一個文件, rm index.js 就會把index.js文件刪除。 7)、mkdir: 新建一個目錄,就是新建一個文件夾。 8)、rm -r : 刪除一個文件夾, rm -r src 刪除src目錄, 好像不能用通配符。 9)、mv 移動文件, mv index.html src index.html 是咱們要移動的文件, src 是目標文件夾,固然, 這樣寫,必須保證文件和目標文件夾在同一目錄下。 10)、reset 從新初始化終端/清屏。 11)、clear 清屏。 12)、history 查看命令歷史。 13)、help 幫助。 14)、exit 退出。 15)、#表示註釋
建立倉庫
1.切換目錄github
2.經過 git init 命令把當前目錄變成git能夠管理的倉庫web
會生成一個.git目錄,若是沒有看見運行 ls -ah 就能夠查看到算法
hello.html內容「hello world」sql
把文件提交到倉庫bootstrap
-m 後面輸入的是本次提交的說明安全
查看配置
git config -l 查看git環境詳細配置
git config --global --list 查看當前用戶配置
git操做
更改hello.html內容爲 'hello git!'
運行git status 查看狀態
git diff hello.html 查看哪裏作了修改
知道哪裏修改後在提交 git add hello.html git commit -m "add distributed"
git log 查看歷史記錄
git log --pretty=oneline 一行顯示
退回上次修改的某個版本
git reset --hard a8d2be07ab1a718179e08f78f430fd91cc3cad33
git reflog 記錄每一次提交的commit id,而後經過這個能夠恢復到某個版本
總結:
#HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。 #穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。 #要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。
工做區和暫存區
工做區:working directory 就是一個目錄 learngit文件夾就是一個工做區
版本庫:repository 工做區的隱藏目錄 .git 這個不是工做區,而是git的版本庫
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master
,以及指向master
的一個指針叫HEAD
。
前面講了咱們把文件往Git版本庫裏添加的時候,是分兩步執行的: 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區; 第二步是用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支
須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。
撤銷修改
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。 場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做
刪除
git rm filename
GitHub使用
生成密匙
$ ssh-keygen -t rsa -C "1184405959@qq.com"
C:\Users\Administrator\.ssh目錄下找到id_rsa.pub複製裏面全部內容
github帳號-->your profile-->edit profile-->SSH and GPG key-->New SSH key-->粘貼key
添加遠程庫
1.GitHub 上選擇new repository 建立一個learn-git 倉庫
2.把本地倉庫文件上傳到遠程
git remote add origin https://github.com/derek-zhang123/learn-git.git
git push -u origin master #上傳全部 第一次要加-u 之後就直接 git push origin master
若是報錯 運行以下命令再重複上傳一次
git remote rm origin
從遠程庫克隆
在github建立learn-git倉庫
克隆到本地
git clone https://github.com/derek-zhang123/learn-git
而後在本地會生成一個learn-git目錄,裏面克隆了remote倉庫全部的文件
分支管理
git branch dev #建立分支 git checkout dev #切換到div分支 #能夠合併一個命令 建立並切換到dev git checkout -b dev
#查看分支 *表明當前在哪一個分支 git branch
添加內容到hello.html,
而後提交
這是在分支dev上作的操做,提交完成後,切換到master分支
這個時候查看hello.html的內容時,發現剛纔添加的內容並無顯示,由於那是在dev分支上提交的,而master分支並無變
如今,把dev上的工做合併到master分支上:
git merge dev
再查看時,剛纔添加的內容能夠看到了
刪除分支dev
git branch -d dev
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>
強行刪除。
總結:
查看分支:git branch 建立分支:git branch <name> 切換分支:git checkout <name> 建立+切換分支:git checkout -b <name> 合併某分支到當前分支:git merge <name> 刪除分支:git branch -d <name>
解決分支衝突
當分支dev和master都修改了hello.html,合併會提示衝突
這個時候須要手動解決衝突(在master分支修改內容後用下面的命令提交)
分支管理策略
git merge --no-ff -m "merge with no-ff" dev
合併分支時,加上--no-ff
參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward
合併就看不出來曾經作過合併。
bug分支
修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;
當手頭工做沒有完成時,先把工做現場git stash
一下,而後去修復bug,修復後,再git stash pop
,回到工做現場。
多人協做
多人協做的工做模式一般是這樣:
-
首先,能夠試圖用
git push origin branch-name
推送本身的修改; -
若是推送失敗,則由於遠程分支比你的本地更新,須要先用
git pull
試圖合併; -
若是合併有衝突,則解決衝突,並在本地提交;
-
沒有衝突或者解決掉衝突後,再用
git push origin branch-name
推送就能成功!
若是git pull
提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name
。
這就是多人協做的工做模式,一旦熟悉了,就很是簡單。
總結:
查看遠程庫信息,使用git remote -v; 本地新建的分支若是不推送到遠程,對其餘人就是不可見的; 從本地推送分支,使用git push origin branch-name,若是推送失敗,先用git pull抓取遠程的新提交; 在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致; 創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name; 從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突。
標籤
建立標籤 git tag v1.0
查看標籤 git tag
默認標籤打在最新的commit提交上,要想給歷史的提交打上標籤,也很簡單。先找到標籤 git log --pretty=oneline --abbrev-commit
好比要給add xxx添加上標籤,找到它對應的commit id添加 git tag v0.9 098f23b
查看標籤信息:git show v0.9
刪除標籤: git tag -d v0.9
推送標籤:git push origin v1.0
一次推送所有標籤:git push origin --tags
若是標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:
git tag -d v1.0
再刪除遠程:
git push origin :refs/tags/v1.0
總結:
命令git push origin <tagname>能夠推送一個本地標籤; 命令git push origin --tags能夠推送所有未推送過的本地標籤; 命令git tag -d <tagname>能夠刪除一個本地標籤; 命令git push origin :refs/tags/<tagname>能夠刪除一個遠程標籤。
使用github
訪問主頁https://github.com/twbs/bootstrap,點「Fork」就在本身的帳號下克隆了一個bootstrap倉庫,而後,從本身的帳號下clone:
git clone https://github.com/derek-zhang123/bootstrap
命令總結
#本地使用 git init ls -ah #查看隱藏 git status #查看狀態 git add -A #添加全部 git commit -m "提交信息" git diff #查看文件更改的變化 git checkout -- . #撤銷修改 git reset --hard 55f9ddb #回退到某個版本 後面七位數字是commit id git reflog git clean -xf #刪除當前目錄下全部沒有track過的文件 git config --global core.quotepath false #文件名字是中文時,解決亂碼顯示問題 #git與github關聯 git config --global user.name "你的用戶名" git config --global user.email "你的郵箱" ssh-keygen -t rsa -C "你的郵箱" #生成ssh key clip < ~/.ssh/id_rsa.pub #將生成的key複製到粘貼板 git push -u origin master git pull origin master git remote add origin 你複製的地址 git push
git clone https://github.com/schaepher/blogsbackup.git #下載別人的代碼到本地
理論基礎
四個工做區域
Workspace:工做區,就是你平時存放項目代碼的地方
Index / Stage:暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
Repository:倉庫區(或本地倉庫),就是安全存放數據的位置,這裏面有你提交到全部版本的數據。其中HEAD指向最新放入倉庫的版本
Remote:遠程倉庫,託管代碼的服務器,能夠簡單的認爲是你項目組中的一臺電腦用於遠程數據交換
其它概念
Directory:使用Git管理的一個目錄,也就是一個倉庫,包含咱們的工做空間和Git的管理空間。
WorkSpace:須要經過Git進行版本控制的目錄和文件,這些目錄和文件組成了工做空間。
git:存放Git管理信息的目錄,初始化倉庫的時候自動建立。
Index/Stage:暫存區,或者叫待提交更新區,在提交進入repo以前,咱們能夠把全部的更新放在暫存區。
Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會只是當前的開發分支(branch)。
Stash:隱藏,是一個工做狀態保存棧,用於保存/恢復WorkSpace中的臨時狀態
git工做流程
在工做目錄中添加、修改文件;
將須要進行版本管理的文件放入暫存區域;
將暫存區域的文件提交到git倉庫。
git管理的文件有三種狀態:
已修改(modified)
已暫存(staged)
已提交(committed)
git文件操做
版本控制就是對文件的版本控制,要對文件進行修改、提交等操做,首先要知道文件當前在什麼狀態,否則可能會提交了如今還不想提交的文件,或者要提交的文件沒提交上。GIT不關心文件兩個版本之間的具體差異,而是關心文件的總體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件總體是否改變的方法就是用SHA-1算法計算文件的校驗和。
文件四中狀態
-
Untracked: 未跟蹤, 此文件在文件夾中, 但並無加入到git庫, 不參與版本控制. 經過
git add
狀態變爲Staged
. -
Unmodify: 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中徹底一致. 這種類型的文件有兩種去處, 若是它被修改, 而變爲
Modified
. 若是使用git rm
移出版本庫, 則成爲Untracked
文件 -
Modified: 文件已修改, 僅僅是修改, 並無進行其餘的操做. 這個文件也有兩個去處, 經過
git add
可進入暫存staged
狀態, 使用git checkout
則丟棄修改過, 返回到unmodify
狀態, 這個git checkout
即從庫中取出文件, 覆蓋當前修改 -
Staged: 暫存狀態. 執行
git commit
則將修改同步到庫中, 這時庫中的文件和本地文件又變爲一致, 文件爲Unmodify
狀態. 執行git reset HEAD filename
取消暫存, 文件狀態爲Modified
總結
忽略特殊文件.gitignore
在Git工做區的根目錄下建立一個特殊的.gitignore
文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件
不須要從頭寫.gitignore
文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
- 忽略操做系統自動生成的文件,好比縮略圖等;
- 忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比Java編譯產生的
.class
文件; - 忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/
最後一步就是把.gitignore
也提交到Git,就完成了!