Git學習和應用場景

前言

本教程適合對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嚴格來講不是指向提交,而是指向mastermaster纔是指向提交的,因此,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.1commit號是2sda21a要方便記憶許多數據庫

git tag <tagname> # 建立新標籤
git tag # 查看全部標籤
git push origin <tagname> # 能夠推送一個本地標籤
git push origin --tags # 推送所有未推送過的本地標籤
git tag -d <tagname> # 刪除一個本地標籤
git push origin :refs/tags/<tagname> # 刪除一個遠程標籤
複製代碼

場景一:修改了文件想撤銷

  1. 還沒add到暫存區時安全

    git checkout -- file
    複製代碼
  2. 已經add到暫存區了bash

    git reset HEAD <file>
    git checkout -- file
    複製代碼
  3. 你還commit上去了(那沒辦法,不能單純撤回一個文件了,只能回退整個倉庫版本了)

    git log #看上一個版本號是什麼
    git reset --hard commit_id #返回到上一個版本
    複製代碼
  4. 你還還把修改後的文件上傳到遠程倉庫了

    # 那你得趕忙用以前版本的代碼覆蓋掉
    git reset --hard commit_id
    # 修改並從新commit
    git commit -m "New commit message"
    # 強制上傳
    git push --force
    複製代碼

場景二: 刪除了文件

  1. 刪除原本版本庫裏的文件,而且不想更改

    git rm 
    git commit -m '我是真的要刪除'
    複製代碼
  2. 刪錯了想恢復

    git status # 看看誤刪的文件叫什麼名字
    git checkout -- file # 或者去回收站裏恢復
    複製代碼

場景三: 新電腦要鏈接遠程倉庫

pull到遠程倉庫,是須要有憑證的

  1. 第一步,建立SSH key

    ssh-keygen -t rsa -C "youremail@example.com"
    複製代碼
  2. 第二步,查看(在Mac上能夠直接在命令行輸入)

    cat id_rsa.pub
    複製代碼
  3. 第三步,在github或者gitee中設置>安全設置中輸入公鑰

  4. 第四步,查看是否有權限能鏈接

    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

複製代碼

image.png

## 所以咱們須要強制把遠程倉庫的代碼跟新到當前分支上面
git pull --rebase origin master
## 而後再push
git push -u origin master
複製代碼

場景六:工做一半,接到一個代號001的bug任務須要及時處理

此時很尷尬,你在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   
複製代碼

場景七: 將遠程dev和本地dev關聯起來

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學習闖關網站,但願能更好地幫助你們理解

至今發現的最好的 Git 動畫教程

文章參考連接:

相關文章
相關標籤/搜索