本教程適合對Git有必定理解,可是因爲太多命令,沒有系統學習的朋友們,其實Git操做咱們能夠分場景進行處理,在平常工做中遇到不知如何處理的場景能夠到本篇文章依次尋找解決方法,第一次在掘進發文章,但願各位大佬輕噴,多提意見,peace!javascript
首先,先了解下面幾個概念java
Workspace
工做區,就是咱們最開始寫代碼的區域Index
暫存區,有時候也叫stage,能夠經過 git add 某某文件
把想提交的東西放到暫存區Repository
本地倉庫,把暫存區的代碼commit
以後就放到了本地倉庫,此時會有版本號Remote
遠程倉庫 github或碼雲上建立的倉庫,能夠用clone
到本地,本地也能夠push
上去這裏先引用一張圖解釋Git 工做原理: node
git init
複製代碼
git add readme.txt
複製代碼
git commit -m <message>
複製代碼
git status #看有哪些文件被修改
複製代碼
git diff # 查看修改內容
複製代碼
git log # 能夠查看提交歷史,以便肯定要回退到哪一個版本
git reflog # 查看命令歷史,以便肯定要回到將來的哪一個版本
git reset --hard commit_id # 回到哪一個版本,--hard是強制性的
git checkout -- readme.txt # 把readme.txt文件在工做區的修改所有撤銷,讓這個文件回到最近一次git commit或git add時的狀態。
複製代碼
git checkout -- file
命令中的--
很重要,沒有--
,就變成了「切換到另外一個分支」的命令git
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支,這個分支也叫主分支(master),即master
分支。HEAD
嚴格來講不是指向提交,而是指向master
,master
纔是指向提交的,因此,HEAD
指向的就是當前分支。github
git branch # 查看分支
git branch <name> # 建立分支
git checkout <name>
git switch <name> # 切換分支,推薦用switch
git checkout -b <name>
git switch -c <name> # 建立+切換分支
git merge dev # 合併指定分支到當前分支
git branch -d <name> # 刪除分支
git branch -D <name> # 強行刪除還沒合併的分支
複製代碼
合併分支有時候會出現衝突,如如下這種狀況,在新分支修改提交後,切換到原來分支也進行修改提交,此時合併就會出現衝突正則表達式
git log --graph # 查看分支合併圖
git merge dev
git status # 查看衝突文件
複製代碼
刪除掉討人厭的====<<<,保留衝突內容,而後再shell
git add '衝突的文件'
git commit -m '衝突解決'
複製代碼
git的標籤就是版本庫的代號,標籤不能移動,分支能夠移動,存在即合理,咱們知道commit的時候後面會有一大串的版本號,不方便溝通和標記,所以tag就出現了,畢竟 v1.0.1比commit號是2sda21a要方便記憶許多數據庫
git tag <tagname> # 建立新標籤
git tag # 查看全部標籤
git push origin <tagname> # 能夠推送一個本地標籤
git push origin --tags # 推送所有未推送過的本地標籤
git tag -d <tagname> # 刪除一個本地標籤
git push origin :refs/tags/<tagname> # 刪除一個遠程標籤
複製代碼
還沒add到暫存區時安全
git checkout -- file
複製代碼
已經add到暫存區了bash
git reset HEAD <file>
git checkout -- file
複製代碼
你還commit上去了(那沒辦法,不能單純撤回一個文件了,只能回退整個倉庫版本了)
git log #看上一個版本號是什麼
git reset --hard commit_id #返回到上一個版本
複製代碼
你還還把修改後的文件上傳到遠程倉庫了
# 那你得趕忙用以前版本的代碼覆蓋掉
git reset --hard commit_id
# 修改並從新commit
git commit -m "New commit message"
# 強制上傳
git push --force
複製代碼
刪除原本版本庫裏的文件,而且不想更改
git rm
git commit -m '我是真的要刪除'
複製代碼
刪錯了想恢復
git status # 看看誤刪的文件叫什麼名字
git checkout -- file # 或者去回收站裏恢復
複製代碼
要pull到遠程倉庫,是須要有憑證的
第一步,建立SSH key
ssh-keygen -t rsa -C "youremail@example.com"
複製代碼
第二步,查看(在Mac上能夠直接在命令行輸入)
cat id_rsa.pub
複製代碼
第三步,在github或者gitee中設置>安全設置中輸入公鑰
第四步,查看是否有權限能鏈接
ssh -T git@github.com
複製代碼
本地尚未版本庫
git clone git@server-name:path/repo-name.git
複製代碼
本地已經有版本庫
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
複製代碼
因爲遠程庫是空的,咱們第一次推送
master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在之後的推送或者拉取時就能夠簡化命令
## 查看與哪一個倉庫關聯
git remote -v
## 解除關聯
git remote remove origin
## 從新關聯到新的倉庫
git remote add origin git@github.com:cwbdouble/test.git
## 因爲老闆以前在遠程倉庫裏放了說明文檔等東西,咱們直接push就會報錯
git push -u origin master
複製代碼
## 所以咱們須要強制把遠程倉庫的代碼跟新到當前分支上面
git pull --rebase origin master
## 而後再push
git push -u origin master
複製代碼
此時很尷尬,你在dev
分支上的任務還沒作完,還沒發提交,此時咱們只能把工做現場先儲存起來,等改完bug再繼續工做,還好有 stash
功能
## 先把原來工做存起來
git stash
## 查看工做區是乾淨的
git status
## 建立bug001分支,並切換到分支中
git checkout -b bug001
## 修復bug中,一萬年過去了
------------------------
## 修復完,add,commit以後,切換回原來的分支
git switch master
## 合併分支(PS:注意--no-ff參數,表示禁用Fast forward,即就算刪除了bug001分支,也保存分支信息)
git merge --no-ff -m '修復完bug001併合並' bug001
## 查看工做現場
git stash list
## 恢復現場 第一種方式 stash內容不刪除,再用git stash drop
git stash apply
## 第二種方式 恢復的時候把stash內容也刪除
git stash pop
## 在master分支上修復的bug,想要合併到當前dev分支,能夠用git cherry-pick <commit>命令,把bug提交的修改「複製」到當前分支,避免重複勞動。
git cherry-pick 4c805e2
複製代碼
git remote -v # 查看遠程庫信息
git push origin <branch-name> # 推送失敗,則用git pull 試圖合併,合併有衝突,則解決後再本地提交
# 若是git pull提示no tracking information,則說明本地分支和遠程分支的連接關係沒有建立,用如下命令解決
git branch --set-upstream-to <branch-name> origin/<branch-name>
# 若是解決完衝突,再提交,仍是有衝突,那很差意思,在你修改衝突的時候又有人提交了新的代碼,此時建議提早作好協商
複製代碼
像一些重點配置文件,包含數據庫帳號密碼之類的,以及node_module等重要或者沒什麼必要的文件,咱們只想保存在本地,所以,貼心的git也考慮到了,在Git工做區的根目錄下建立一個特殊的.gitignore
文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件,文件格式支持正則表達式
GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:github.com/github/giti…
學習完以上內容,確定想有所嘗試,最後推薦個Git學習闖關網站,但願能更好地幫助你們理解
文章參考連接: