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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ProGit-读书简记

發(fā)布時(shí)間:2025/7/25 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ProGit-读书简记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ProGit-讀書簡記

from: http://lanbing510.info/2016/12/07/ProGit.html?ref=myread

寫在前面


Git是一個(gè)非常好的版本管理工具,最早是根據(jù)廖雪峰等人的博客進(jìn)行的學(xué)習(xí),一直只用到了一些常用的命令做簡單的備份回退等。最近結(jié)合《ProGit》和《Git權(quán)威指南》進(jìn)行了查漏補(bǔ)缺和更系統(tǒng)深入的學(xué)習(xí),下面是結(jié)合ProGit一書做的讀書簡記。

起步


1 初次運(yùn)行Git前的配置

Git 自帶一個(gè) git config 的工具來幫助設(shè)置控制 Git 外觀和行為的配置變量。這些變量存儲(chǔ)在三個(gè)不同的位置:

①. /etc/gitconfig 文件: 包含系統(tǒng)上每一個(gè)用戶及他們倉庫的通用配置。 如果使用帶有 --system 選項(xiàng)的git config 時(shí),它會(huì)從此文件讀寫配置變量。

②. ~/.gitconfig 或 ~/.config/git/config 文件:只針對(duì)當(dāng)前用戶。 可以傳遞 --global 選項(xiàng)讓 Git讀寫此文件。

③. 當(dāng)前使用倉庫的 Git 目錄中的 config 文件(就是 .git/config):針對(duì)該倉庫。

每一個(gè)級(jí)別覆蓋上一級(jí)別的配置,所以 .git/config 的配置變量會(huì)覆蓋 /etc/gitconfig 中的配置變量。在 Windows 系統(tǒng)中,Git 會(huì)查找 $HOME 目錄下(一般情況下是 C:\Users\$USER)的 .gitconfig 文件。Git 同樣也會(huì)尋找 /etc/gitconfig 文件,但只限于 MSys 的根目錄下,即安裝 Git 時(shí)所選的目標(biāo)位置。

2 git config --list命令可以列出所有Git當(dāng)時(shí)能找到的配置。

基礎(chǔ)


1 Git不同于其他版本控制系統(tǒng),Git是直接記錄快照,而不是差異比較。

2 Git有工作目錄、暫存(索引)區(qū)域、Git倉庫三種工作狀態(tài)(有時(shí)還有遠(yuǎn)程倉庫),關(guān)系見下圖。

3 用git status查看當(dāng)前文件狀態(tài),git status --short或者git status -s可輸出更簡潔的狀態(tài)。

新添加的未跟蹤文件前面有 ?? 標(biāo)記,新添加到暫存區(qū)中的文件前面有 A 標(biāo)記,修改過的文件前面有 M 標(biāo)記。你可能注意到了 M 有兩個(gè)可以出現(xiàn)的位置,出現(xiàn)在右邊的 M 表示該文件被修改了但是還沒放入暫存區(qū),出現(xiàn)在靠左邊的 M 表示該文件被修改了并放入了暫存區(qū)。

4 .gitignore文件中可以指定忽略模式,支持正則表達(dá)式。要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(!)取反。

5 查看已暫存和未暫存的修改。git diff比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容。若要查看已暫存的將要添加到下次提交里的內(nèi)容(和工作目錄中當(dāng)前文件的差異),可以用git diff --cached命令。(Git 1.6.1 及更高版本還允許使用 git diff --staged,效果是相同的,但更好記些。)

6 'git commit -a'可以跳過暫存區(qū)直接提交(跳過git add),但盡量避免使用。

7 移除文件。使用git rm移除。如果要移除的文件已經(jīng)修改過且暫存了,必須使用-f選項(xiàng)強(qiáng)制刪除。如果想要把文件從Git倉庫中刪除,但保留在工作目錄中,使用git rm --cached file。

8 重命名使用git mv file_from file_to。

9 查看提交歷史使用git log命令。下圖是其常用選項(xiàng):

一些例子如下:

git log -p -2 #顯示最近兩次提交每次提交的差異 git --stat #在每次提交的下面列出額所有被修改過的文件、有多少文件被修改了以及被修改 git log --pretty=format:"%h %s" --graph #提交對(duì)象的簡短哈希字串 提交說明 圖顯

限制輸出長度的選項(xiàng)有:

例如:

git log --since=2.weeks #列出所有最近兩周內(nèi)的提交 git log -Sfunction_name #找出添加或移除了某一個(gè)特定函數(shù)的引用的提交

10 遠(yuǎn)程倉庫的使用。可以使用git remote --help查看詳細(xì)使用說明。

git remote -v #顯示遠(yuǎn)程倉庫信息; git remote add [shortname] [url] #添加一個(gè)新的遠(yuǎn)程Git倉庫 git fetch [remote-name] #從遠(yuǎn)程倉庫中抓取,不同于git pull,并不會(huì)合并, git push [remote-name] [branch-name] #推送到遠(yuǎn)程倉庫 git remote show [remote-name] #查看遠(yuǎn)程倉庫 git remote rename [ori-name] [dst-name] #重命名 git remote rm [shortname] #移除

11 打標(biāo)簽。

git tag #列出標(biāo)簽 git tag -a v1.4 -m 'my version 1.4' #使用-a創(chuàng)建附注標(biāo)簽,-m指定存儲(chǔ)在標(biāo)簽中的信息 git show v1.4 #查看標(biāo)簽信息與對(duì)應(yīng)的提交信息 git tag v1.4-lw #創(chuàng)建輕量標(biāo)簽 git tag -a v1.2 9fceb02 #后期打標(biāo)簽,9fceb02是之前的一個(gè)提交 git push origin v1.5 #共享標(biāo)簽 git push origin --tags #一次推送多個(gè)標(biāo)簽 git checkout -b [branchname] [tagname] #在特定的標(biāo)簽上創(chuàng)建一個(gè)新分支

12 Git別名。

git config --global alias.co checkout #為checkout起別名co git config --global alias.last 'log -1 HEAD' #git last 顯示最后一次提交 git config --global alias.visual '!gitk' #想要執(zhí)行外部命令,而不是一個(gè) Git 子命令。在命令前面加入 ! 符號(hào)

Git分支


1 Git保存數(shù)據(jù)保存的是文件的快照,進(jìn)行提交操作是會(huì)提交一個(gè)對(duì)象,該對(duì)象包含一個(gè)指向暫存內(nèi)容快照的指針,還包含了作者的姓名和郵箱、提交時(shí)輸入的信息以及指向它的父對(duì)象的指針。內(nèi)容快照使用的blob對(duì)象來保存。下圖是個(gè)直觀展示,該Git 倉庫中有五個(gè)對(duì)象:三個(gè)blob對(duì)象(保存著文件快照)、一個(gè)樹對(duì)象(記錄著目錄結(jié)構(gòu)和blob對(duì)象索引)以及一個(gè)提交對(duì)象(包含著指向前述樹對(duì)象的指針和所有提交信息)。

2 常用命令:

git branch [branch_name] #創(chuàng)建分支 git checkout [branch_name] #切換分支 git checkout -b [branch_name] #新建并切換分支 git branch -d hotfix #刪除hotfix分支 git merge hotfix #合并hotfix分支,先切換到master分支。當(dāng)合并有沖突后,git status查看,修改后add,重新合并。 git branch --merged|--no-merged #過濾這個(gè)列表中已經(jīng)合并或尚未合并到當(dāng)前分支的分支

3 遠(yuǎn)程分支。origin是運(yùn)行g(shù)it clone時(shí)默認(rèn)的遠(yuǎn)程倉庫名字。如果運(yùn)行g(shù)it clone -o lanbing510,那么默認(rèn)的遠(yuǎn)程分支名字會(huì)是lanbing510/master。

git checkout --track origin/serverfix #本地創(chuàng)建serverfix分支來跟蹤遠(yuǎn)程倉庫上的serverfix分支 git checkout -b sf origin/serverfix #創(chuàng)建一個(gè)sf的本地分支來跟蹤遠(yuǎn)程倉庫serverfix分支 git checkout -u origin/serverfix #設(shè)置已有分支來跟蹤遠(yuǎn)程分支 git branch -vv #查看設(shè)置是所有跟蹤分支 git push origin --delete serverfix #刪除遠(yuǎn)程分支

4 變基。整個(gè)不同分支的修改有合并(merge)和變基(rebase)兩種方法。merge可以保留記錄,rebase使分支更清晰。使用變基友風(fēng)險(xiǎn),謹(jǐn)記:不要對(duì)在你的倉庫外有副本的分支執(zhí)行變基。

git rebase --onto master server client #取出 client 分支,找出處于 client 分支和 server 分支的共同祖先之后的修改,然后把它們?cè)?master 分支上重演一遍 git rebase master serve #取出serve分支,在master分支上重演

分布式Git


1 常見的分布式工作流程有:

① 集中式工作流

② 集成管理者工作流

③ 司令官與副官工作流。典型工作流程如下:

2 向一個(gè)項(xiàng)目貢獻(xiàn)

① 首先,你不會(huì)想要把空白錯(cuò)誤(根據(jù) git help diff 的描述,結(jié)合下面給出的圖片,空白錯(cuò)誤是指行尾的空格、Tab 制表符,和行首空格后跟 Tab 制表符的行為)提交上去。Git 提供了一個(gè)簡單的方式來檢查這點(diǎn):在提交前,運(yùn)行 git diff --check,它將會(huì)找到可能的空白錯(cuò)誤并將它們?yōu)槟懔谐鰜?#xff1b;

② 接下來,嘗試讓每一個(gè)提交成為一個(gè)邏輯上的獨(dú)立變更集;

③ 最后一件要牢記的事是提交信息。有一個(gè)創(chuàng)建優(yōu)質(zhì)提交信息的習(xí)慣會(huì)使 Git 的使用與協(xié)作容易的多。一般情況下,信息應(yīng)當(dāng)以少于50個(gè)字符(25個(gè)漢字)的單行開始且簡要地描述變更,接著是一個(gè)空白行,再接著是一個(gè)更詳細(xì)的解釋。

④ 一些常用命令

git log --no-merges issue54..origin/master #要求 Git 只顯示所有在后面分支(在本例中是origin/master)但不在前面分支(在本例中是 issue54)的提交的列表 git log origin/master --not issue54 #作用同上一條命令 git log refA refB --not refC #refA 或 refB 包含的但是不被 refC 包含的提交 git log master...experiment #三點(diǎn)語法,查看master 或者 experiment 中包含的但不是兩者共有的提交 git log --left-right master...experiment #還會(huì)顯示出每次提交位于哪一側(cè) git request-pull origin/master myfork #在派生項(xiàng)目中,生成拉取請(qǐng)求的內(nèi)容 git merge --no-commit --squash featureB #--squash 選項(xiàng)接受被合并的分支上的所有工作,并將其壓縮至一個(gè)變更集,使倉庫變成一個(gè)真正的合并發(fā)生的狀態(tài),而不會(huì)真的生成一個(gè)合并提交。這意味著你的未來的提交將會(huì)只有一個(gè)父提交,并允許你引入另一個(gè)分支的所有改動(dòng),然后在記錄一個(gè)新提交前做更多的改動(dòng)。同樣 --no-commit 選項(xiàng)在默認(rèn)合并過程中可以用來延遲生成合并提交 git format-patch -M origin/master #通過郵件的公開項(xiàng)目,使用該命令,format-patch 命令打印出它創(chuàng)建的補(bǔ)丁文件名字。-M 開關(guān)告訴 Git 查找重命名 cat *.patch |git imap-send #將patch通過郵箱發(fā)送出去,前提是.gitconfig中配置好了imap

3 維護(hù)項(xiàng)目

一些常用命令:

git apply xx.patch #應(yīng)用使用 git diff 或 Unix diff 命令(不推薦)創(chuàng)建的補(bǔ)丁 git apply --check xx.patch #應(yīng)用補(bǔ)丁之前檢查是否可以順利應(yīng)用 git am xx.patch #應(yīng)用使用format-patch生成的補(bǔ)丁 git diff master...contrib #三點(diǎn)語法,顯示自當(dāng)前特性分支與 master 分支的共同祖先起,該分支中的工作。 git archive master --prefix='project/' | gzip > `git describe master`.tar.gz #歸檔 git archive master --prefix='project/' --format=zip > `git describe master`.zip #歸檔 git shortlog --no-merges master --not v1.0.1 #制作提交簡報(bào)

Git進(jìn)階


1 儲(chǔ)藏與清理

下面是儲(chǔ)藏和清理的一些常用命令:

git stash #儲(chǔ)藏工作目錄,準(zhǔn)備干凈的合并 git stash list #查看儲(chǔ)藏的東西 git stash apply #應(yīng)用儲(chǔ)藏的東西 git stash apply stash@{2} #應(yīng)用更舊的儲(chǔ)藏 git stash drop stash@{0} #移動(dòng)指定的儲(chǔ)藏 git stash pop #應(yīng)用并丟棄儲(chǔ)藏 git stash --include-untracked -u #同時(shí)儲(chǔ)藏未跟蹤文件 git stash --keep-index #不儲(chǔ)藏任何你通過git add命令已暫存的東西 git stash branch [branch_name] #從儲(chǔ)藏創(chuàng)建一個(gè)分支 git clean #清理工作目錄 git stash --all #移除每一樣?xùn)|西并存放在棧中 git clean -x #做一次完全干凈的構(gòu)建而移除所有由構(gòu)建生成的.o 文件 git clean -f -d #強(qiáng)制移除工作目錄中所有未追蹤的文件以及空的子目錄,可以使用git clean -d -n來做一次演習(xí),看看要做什么

2 搜索

git grep -n gmtime_r #尋找gmtime_r并輸出所找到的匹配行行號(hào) git grep -count gmtime_r #使 Git 輸出概述的信息,僅僅包括哪些文件包含匹配以及每個(gè)文件包含了多少個(gè)匹配 git grep -p gmtime_r *.c #-p選項(xiàng)看匹配的行是屬于哪一個(gè)方法或者函數(shù),該命令是查看哪個(gè)函數(shù)調(diào)用了gmtime_r git grep --break --heading -n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0 #查看在舊版本 1.8.0 的 Git 代碼庫中定義了常量名包含 “LINK” 或者 “BUF_MAX” 這兩個(gè)字符串所在的行,--break 和 --heading 選項(xiàng)來使輸出更加容易閱讀 git log -L :git_deflate_bound:zlib.c #查看 zlib.c 文件中`git_deflate_bound` 函數(shù)的每一次變更

3 重寫歷史。

① git commit --amend修正最后一次提交。

② 修改多個(gè)提交信息。通過交互式變基工具,可以在任何想要修改的提交后停止,然后修改信息、添加文件或做任何想做的事情。可以通過給 git rebase 增加 -i選項(xiàng)來交互式地運(yùn)行變基。例如:

git rebase -i HEAD~3 #修改最近三次提交信息,運(yùn)行命令后會(huì)進(jìn)入交互式界面,按照提示進(jìn)行即可。

③ git rebase -i 同樣可以進(jìn)行排序提交,壓縮提交,拆分提交等操作,用到時(shí)可以詳細(xì)參考ProGit的相應(yīng)部分。

④ 如果想要通過腳本的方式改寫大量提交的話可以使用 filter-branch 例如,全局修改你的郵箱地址或從每一個(gè)提交中移除一個(gè)文件。例:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD #從整個(gè)提交歷史中移除一個(gè)叫做 passwords.txt 的文件

4 重置操作(reset)。

① git reset --soft只移動(dòng)分支,不更新暫存(索引)和工作目錄;

② git reset --mixed 不指定--soft和--hard時(shí)的默認(rèn)選項(xiàng),更新暫存,不更新工作目錄;

③ git reset --hard 更新暫存和工作目錄;

④ 通過路徑來重置。

git reset file.txt #等價(jià)于git reset --mixed HEAD file.txt ,用HEAD分支的file.txt更新暫存(索引)區(qū)域 git reset eb43bf file.txt #用eb43bf提交的file.txt更新索引

5 檢出(checkout)。

① 不帶路徑的情況。運(yùn)行 git checkout [branch] 與運(yùn)行 git reset --hard [branch] 非常相似,它會(huì)更新所有三棵樹使其看起來像 [branch],不過有兩點(diǎn)重要的區(qū)別:

首先不同于 reset --hard,checkout 對(duì)工作目錄是安全的,它會(huì)通過檢查來確保不會(huì)將已更改的文件吹走;

第二個(gè)重要的不同點(diǎn)在于如何更新 HEAD。reset 會(huì)移動(dòng) HEAD 分支的指向,而 checkout 只會(huì)移動(dòng) HEAD 自身來指向另一個(gè)分支。結(jié)合下圖會(huì)更清晰的理解:

② 帶路徑。運(yùn)行 checkout 的另一種方式就是指定一個(gè)文件路徑,這會(huì)像 reset 一樣不會(huì)移動(dòng) HEAD。它就像 git reset [branch] file那樣用該次提交中的那個(gè)文件來更新索引,但是它也會(huì)覆蓋工作目錄中對(duì)應(yīng)的文件。它就像是git reset --hard [branch] file(如果 reset 允許你這樣運(yùn)行的話)- 這樣對(duì)工作目錄并不安全,它也不會(huì)移動(dòng) HEAD。

6 重置和檢出的總結(jié)速查。下面的速查表列出了命令對(duì)樹的影響。"HEAD" 一列中的 "REF" 表示該命令移動(dòng)了 HEAD 指向的分支引用,而"HEAD" 則表示只移動(dòng)了 HEAD 自身。特別注意 WD Safe? 一列 - 如果它標(biāo)記為 NO,那么運(yùn)行該命令之前請(qǐng)考慮一下。

7 高級(jí)合并

① 合并出現(xiàn)沖突后,Git索引會(huì)儲(chǔ)藏了所有版本(共同的版本stage1,我們的版本stage2,他們的版本stage3)。

② 合并出現(xiàn)沖突后,可以打開沖突的文件,根據(jù)指示修改。

③ 一些常用命令:

git merge --abort #嘗試恢復(fù)到你運(yùn)行合并前的狀態(tài)。但當(dāng)運(yùn)行命令前,在工作目錄中有未儲(chǔ)藏、未提交的修改時(shí)它不能完美處理,除此之外它都工作地很好 git merge -Xignore-all-space -Xignore-space-change [branch_name] #忽略任意數(shù)量的已有空白的修改 或 忽略所有空白修改 git show :1:hello.rb > hello.common.rb #導(dǎo)出共同版本 git show :2:hello.rb > hello.ours.rb #導(dǎo)出我們的版本 git merge-file -p hello.ours.rb hello.common.rb hello.theirs.rb > hello.rb #手動(dòng)合并沖突修改后的文件,合并完畢后git clean來清理手動(dòng)合并創(chuàng)建但不再使用的文件 git diff --ours #合并前比較結(jié)果與在你的分支上的內(nèi)容,換一句話說,看看合并引入了什么 git diff --base #查看文件在兩邊是如何改動(dòng)的 git checkout --conflict=diff3 hello.rb #重新檢出文件并替換合并沖突標(biāo)記 git config --global merge.conflictstyle diff3 #通過設(shè)置 merge.conflictstyle 選項(xiàng)為 diff3 來做為以后合并沖突的默認(rèn)選項(xiàng) git log --oneline --left-right HEAD...MERGE_HEAD #得到此次合并中包含的每一個(gè)分支的所有獨(dú)立提交的列表 git log --oneline --left-right --merge #只顯示任何一邊接觸了合并沖突文件的提交 git revert -m 1 HEAD #-m 1 標(biāo)記指出 “mainline” 需要被保留下來的父結(jié)點(diǎn) git merge -Xours [branch_name] #選擇特定的一邊Ours并忽略另外一邊Theirs而不是讓你手動(dòng)合并沖突 git merge-file --ours #合并單個(gè)文件

8 rerere

git rerere功能是一個(gè)隱藏的功能。正如它的名字 "reuse recorded resolution" 所指,它允許你讓 Git 記住解決一個(gè)塊沖突的方法,這樣在下一次看到相同沖突時(shí),Git 可以為你自動(dòng)地解決它。為了啟用 rerere 功能,僅僅需要運(yùn)行這個(gè)配置選項(xiàng):git config --global rerere.enabled true也通過在特定的倉庫中創(chuàng)建 .git/rr-cache 目錄來開啟它,但是設(shè)置選項(xiàng)更干凈并且可以應(yīng)用到全局。

9 打包

git bundle create repo.bundle HEAD master #打包,如果你在打包時(shí)沒有包含 HEAD 引用,你還需要在命令后指定一個(gè) -b master 或者其他被引入的分支,否則Git 不知道應(yīng)該檢出哪一個(gè)分支 git clone repo.bundle repo #解包 git bundle create commits.bundle master #獲取在我們的 master 分支而不在原始倉庫中的提交

10 文件標(biāo)注

git blame -L 12,22 simplegit.rb #文件標(biāo)注,展示文件中每一行最后一次修改的提交 -L 選項(xiàng)來限制輸出范圍在第12至22行 git blame -C -L 141,153 GITPackUpload.m #在 git blame 后面加上一個(gè)-C,Git 會(huì)分析你正在標(biāo)注的文件,并且嘗試找出文件中從別的地方復(fù)制過來的代碼片段的原始出處

小注


本文對(duì)個(gè)人用戶基本用不到的鉤子、合并樹、憑證管理、搭建Git倉庫、底層命令等內(nèi)容沒做總結(jié),用到時(shí)可以直接閱讀原文。二八原則,掌握80%常用的內(nèi)容就可以熟練運(yùn)用Git,有需要的時(shí)候再繼續(xù)深入。最后,最好的學(xué)習(xí)方法就是實(shí)踐實(shí)踐再實(shí)踐,一定要多思考多實(shí)踐。

參考文獻(xiàn)


[1] ProGit Version 2. Scott Chacon and Ben Straub.

[2] Git權(quán)威指南. 蔣鑫.

[3] 阮一峰的網(wǎng)絡(luò)日志。

總結(jié)

以上是生活随笔為你收集整理的ProGit-读书简记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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