.git
,這個不算工做區,而是Git的版本庫。Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage
(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master
,以及指向master
的一個指針叫HEAD
。html
設置Git參數git
# 顯示當前的 Git 配置 git config --list # 設置提交倉庫時的用戶名信息 git config --global user.name "fuziwang" # 設置提交倉庫時的郵箱信息 git config --global user.email "2622860598@qq.com"
三個區域、四種狀態相關操做github
# 在當前目錄新建一個 Git 代碼庫 git init # 添加指定文件到暫存區 git add [file1] [file2] # 提交暫存區到倉庫 git commit –m [message] # 直接從工做區提交到倉庫,前提該文件已經有倉庫中的歷史版本 git commit –a –m [message] # 顯示變動信息,能夠展現四種狀態的相關信息 git status # 顯示當前分支的歷史版本 git log git log --pretty=oneline "在一行顯示" # 記錄你的每一次提交版本和回退版本的信息 git reflog # 查看readme.txt文件在工做區和版本庫裏面最新版本的區別 git diff HEAD -- readme.txt # 當對工做區進行修改以後,(無論上一次是否git add)尚未git add,丟棄對工做區的修改 git checkout -- [file] # 當已經添加到暫存區,尚未git commit,能夠把暫存區的修改撤銷掉(unstage),從新放回工做區 git reset HEAD [file] # 版本回退,一旦把文件改亂了,或者誤刪了文件,還能夠從最近的一個commit恢復 git reset --hard HEAD^ git reset --hard "commit-id" # 刪除工做區文件,而且將此次刪除放入暫存區,以後只須要git commmit,不須要git add git rm [file1] [file2] # 更名文件,而且將這個更名放入暫存區,以後只須要git commmit,不須要git add git mv [file-origin] [file-renamed]
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。在Git裏,有一個主分支,即master
分支。HEAD
嚴格來講不是指向提交,而是指向master
,master
纔是指向提交的,因此,HEAD
指向的就是當前分支。面試
每次提交,master分支都會向前移動一步,這樣,隨着版本的不斷提交,master分支的線也愈來愈長:安全
Fast-forward
快速合併
# 建立dev分支,而後切換到dev分支 # git checkout命令加上-b參數表示建立並切換 至關於 git branch dev & git chekout dev git checkout -b dev # 查看當前分支是什麼 git branch # 把dev分支的工做成果合併到master分支上 git merge命令用於合併指定分支到當前分支 git merge dev # 合併完成後,刪除dev分支 git branch -d dev # 若是要放棄分支的全部操做,不進行合併,強制刪除分支的全部操做 git branch -D feature-vulcan
上述圖片過程當中會出現衝突,還原衝突過程:bash
feature1
分支,對readme.md文件進行修改,而且在新的分支上進行了一次提交。master
分支,一樣對readme.me文件進行修改,而且在主分支上進行了一次提交。git merge feature
運行這個命令會產生衝突,此時須要解決衝突
,須要手動修改文件內容。<<<<<<<,=======,>>>>>>>
標記出不一樣分支的內容,對文件進行修改後,再進行一次提交用帶參數的git log
也能夠看到分支的合併狀況app
~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit * a0c8a45 conflict fixed |\ | * a8b263e AND simple * | 5565d9c & simple |/ * faa2e24 branch test ...
--no-ff
方式的 git merge
dev
分支,修改readme.txt文件,並提交一個新的commit
master
,準備合併dev
分支,請注意--no-ff
參數,表示禁用Fast forward
合併後,咱們用git log
看看分支歷史:ssh
~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit * fc2593c merge with no-ff |\ | * ecca429 add merge |/ * 2a45671 conflict fixed ...
Git stash
若是如今接到一個修復bug
的任務時,須要建立一個分支bug-1
來修復它,可是,當前正在dev
上進行的工做尚未提交,工做只進行到一半,還無法提交。此時須要去修復bug
,當前工做區須要暫時保存下來,等bug
修復徹底再繼續工做。fetch
Git提供了一個stash
功能,能夠把當前工做現場「儲藏」
起來,等之後恢復現場後繼續工做:網站
~/learngit(dev*) » git stash Saved working directory and index state WIP on dev: ecca429 add merge HEAD 如今位於 ecca429 add merge
此時能夠進行bug
的修復。修復完成後,回到dev
開發工做中,用git stash list
命令看看當前保存的環境狀態。
~/learngit(dev) » git stash list stash@{0}: WIP on dev: ecca429 add merge
工做現場還在,Git把stash
內容存在某個地方了,可是須要恢復一下,有兩個辦法:
git stash apply
恢復,可是恢復後,stash
內容並不刪除,你須要用git stash drop
來刪除git stash pop
,恢復的同時把stash
內容也刪了Rebase
對於該部分,能夠看一下http://gitbook.liuhui998.com/...,我以爲這個講解的更加清楚
rebase
操做能夠把本地未push
的分叉提交歷史整理成直線
,rebase
的目的是使得咱們在查看歷史提交的變化時更容易,由於分叉的提交須要三方對比。
應用場景:當本地比遠程倉庫多了幾個提交以後,須要git push
,但當push
的時候發現,遠程倉庫已經有人先進行了推送,所以須要先pull
下來,此時輸入git log --graph --pretty=oneline --abbrev-commit
會發現內容很是亂很差看,此時能夠輸入git rebase
~/learngit(master) » git rebase First, rewinding head to replay your work on top of it... Applying: add comment Using index info to reconstruct a base tree... M hello.py Falling back to patching base and 3-way merge... Auto-merging hello.py Applying: add author Using index info to reconstruct a base tree... M hello.py Falling back to patching base and 3-way merge... Auto-merging hello.py ----------------------------------------------------------- # 此時再輸入git log命令會發現內容進行了整理 ~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit * 7e61ed4 (HEAD -> master) add author * 3611cfe add comment * f005ed4 (origin/master) set exit=1 * d1be385 init hello ...
更多github的使用:http://developer.51cto.com/ar...
GitHub
這個網站就是提供Git倉庫託管服務的,本地Git倉庫和GitHub倉庫
之間的傳輸是經過SSH
加密的,因此,須要一點設置:
第1步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
~ » ssh-keygen -t rsa -C "2622860598@qq.com"
在用戶主目錄裏找到.ssh
目錄,裏面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key
的祕鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰。
第2步:登錄GitHub,打開「Account settings」
,「SSH Keys」
頁面:點「Add SSH Key」
,填上任意Title,在Key文本框裏粘貼id_rsa.pub
文件的內容:
爲何GitHub須要SSH Key呢?
由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。GitHub容許添加多個Key。
面試常考:討論git pull
、 git fetch
的關係:
git fetch
至關因而從遠程獲取最新到本地,不會自動merge
git pull
:至關因而從遠程獲取最新版本並merge
到本地 在實際使用中,git fetch
更安全一些# 下載一個項目和它的整個代碼歷史 # url 格式: https://github.com/[userName]/reposName git clone [url] # 增長遠程倉庫,並命名 git remote add [shortname] [url] # 將本地的提交推送到遠程倉庫 git push [remote] [branch] 推送分支:git push origin dev # 將遠程倉庫的提交拉下到本地 git pull [remote] [branch] # 查看遠程庫的信息,用git remote,或者,用git remote -v顯示更詳細的信息 git remote ~/learngit(master) » git remote -v origin https://github.com/fuziwang/learngit.git (fetch) origin https://github.com/fuziwang/learngit.git (push) # 本地分支和遠程分支的連接關係沒有建立 git branch --set-upstream branch-name origin/branch-name