日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

git(一) 基础必备

發(fā)布時(shí)間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git(一) 基础必备 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

git是開(kāi)源的分布式文件管理系統(tǒng)

為什么說(shuō)是分布式呢?簡(jiǎn)單來(lái)說(shuō)就是除了集中式版本庫(kù),在各個(gè)開(kāi)發(fā)本地也保存一份版本庫(kù)。
這樣帶來(lái)了很多的優(yōu)點(diǎn),近乎所有操作都是本地執(zhí)行,因此速度相當(dāng)?shù)目?#xff0c;也可以在離線(xiàn)時(shí)進(jìn)行操作。

在Git的基礎(chǔ)上衍生出GitHub和GitLab這兩個(gè)非常流行的代碼托管平臺(tái),很多公司包括阿里云、去哪兒、攜程等都在GitLab平臺(tái)的基礎(chǔ)上做自己的二次開(kāi)發(fā)。

https://git-scm.com/book/zh/v2為pro git的中文地址,講解的非常好。
http://gitready.com/也是一個(gè)不錯(cuò)的git網(wǎng)站,針對(duì)常用場(chǎng)景寫(xiě)了很多短小但很優(yōu)秀的博客。

Git的存儲(chǔ)方式
? ? ? ?Git 更像是把數(shù)據(jù)看作是對(duì)小型文件系統(tǒng)的一系列快照。 在 Git 中,每當(dāng)你提交更新或保存項(xiàng)目狀態(tài)時(shí),它基本上就會(huì)對(duì)當(dāng)時(shí)的全部文件創(chuàng)建一個(gè)快照并保存這個(gè)快照的索引。 為了效率,如果文件沒(méi)有修改,Git 不再重新存儲(chǔ)該文件,而是只保留一個(gè)鏈接指向之前存儲(chǔ)的文件。 Git 對(duì)待數(shù)據(jù)更像是一個(gè) 快照流。
? ? ? ?每次提交,會(huì)生成一個(gè)commit對(duì)象指向一個(gè)tree對(duì)象(提交時(shí)所有文件的一個(gè)快照);tree按文件夾的結(jié)構(gòu)來(lái)排列,每個(gè)文件夾又是一個(gè)tree,每個(gè)文件指向一個(gè)blob對(duì)象。注意blob對(duì)象和文件并不完全等價(jià),Git認(rèn)為即使文件名不同只要文件內(nèi)容相同就是同一個(gè)blob,這樣節(jié)省了存儲(chǔ)空間。
? ? ? ?Git 中所有的數(shù)據(jù)在存儲(chǔ)前都計(jì)算校驗(yàn)和,即 SHA-1 散列(hash,哈希), 這是一個(gè)由 40 個(gè)十六進(jìn)制字符(0-9 和 a-f)組成的字符串,基于 Git 中文件的內(nèi)容或目錄結(jié)構(gòu)計(jì)算出來(lái),然后以校驗(yàn)和來(lái)引用。 這意味著不可能在 Git 不知情時(shí)更改任何文件內(nèi)容或目錄內(nèi)容。

git配置

git安裝方式
git --version 查看版本
git config --global user.name yushengjun 設(shè)置全局用戶(hù)名
git config --global user.email xxx@163.com 設(shè)置全局郵箱
git config --global --list 查看global下git的所有配置

git config --global color.ui auto 讓命令更具可讀性
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin" 設(shè)置git的默認(rèn)文本編輯器,這個(gè)還是挺有用的,畢竟命令行的編輯不好用

git常用操作


圖中index是按照git的術(shù)語(yǔ)稱(chēng)為索引,但是一般還是叫暫存區(qū),staging,用來(lái)存儲(chǔ)下次要commit的文件。

1. 獲取或創(chuàng)建git倉(cāng)庫(kù)

  • 在本地目錄初始化 Git 倉(cāng)庫(kù)
    git init把已有的項(xiàng)目代碼納入Git管理。git init your_project 會(huì)在當(dāng)前路徑下創(chuàng)建和項(xiàng)目名稱(chēng)同名的文件夾
  • 從其它服務(wù)器克隆已存在的倉(cāng)庫(kù)
    git clone https://github.com/libgit2/libgit2 http、https、ssh都是使用的智能協(xié)議。

2.提交

git add readme.txt git commit readme.txt -m '提交readme文件' git status git status -s

git add 這是個(gè)多功能命令:可以用它開(kāi)始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時(shí)把有沖突的文件標(biāo)記為已解決狀態(tài)等。 將這個(gè)命令理解為“精確地將內(nèi)容添加到下一次提交中”而不是“將一個(gè)文件添加到項(xiàng)目中”要更加合適。

git status 用來(lái)查看文件的狀態(tài)。
在 Changes not staged for commit 這行下面,說(shuō)明已跟蹤文件的內(nèi)容發(fā)生了變化,但還沒(méi)有放到暫存區(qū);
在 Changes to be committed 這行下面的,就說(shuō)明是已暫存狀態(tài),還沒(méi)提交到本地倉(cāng)庫(kù)
Untracked files 下面是沒(méi)有被跟蹤的文件。
使用 git status -s 命令,你將得到一種格式更為緊湊的輸出, 輸出中有兩欄,左欄指明了暫存區(qū)的狀態(tài),右欄指明了工作區(qū)的狀態(tài)。

3.比較工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)之間的差異

git diff 是比較工作區(qū)和暫存區(qū)之間的差異,亦可以比較要指定的文件
git diff --cached 比較暫存區(qū)和本地倉(cāng)庫(kù)之間的差異(因此文件必須先加到暫存區(qū))
git diff temp master -- 1.txt 比較1.txt這個(gè)文件temp分支和master分支最新一次提交之間的差異。其實(shí)這里分支也指向提交,所以我們也可以比較不同commit之間的差異(換成commit的唯一標(biāo)識(shí)值即可)。
git diff HEAD HEAD~2 -- 1.txt 比較1.txt和前兩次提交時(shí)的不同

4.移除文件

刪除文件git rm ,然后提交即可。 如果要?jiǎng)h除之前修改過(guò)或已經(jīng)放到暫存區(qū)的文件,則必須使用強(qiáng)制刪除選項(xiàng) -f

當(dāng)你忘記添加 .gitignore 文件,不小心把一個(gè)很大的日志文件添加到暫存區(qū)時(shí)
git rm --cached README把文件從 Git 倉(cāng)庫(kù)中刪除(也從暫存區(qū)域移除),但仍然保留在當(dāng)前工作目錄中

git mv file_from file_to 重命名文件

5.查看提交日志

git log 查看本地提交歷史
git log --oneline --all -n4 --graph --decorate oneline簡(jiǎn)略顯示提交歷史,all查看所有分支 ,n4最近4次的提交歷史 graph 圖形化查看
gitk 打開(kāi)圖形化工具,推薦使用sourceTree或idea自帶的
git log -S function_name 可以顯示那些添加或刪除了該方法的提交。
git log -p file 可以查看指定文件每次提交前后的修改內(nèi)容。還可以指定目錄查看指定目錄下的提交歷史

git log其實(shí)提供了非常豐富的日志查詢(xún)參數(shù),一下是記不住的,用到時(shí)積極查閱,才能得心應(yīng)手。

下面是要在 Git 源碼庫(kù)中查看 Junio Hamano 在 2008 年 10 月其間, 除了合并提交之外的哪一個(gè)提交修改了測(cè)試文件,可以使用下面的命令:

$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \--before="2008-11-01" --no-merges -- t/ 5610e3b - Fix testcase failure when extended attributes are in use acd3b9e - Enhance hold_lock_file_for_{update,append}() API f563754 - demonstrate breakage of detached checkout with symbolic link HEAD d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths 51a94af - Fix "checkout --track -b newbranch" on detached HEAD b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

6.撤銷(xiāo)操作

我們有時(shí)想回退版本,怎么辦呢?可以使用reset命令,來(lái)移動(dòng)head指針,變更本地倉(cāng)庫(kù)的版本。
這里有三個(gè)參數(shù),–soft --hard --mixed

  • git reset <commitId> --soft -- 2.txt 1.txt 變更本地倉(cāng)庫(kù)版本。工作區(qū)和暫存區(qū)不做變動(dòng)
  • git reset <commitId> -- 2.txt 1.txt 變更本地倉(cāng)庫(kù)版本和暫存區(qū),不變更工作區(qū)。不加參數(shù)就是默認(rèn)mixed
  • git reset <commitId> --hard -- 2.txt 1.txt 變更本地倉(cāng)庫(kù)版本、暫存區(qū)和工作區(qū)。(注意這個(gè)命令十分危險(xiǎn),會(huì)丟失你在工作區(qū)做的變更!!)

commitId指的是某次提交記錄,使用git reflog 查看所有提交歷史,可以方便的查找提交記錄進(jìn)行版本的回退和前進(jìn)。

將commitId換成head,可以實(shí)現(xiàn)另一些常用的功能:

  • 我們有時(shí)取消剛暫存的文件,怎么辦呢?
    git reset head -- 2.txt 1.txt 把2.txt和1.txt恢復(fù)成head,也可以不指定文件即復(fù)原所有文件

  • 如果想暫存區(qū)和工作區(qū)都恢復(fù)成最新一次提交的內(nèi)容該怎么辦呢?
    git reset --hard HEAD 將暫存區(qū)和工作區(qū)都恢復(fù)成最新一次提交的內(nèi)容。 回退到上上個(gè)版本 git reset --hard HEAD^^,直到HEAD~100。(注意這個(gè)命令十分危險(xiǎn),會(huì)丟失你在工作區(qū)做的變更!!)

  • 如果我們想恢復(fù)工作區(qū)的內(nèi)容和暫存區(qū)一樣,怎么操作呢?使用checkout
    git checkout -- 3.txt 丟棄工作區(qū)的修改,恢復(fù)和暫存區(qū)一樣。(注意這個(gè)命令比較危險(xiǎn),會(huì)丟失你在工作區(qū)做的變更!!)

記住,在 Git 中任何已提交的東西幾乎總是可以恢復(fù)的。 甚至那些被刪除的分支中的提交或使用 --amend 選項(xiàng)覆蓋的提交也可以恢復(fù) (數(shù)據(jù)恢復(fù))。 然而,任何你未提交的東西丟失后很可能再也找不到了。

7.遠(yuǎn)程倉(cāng)庫(kù)的使用

git remote <-v> 查看本地配置的遠(yuǎn)程倉(cāng)庫(kù)信息
git remote show <remote> 查看某一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的更多信息

git remote add origin git@github.com:xxx/git_test.git 在本地添加遠(yuǎn)程倉(cāng)庫(kù),并指定縮寫(xiě)origin來(lái)指代遠(yuǎn)程倉(cāng)庫(kù),git clone默認(rèn)是origin
git fetch <remote> 將數(shù)據(jù)下載到你的本地倉(cāng)庫(kù)——它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作
git pull 自動(dòng)抓取后合并該遠(yuǎn)程分支到當(dāng)前分支
git push <remote> <branch> 推送到遠(yuǎn)程服務(wù)器

8. 分支的管理

git里的分支非常簡(jiǎn)單,其實(shí)就是創(chuàng)建個(gè)指針指向提交對(duì)象,head也是個(gè)指針指向當(dāng)前分支。創(chuàng)建、切換、合并、刪除分支都是很常見(jiàn)的操作。

  • 創(chuàng)建、切換分支
    git branch testing 創(chuàng)建分支
    git checkout testing 切換分支,注意切換的時(shí)候要保證本地的修改已經(jīng)提交或stash,不然會(huì)切換失敗,這是git為了防止丟失你當(dāng)前工作區(qū)的修改
    git checkout -b testing 創(chuàng)建分支并切換過(guò)去,相當(dāng)于上面兩個(gè)命令的合并

    git log --oneline --decorate --graph --all 查看當(dāng)前分支情況

    git merge testing 把testing的修改合并到當(dāng)前分支,如果沒(méi)有分叉就是快進(jìn)(fast-forward)。如果有分叉且沖突了需要解決沖突,git add 表示沖突已解決,準(zhǔn)備提交了,要記得提交!

  • 刪除分支
    git branch -d hotfix 刪除分支,如果hotfix分支的代碼已經(jīng)合并到該分支,會(huì)成功刪除。否則會(huì)刪除失敗,強(qiáng)制刪除使用-D,這也是git為了防止你丟失hotfix的修改
    git branch --merged 查看已經(jīng)合并到當(dāng)前分支的分支。此命令下沒(méi)有*號(hào)的分支都是可以刪除的,因?yàn)樾薷囊呀?jīng)合并到當(dāng)前分支,不會(huì)丟失任何東西
    git branch --no-merged 查看有修改還沒(méi)合并到當(dāng)前分支的分支信息。這是-d刪除分支就會(huì)失敗

  • 遠(yuǎn)程分支
    git branch <-vv> 查看分支信息,和當(dāng)前所處分支
    git fetch origin --all 獲取遠(yuǎn)程倉(cāng)庫(kù)的信息
    git push <remote> <branch> 把本地新創(chuàng)建的分支推送到遠(yuǎn)程服務(wù)器上
    git checkout -b serverfix origin/serverfix 從遠(yuǎn)程服務(wù)器上拉取serverfix 分支到本地 ,這個(gè)命令很常用,所以有快捷方式git checkout --track origin/serverfix,甚至git checkout serverfix即可
    git branch -u origin/serverfix 讓本地分支跟蹤遠(yuǎn)程分支
    git push origin --delete serverfix 刪除遠(yuǎn)程分支

  • 9. 標(biāo)簽

    git tag 列出標(biāo)簽
    git tag --list '*1.0' 搜索1.0結(jié)尾的標(biāo)簽
    git show v1.4 可以查看這個(gè)標(biāo)簽的信息

    Git 支持兩種標(biāo)簽:
    輕量標(biāo)簽(lightweight)很像一個(gè)不會(huì)改變的分支——它只是某個(gè)特定提交的引用。
    附注標(biāo)簽(annotated) 是存儲(chǔ)在 Git 數(shù)據(jù)庫(kù)中的一個(gè)完整對(duì)象, 它們是可以被校驗(yàn)的,其中包含打標(biāo)簽者的名字、電子郵件地址、日期時(shí)間, 此外還有一個(gè)標(biāo)簽信息,并且可以使用 GNU Privacy Guard (GPG)簽名并驗(yàn)證。 通常會(huì)建議創(chuàng)建附注標(biāo)簽,這樣你可以擁有以上所有信息。
    git tag -a v1.4 -m "my version 1.4" 附注標(biāo)簽必須帶上-a ,而且必須輸入一條備注信息。輕量標(biāo)簽直接git tag v1.0即可
    git tag -a v1.2 9fceb02 在之前的某次提前打上標(biāo)簽
    git push origin <tagname> 默認(rèn)情況下,git push 命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器上。 在創(chuàng)建完標(biāo)簽后你必須顯式地推送標(biāo)簽到共享服務(wù)器上

    總結(jié)

    以上是生活随笔為你收集整理的git(一) 基础必备的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。