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

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

生活随笔

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

编程问答

这才是真正的Git——Git实用技巧

發(fā)布時(shí)間:2024/2/28 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这才是真正的Git——Git实用技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:lzaneli,騰訊 TEG 前端開(kāi)發(fā)工程師

本篇是這個(gè)系列的最后一篇文章,之前的文章主要講的是基礎(chǔ)原理部分(見(jiàn)上方專輯),在理解原理的基礎(chǔ)上,介紹一些實(shí)用的技巧給大家,希望能提高大家的開(kāi)發(fā)效率。

這篇文章因?yàn)楦嗟氖橇信e實(shí)際應(yīng)用的技巧,所以文章結(jié)構(gòu)會(huì)顯得散亂一些,也不會(huì)像前兩篇文章那樣要求大家順序閱讀。每個(gè)點(diǎn)都是互相獨(dú)立的,大家可以根據(jù)自己的需要學(xué)習(xí)。

在這篇文章里我會(huì)使用操作錄屏的方式來(lái)介紹例子,希望這種方式可以讓你更直觀的了解命令的使用方法。

將幾個(gè)commit壓縮成一個(gè)

?? 這里有一點(diǎn)要特別注意的是:rebase會(huì)導(dǎo)致新的commit節(jié)點(diǎn)產(chǎn)生,所以切記不要對(duì)多人共用的遠(yuǎn)端分支進(jìn)行rebase。

rebase -i 是個(gè)很實(shí)用且應(yīng)用廣泛的工具,希望大家都學(xué)會(huì)它的使用。它還可以用來(lái)修改commit信息,拋棄某些commit,對(duì)commit進(jìn)行排序等等。具體命令如下,操作方式跟動(dòng)圖一致,都是在vim里面進(jìn)行編輯。這里不展開(kāi),感興趣的同學(xué)可以自己操作一下。

# Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] # . create a merge commit using the original merge commit's # . message (or the oneline, if no original merge commit was # . specified). Use -c <commit> to reword the commit message.

另外如果要合并的是最近的幾個(gè)commit,我們還可以用git reset --soft HEAD~3 && git commit -m 'xxx'來(lái)實(shí)現(xiàn)。對(duì)這個(gè)有問(wèn)題的同學(xué)可以參照Git內(nèi)部原理強(qiáng)調(diào)的可視化方法思考一下。

找回丟失的commit節(jié)點(diǎn)或分支

像上一步rebase后發(fā)現(xiàn)不符合預(yù)期,如何恢復(fù)?不小心刪除了一個(gè)分支,如何找回?

“學(xué)會(huì)這個(gè)技能,你的同事會(huì)請(qǐng)你喝奶茶的,而且說(shuō)不定還能收獲妹子。” ?—— 來(lái)自往期課程的某位同學(xué)

主要思路為:找到要返回的commit object的哈希值,然后執(zhí)行g(shù)it reset恢復(fù)

我們知道Git的出現(xiàn)就是為了盡量保證我們的操作不被丟失,在Git內(nèi)部原理中我們講過(guò),git object是旦被創(chuàng)建,就不可變更,所以只要找到它對(duì)應(yīng)的哈希值,就能找回。但是ref呢?在Git內(nèi)部原理中我們也講過(guò),它是一個(gè)可變的指針,比如說(shuō)你在master中提交了一個(gè)commit,那當(dāng)前的master這個(gè)ref就會(huì)指向新的commit object的哈希值。reflog 就是將這些可變指針的歷史給記錄下來(lái),可以理解成 ref的log,也可以理解成 版本控制的版本控制

獲得一個(gè)干凈的工作空間

當(dāng)我們實(shí)驗(yàn)一種思路,或者跟朋友講代碼時(shí),我們可能會(huì)隨意的修改代碼。而當(dāng)我們回到正常的開(kāi)發(fā)時(shí),我們需要一個(gè)干凈的工作目錄,即保證目前工作目錄跟Git最后一次commit的文件是一致的。我們可以怎么做?

盡量少用會(huì)丟失文件的操作,除非你能夠確定不再需要這些文件。

修改最近一個(gè)commit

commit完發(fā)現(xiàn)有一些臨時(shí)的log忘記去掉?有一些文件忘記添加?commit信息出現(xiàn)錯(cuò)別字?

也可以使用 git reset HEAD~,然后執(zhí)行你需要的修改,再commit即可,同上面介紹的命令效果是相同的。

提交一個(gè)文件中的部分修改

Git interactive add 還有很多功能,也推薦大家有時(shí)間可以嘗試一下。

禁止修改多人共用的遠(yuǎn)端分支

如果一條遠(yuǎn)端分支有多人共用,那么不要在上面執(zhí)行reset、rebase等會(huì)修改這條分支已經(jīng)存在的commit object的命令。

具體的解釋參照這篇文章 Rebase and the golden rule explained 。

撤銷一個(gè)合并

如果是一個(gè)本地分支,僅需git reset --hard <合并前的SHA1>即可。

如果這個(gè)分支已經(jīng)被推送到遠(yuǎn)端,比如說(shuō)合并進(jìn)master,發(fā)到線上才發(fā)現(xiàn)有bug需要回滾。這時(shí)分支有可能已經(jīng)被其他人所使用,根據(jù)“禁止修改多人共用的遠(yuǎn)端分支”,你需要執(zhí)行g(shù)it revert -m 1 <合并的SHA1>,新增一個(gè)revert節(jié)點(diǎn),如下圖中的E'。

但要注意不要在原特性分支繼續(xù)開(kāi)發(fā),而應(yīng)該刪除原來(lái)的分支,從E'節(jié)點(diǎn)拉出新分支做bug修復(fù)等。

如果在原特性分支上繼續(xù)開(kāi)發(fā),則在合并回master的時(shí)候需要做一次revert操作revert掉E'節(jié)點(diǎn),變成E‘’(如下圖),不然很容易出現(xiàn)丟失文件等問(wèn)題。具體原因分析參照分支合并中的總結(jié)。

從整個(gè)歷史中刪除一個(gè)文件

代碼要開(kāi)源了,但發(fā)現(xiàn)其中包括密鑰文件或內(nèi)網(wǎng)ip怎么辦?

git?filter-branch?--tree-filter?'rm?-f?passwords.txt'?HEAD

可以使用filter-branch命令,它的實(shí)現(xiàn)原理是將每個(gè)commit checkout出來(lái),然后執(zhí)行你給它的命令,像上面的rm -f passwords.txt,然后重新commit回去。

?? 這個(gè)操作屬于高危操作,會(huì)修改歷史變更記錄鏈,產(chǎn)生全新的commit object。所以執(zhí)行前請(qǐng)通知倉(cāng)庫(kù)的所有開(kāi)發(fā)者,執(zhí)行后所有開(kāi)發(fā)者從新的分支繼續(xù)開(kāi)發(fā),棄用以前的所有分支。

其他好用的命令

下面這些命令也是比較實(shí)用的命令,感興趣的同學(xué)可以自己學(xué)習(xí)一下。

  • git bisect 二分查找出現(xiàn)問(wèn)題的變更節(jié)點(diǎn),比如你發(fā)現(xiàn)當(dāng)前提前下測(cè)試是不通過(guò)的,但HEAD~10(10個(gè)提交前)的測(cè)試是可以通過(guò)的,就可以用git bisect 來(lái)幫你定位到出現(xiàn)問(wèn)題的變更點(diǎn)。

  • git blame 查看某行代碼最后是誰(shuí)修改的。

  • git show-branch 直觀的展示多條分支間的關(guān)系。

  • git subtree 拆分或合并倉(cāng)庫(kù)。


希望大家讀完有所收獲。感興趣的同學(xué)可以閱讀同系列的其他文章:

  • 這才是真正的Git——Git內(nèi)部原理

  • 這才是真正的Git——分支合并

參考

  • 書籍 Scott Chacon, Ben Straub - Pro Git-Apress (2014)

  • 書籍 Jon Loeliger, Matthew McCullough - Version Control with Git, 2nd Edition - O’Reilly Media (2012)

  • Rebase and the golden rule explained

總結(jié)

以上是生活随笔為你收集整理的这才是真正的Git——Git实用技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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