一頁(yè)Git基礎(chǔ)

很多人都有這樣的感慨!要是人生能重來(lái),會(huì)有不一樣的人生…… 也許時(shí)間可以穿梭,那也只能是記憶,至少現(xiàn)階段是這樣,或許有一天真的會(huì)有時(shí)光穿梭機(jī)…… 相對(duì)于人生的這種遺憾,Git給code的一生帶來(lái)了太多的驚嘆,記錄著code每一次提交的變化,讓code可以有不一樣的碼生,更是可以讓code穿梭到生命的任意時(shí)刻。Perfect……

1. 工作流程

工作流程
  • workspace 工作區(qū)
  • index/stage 緩存區(qū)/暫存區(qū)
  • repository 倉(cāng)庫(kù)區(qū)/本地倉(cāng)庫(kù)
  • remote 遠(yuǎn)程倉(cāng)庫(kù)

2. 安裝配置(Mac)

#mac 下使用 homebrew 安裝 @2.25.0指定版本,如果不指定則安裝最新版本
brew install git@2.25.0

#使用git提交文件/代碼時(shí),會(huì)附帶上當(dāng)前操作者信息,author和commiter
#默認(rèn)的格式為:user.name<user.email>es:Author: zhaosl <zhaoshoulai@aliyun.com>
#在git中查看歷史時(shí),會(huì)通過(guò)操作者信息來(lái)確定誰(shuí)修改了哪些文件/代碼
#user.email和user.email在git config中定義
#git config有全局配置和當(dāng)前倉(cāng)庫(kù)配置之分。
#若當(dāng)前倉(cāng)庫(kù)中的git config未定義user.name和user.email,則取全局git config中的user.email和user.email。若定義了,則取當(dāng)前倉(cāng)庫(kù)git config中的user.email和user.email

#配置全局 user.name
git config --global user.name "zhaosl"
#配置全局郵箱
git config --global user.email "zhaoshoulai@aliyun.com"

#查看全局配置
git config --local  --list

3. 一個(gè)人玩

3.1 配置遠(yuǎn)程倉(cāng)庫(kù)

1. 創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)(gitee)

  1. 注冊(cè) gitee

  2. 點(diǎn)擊右上角 + 新建倉(cāng)庫(kù)

  3. 填寫(xiě)倉(cāng)庫(kù)名稱(chēng)、歸屬、路徑、倉(cāng)庫(kù)介紹、是否開(kāi)源、選擇語(yǔ)言、添加.gitIgnore文件、選擇初始化這個(gè)庫(kù)的方式、選擇git-flow(怎么選擇比較合適的flow后面會(huì)涉及到)

  4. 點(diǎn)擊“創(chuàng)建按鈕” 就創(chuàng)建好了 es:https://gitee.com/qzhd/git-note.git

    注:遠(yuǎn)程倉(cāng)庫(kù)是必須創(chuàng)建的

2. 添加ssh公鑰

如果不加入ssh公鑰,每次訪(fǎng)問(wèn)遠(yuǎn)程倉(cāng)庫(kù)都需要輸入用戶(hù)名密碼,為了省去該麻煩,我們需要在gitee上添加自己的公鑰;首先生成公鑰:

#這里填寫(xiě)自己的郵箱,其實(shí)這里和git配置的郵箱一致不一致沒(méi)有什么關(guān)系
ssh-keygen -t rsa -C "zhaoshoulai@aliyun.com" 
#查看SSH公鑰,復(fù)制備用,你會(huì)看到一大串
cat ~/.ssh/id_rsa.pub
  • 添加公鑰
  1. 在右上角自己頭像附近的三角號(hào)下拉點(diǎn)擊設(shè)置

  2. 在左導(dǎo)航--安全設(shè)置--SSH公鑰

  3. 寫(xiě)一個(gè)標(biāo)題(比如是用自己的電腦可以寫(xiě)my-mac) 公鑰就粘貼自己復(fù)制的公鑰

    注:不同電腦都需要免密要訪(fǎng)問(wèn),那么就需要每個(gè)電腦都需要添加自己的SSH公鑰

3.2 新建本地倉(cāng)庫(kù)

  • 本地新建倉(cāng)庫(kù)

    #第一步 創(chuàng)建一個(gè)本地版本庫(kù) git-note 并進(jìn)入(其實(shí)就是一個(gè)目錄)
    mkdir git-note & cd git-note
    #初始化 這時(shí)候才是真正意義上由一個(gè)目錄轉(zhuǎn)變?yōu)楸镜貍}(cāng)庫(kù)
    #注意,執(zhí)行完初始化命令,會(huì)在給目錄下多一個(gè).git目錄,該目錄就是本地倉(cāng)庫(kù)的核心,表亂動(dòng)
    git init
    #或者直接 git init git-note 更省事
    
  • clone遠(yuǎn)程倉(cāng)庫(kù)

    #默認(rèn)克隆下來(lái)遠(yuǎn)程倉(cāng)庫(kù),但只有master分支,本地也創(chuàng)建了master分支并與遠(yuǎn)程master分支建立映射追蹤
    git clone git@gitee.com:qzhd/git-note.git
    

3.3 建立本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)的聯(lián)系

  • 針對(duì)本地已有版本庫(kù)

    #初始化(會(huì)做很多工作:創(chuàng)建緩存區(qū)、本地倉(cāng)庫(kù);直觀(guān)上你會(huì)看到一個(gè).git目錄)
    git init
    #建立遠(yuǎn)程地址的別名:origin代表git@gitee.com:qzhd/git-note.git(這個(gè)是我一個(gè)遠(yuǎn)程倉(cāng)庫(kù)地址)
    #如果你這個(gè)項(xiàng)目托管到多個(gè)代碼平臺(tái)es:githup、gitee等,你可以分別創(chuàng)建不同的別名
    #如果你是clone下來(lái)的項(xiàng)目 不需要執(zhí)行下面這條命令
    #如果你是自己初始化項(xiàng)目(git init) 且沒(méi)有創(chuàng)建過(guò)該別名與遠(yuǎn)程倉(cāng)庫(kù)的映射 則需要執(zhí)行
    git remote add origin git@gitee.com:qzhd/git-note.git
    #分支 'master' 設(shè)置為跟蹤來(lái)自 'origin' 的遠(yuǎn)程分支 'master'
    git branch --set-upstream-to=origin/master master
    #把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,使用 git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。執(zhí)行此命令后會(huì)要求輸入用戶(hù)名、密碼,驗(yàn)證通過(guò)后即開(kāi)始上傳,如果加入了sshkey,不會(huì)要求輸入用戶(hù)名密。
    git push -u origin master
    #git push 有可能報(bào)錯(cuò),會(huì)讓你先git pull,前分支的最新提交落后于其對(duì)應(yīng)的遠(yuǎn)程分支也會(huì)報(bào)錯(cuò)
    #fatal: 拒絕合并無(wú)關(guān)的歷史 Note about fast-forwards 可以執(zhí)行下面指令,然后在git push
    git pull origin master --allow-unrelated-histories
    
  • 新建分支與遠(yuǎn)程分支建立聯(lián)系

    #創(chuàng)建一個(gè)分支并切換到該分支(如果已經(jīng)存在該分支則不要加 -b )
    #注意這個(gè)會(huì)在當(dāng)前分支上創(chuàng)建develop分支,一般會(huì)指定master哦
    #git checkout -b develop master
    git checkout -b develop
    #分支 'develop' 設(shè)置為跟蹤來(lái)自 'origin' 的遠(yuǎn)程分支 'develop'
    git branch --set-upstream-to=origin/develop develop
    #git pull & git push 就不用帶著origin develop 了 ^_^!
    
    #or 如果遠(yuǎn)程倉(cāng)庫(kù)有某個(gè)分支,比如develop分支
    #develop本地倉(cāng)庫(kù)分支(可以自定義名字,但最好和遠(yuǎn)程倉(cāng)庫(kù)名稱(chēng)保持一致) origin/develop 遠(yuǎn)程分支
    git checkout -b develop origin/develop
    #or 使用-t參數(shù),默認(rèn)會(huì)在本地建立一個(gè)和遠(yuǎn)程分支名字一樣的分支
    git checkout -t origin/develop
    

3.4 修改操作

  • 添加文件 --> 緩存區(qū) --> 本地倉(cāng)庫(kù) --> 遠(yuǎn)程倉(cāng)庫(kù)

    #第一步 創(chuàng)建一個(gè)文件 workspace發(fā)生了變化
    touch test & echo "create test file" > test
    #查看變動(dòng)信息(紅色表示未添加到index,綠色表示已經(jīng)添加到index但沒(méi)有提交到本地倉(cāng)庫(kù))
    git status
    #第二步 加入到暫存區(qū)(維護(hù)修改記錄)workspace的變化維護(hù)到index
    git add test # 或者 git add .  “.” 表示所有文件
    #第三步 修改記錄提交到本地倉(cāng)庫(kù) 這里我們使用git commit -m'描述信息'簡(jiǎn)單的提交,
    #后續(xù)展開(kāi)更多commit用戶(hù)及使用規(guī)范
    git commit -m'add(test):add a file named test'
    # push到遠(yuǎn)程倉(cāng)庫(kù)別名為origin的develop分支
    git push origin develop
    
  • 修改文件到本地倉(cāng)庫(kù)

    #修改test 添加一句話(huà)
    echo "first update test file" >> test
    #可以看一下test文件的變化, 可以看到 +first update test file
    #a/test:修改之前  b/test:修改之后
    git diff test
      diff --git a/test b/test
      index f0324dd..94a7431 100644
      --- a/test
      +++ b/test
      @@ -1 +1,2 @@
       create test file
      +first update test file
    
    #可以看出來(lái)workspace的修改提交到本地倉(cāng)庫(kù),一般套路就是add -> commit
    git add .
    git commit -m'feat(test):add a word to test'
    # push到遠(yuǎn)程倉(cāng)庫(kù)別名為origin的develop分支
    git push origin develop
    

3.5 查看信息總結(jié)

#顯示變更的文件
git status
#顯示當(dāng)前分支的版本歷史
git log
#根據(jù)關(guān)鍵詞搜索提交歷史
git log -S <關(guān)鍵詞>
#顯示所有提交過(guò)的用戶(hù),按照提交次數(shù)排序
git shortlog -sn
#顯示指定文件是什么人,什么時(shí)間改過(guò)
git blame <file>
#顯示暫存區(qū)和工作區(qū)的差異
git diff
#顯示暫存區(qū)和上一個(gè)commit的差異
git diff --cached <file>
#顯示工作區(qū)域最新commit的差異
git diff HEAD
#顯示兩次commit的不同
git diff HEAD HEAD~2
#顯示你今天寫(xiě)了多少行代碼
git diff master --shortstat "@{0 day ago}"
#顯示當(dāng)前分支的最近幾次提交
git reflog

3.6 回退、恢復(fù)

1. 回退、恢復(fù)某版本(commit)

  • 查看提交歷史記錄

    #可以看到 兩次提交記錄,這里也可以看到 描述信息、Author:user.name user.email
    git log
      commit a34a2a12d4da7f5bf935369764a4baa572cbfe10 (HEAD -> master)
      Author: zhaosl <zhaoshoulai@aliyun.com>
      Date:   Sun Apr 5 12:48:33 2020 +0800
    
          feat(test): add one word to test
    
      commit e7348eecdf40a278f61a13837aff4c1b90dc0ce6
      Author: zhaosl <zhaoshoulai@aliyun.com>
      Date:   Sun Apr 5 11:50:44 2020 +0800
    
          add(test):add a file named test
    #如果嫌棄現(xiàn)實(shí)的內(nèi)容過(guò)多,可以看一下git log更詳細(xì)的用法,我這里只是入門(mén),不討論那么細(xì)
    git log --pretty=oneline
      a34a2a12d4da7f5bf935369764a4baa572cbfe10 (HEAD -> master) feat(test): add one word to test
      e7348eecdf40a278f61a13837aff4c1b90dc0ce6 add(test):add a file named test
    
  • 回退到某個(gè)版本

    #回退到上一個(gè)版本 HEAD~n  n=1,2,3……
    git reset --hard HEAD^ # git reset --hard HEAD~1
    #可以看到現(xiàn)在回退到上一個(gè)版本了
    git log --pretty=oneline
      e7348eecdf40a278f61a13837aff4c1b90dc0ce6 (HEAD -> master) add(test):add a file named test
    
    or
    
    #git reset --hard 版本號(hào) 和 git reset --hard HEAD^ 效果是一樣的
    #版本號(hào)可以不寫(xiě)這么長(zhǎng),前幾位就可以 es: e7348eec
    git reset --hard e7348eecdf40a278f61a13837aff4c1b90dc0ce6
    
  • 恢復(fù)到某個(gè)版本

    #現(xiàn)在使用git log只能看到一個(gè)版本
    git log --pretty=oneline
      e7348eecdf40a278f61a13837aff4c1b90dc0ce6 (HEAD -> master) add(test):add a file named test
    #我想恢復(fù)到退回之前的版本,怎么辦?首先得知道回退之前的版本是什么?
    #git reflog能查到每次回退和恢復(fù);a34a2a1 就是回退之前的版本了
    git reflog
      e7348ee (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
      a34a2a1 HEAD@{1}: commit: feat(test): add one word to test
      e7348ee (HEAD -> master) HEAD@{2}: commit (initial): add(test):add a file named test
    #恢復(fù)到 a34a2a1
    git reset --hard a34a2a1
    #再用git log 看一下,恢復(fù)了
    git log --pretty=oneline
      a34a2a12d4da7f5bf935369764a4baa572cbfe10 (HEAD -> master) feat(test): add one word to test
      e7348eecdf40a278f61a13837aff4c1b90dc0ce6 add(test):add a file named test
    

2. 撤銷(xiāo)修改和刪除文件

  • 撤銷(xiāo)修改

    #如果上一次commit之后修改都需要撤銷(xiāo)
    git reset --hard HEAD^
    
    #如果修改了很多文件,只有一個(gè)文件需要撤銷(xiāo) -- 前后都有空格 否則就是切換分支了
    #git checkout -- 撤銷(xiāo)修改有兩種情況:(注意)
    #1. file修改后,還沒(méi)有放到暫存區(qū),使用撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài)。
    #2. file已經(jīng)放入暫存區(qū)了,接著又作了修改,撤銷(xiāo)修改就回到添加暫存區(qū)后的狀態(tài)
    git checkout -- file
    
  • 刪除版本庫(kù)文件

    #如果知道要?jiǎng)h掉那些內(nèi)容()
    rm -rf 文件
    git add .
    git commit -m''
    
    #同時(shí)從工作區(qū)和索引中刪除文件。即本地的文件也被刪除了 = rm -rf 文件 & git add .
    git rm 文件
    #從索引中刪除文件。但是本地文件還存在, 只是不希望這個(gè)文件被版本控制
    git rm --cached 文件 
    #但無(wú)論是那種最后都需要 git commit
    

3.7 本地分支管理

#查看分支
git branch
#創(chuàng)建分支
git branch <name>
#創(chuàng)建分支指向指定commit
git branch <name> <commitId>
#切換分支
git checkout <name>
#從當(dāng)前分支創(chuàng)建branch,并切換到該分支
git checkout -b <name>
#從某個(gè)分支創(chuàng)建branch 并切換到該分支
git checkout -b <new-branch-name> <branch-name>
#從某個(gè)tag創(chuàng)建一個(gè)分支
git checkout -b <branch-name> <tag-name>
#合并某分支到當(dāng)前分支
git merge <name>
#選擇一個(gè)commitId合并進(jìn)當(dāng)前分支
git cherry-pick <comitId>
#切換分支
git checkout <name>
#刪除本地分支
git branch -d develop

#### 遠(yuǎn)程分支操作 ####

# 列出所有遠(yuǎn)程分支
git branch -r 
#從當(dāng)前本地分支新建遠(yuǎn)程分支
git push -u origin <branch-name>
#刪除遠(yuǎn)程分支
git push origin --delete <branch-name>
#或者
git branch -dr <branch-name>

3.4 tag管理

tag和branch的區(qū)別是,tag是快照,不可以回退、修改等操作,就是當(dāng)時(shí)那個(gè)時(shí)刻的一個(gè)狀態(tài);branch是可以回退、修改等操作。tag的作用一般是發(fā)布一個(gè)版本如Snapshot、Release 、v2.3.0等等。所以tag是建立在某次commit的上的。

#列出所有tag
git tag
#在當(dāng)前commit上新建tag
git tag <name>
#在指定commitId上創(chuàng)建tag
git tag <name> <commitId>
#刪除本地tag
git tag -d <name>
#刪除遠(yuǎn)程tag
git push origin :refs/tags/<name>
#查看tag信息
git show tag
#提交指定tag
git push origin <name>
#提交所有的tag
git push origin --tags
#從某個(gè)tag創(chuàng)建一個(gè)分支
git checkout -b <branch-name> <tag-name>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 開(kāi)始: 1) 遠(yuǎn)程倉(cāng)庫(kù)相關(guān)命令 檢出倉(cāng)庫(kù):$ git clone git://github.com/jquery/...
    草根老張閱讀 915評(píng)論 0 50
  • Git 是目前最流行的分布式版本控制系統(tǒng)之一。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,506評(píng)論 0 7
  • 1.GitHub 有什么用 學(xué)習(xí)優(yōu)秀的開(kāi)源項(xiàng)目開(kāi)源社區(qū)一直有一句流行的話(huà)叫「不要重復(fù)發(fā)明輪子」,某種意義上正是因?yàn)?..
    Clemente閱讀 1,547評(píng)論 1 14
  • 1. GIT命令 git init在本地新建一個(gè)repo,進(jìn)入一個(gè)項(xiàng)目目錄,執(zhí)行g(shù)it init,會(huì)初始化一個(gè)re...
    江邊一蓑煙閱讀 889評(píng)論 0 0
  • 前言 Git使用教程 Git是什么 Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目。 ...
    90后的思維閱讀 1,026評(píng)論 0 0

友情鏈接更多精彩內(nèi)容