走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧
點(diǎn)擊“小詹學(xué)Python”,選擇“置頂”公眾號
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)載自機(jī)器之心,禁二次轉(zhuǎn)載
本文介紹了七十多種常用的 Git 命令與技巧,項(xiàng)目作者削微寒在開源工作上也做了非常多的貢獻(xiàn)。目前 Git 奇技淫巧項(xiàng)目已經(jīng)獲得了 6.8K 的 Star,他還構(gòu)建了另一個(gè) 1.1W+ 的開源項(xiàng)目集錦 HellowGitHub。
Git 項(xiàng)目地址:https://github.com/521xueweihan/git-tips
HelloGitHub 項(xiàng)目地址:https://github.com/521xueweihan/HelloGitHub
Git 是一個(gè)「分布式版本管理工具」,版本管理工具即:我們在寫文章的時(shí)候都用「撤回」這個(gè)功能,但撤回只能做做到回撤幾步,假如想要找到三天前的更改記錄,光用「撤回」是不行的。而「版本管理工具」能記載每次的更改痕跡,只要上傳到版本倉庫,我們就能找到之前任何時(shí)刻的文本狀態(tài)。
對于 ML 開發(fā)者而言,版本控制也是必不可少的。如果我們寫了個(gè)初版模型,并上傳至 GitHub 私人或公共倉庫,那么每當(dāng)我們有一些更改,都可以通過 Git 上傳,它會自動(dòng)控制這些歷史版本。如果說后面發(fā)現(xiàn)前面的某些超參數(shù)或結(jié)構(gòu)非常好,那么查看歷史版本也是很好的。
對于其它開源工作的管理,Git 就更好用了。因?yàn)樗且环N分布式版本控制系統(tǒng),并沒有一個(gè)真正的「中心服務(wù)器」,所以不同的電腦間有相同的版本庫,本地版本庫損壞了就直接從其它完好的版本庫復(fù)制。這種 Git,才是協(xié)作開發(fā)代碼的最優(yōu)方法,因此基于 Git 的 GitHub 才成為開源世界中不可獲取的部分。
下面,文章主要就是列舉了常用的 Git 命令和小技巧,讀者可以在原 GitHub 項(xiàng)目上進(jìn)行「頁面內(nèi)查找」,也可以在微信文章頁面上選擇「搜索頁面內(nèi)容」。
開卷必讀
如果之前未了解過 Git,可以看看這一個(gè) Git 小白教程:http://rogerdudler.github.io/git-guide/index.zh.html。
1. 一定要先測試 Git 命令的效果,再用于工作環(huán)境,以防造成不可彌補(bǔ)的后果!
2. 所有命令都在 git version 2.7.4 (Apple Git-66) 環(huán)境下測試通過
3. 統(tǒng)一概念:
工作區(qū):增刪文件和內(nèi)容
暫存區(qū):鍵入命令 git add 改動(dòng)的文件,此次改動(dòng)就放到了 『暫存區(qū)』
本地倉庫 :鍵入命令 git commit ,此次改動(dòng)就放到了『本地倉庫』,每個(gè) commit,我叫它為一個(gè) 『版本』。
遠(yuǎn)程倉庫:鍵入命令 git push 到遠(yuǎn)程倉庫,此次改動(dòng)就放到了 『遠(yuǎn)程倉庫』。
commit-id:輸出命令 git log,最上面那行 commit xxxxxx,后面的字符串即 commit-id。
4. 如果喜歡這個(gè)項(xiàng)目,歡迎 Star、Pr,并反饋問題。
先給一張各種命令的詳解圖,更詳細(xì)的內(nèi)容可查閱后文的命令解釋:
為了方便查閱,這里先以目錄的形式列舉各種操作的列表:
顯示幫助信息
返回遠(yuǎn)程倉庫的狀態(tài)
重設(shè)第一個(gè) commit
顯示工作區(qū)和暫存區(qū)的不同
顯示暫存區(qū)和最近版本的不同
顯示暫存區(qū)、工作區(qū)和最近版本的不同
快速切換到上一個(gè)分支
移除已經(jīng)合并到 master 的分支
顯示本地分支關(guān)聯(lián)遠(yuǎn)程倉庫的情況
關(guān)聯(lián)遠(yuǎn)程分支
舉出所有遠(yuǎn)程分支
舉出本地和遠(yuǎn)程分支
構(gòu)建并切換到本地分支
從遠(yuǎn)程分支中構(gòu)建并切換到本地分支
移除本地分支
移除遠(yuǎn)程分支
重命名本地分支
查看標(biāo)簽
查看標(biāo)簽詳細(xì)信息
本地構(gòu)建標(biāo)簽
Push標(biāo)簽到遠(yuǎn)程倉庫
移除本地標(biāo)簽
移除遠(yuǎn)程標(biāo)簽
切回到某個(gè)標(biāo)簽
放棄工作區(qū)的更改
恢復(fù)移除的文件
以新增一個(gè) commit 的方式還原某一個(gè) commit 的更改
回到某個(gè) commit 的狀態(tài),并移除后面的 commit
更改上一個(gè) commit 的描述
查看 commit 歷史
顯示本地更新過 HEAD 的 git 命令記錄
更改作者名
更改遠(yuǎn)程倉庫的 url
增加遠(yuǎn)程倉庫
舉出所有遠(yuǎn)程倉庫
查看兩個(gè)星期內(nèi)的改動(dòng)
把 A 分支的某一個(gè) commit,放到 B 分支上
給 git 命令起別名
保存當(dāng)前的更改,但不用提交 commit
儲存當(dāng)前狀態(tài),包括 untracked 的文件
顯示所有 stashes
回到某個(gè) stash 的狀態(tài)
回到最后一個(gè) stash 的狀態(tài),并移除這個(gè) stash
移除所有的 stash
從 stash 中拿出某個(gè)文件的更改
顯示所有 tracked 的文件
顯示所有 untracked 的文件
顯示所有忽略的文件
強(qiáng)制移除 untracked 的文件
強(qiáng)制移除 untracked 的目錄
顯示簡化的 commit 歷史
查看某段代碼的貢獻(xiàn)者
把某一個(gè)分支到導(dǎo)出成一個(gè)文件
從包中導(dǎo)入分支
執(zhí)行 rebase 之前自動(dòng) stash
從遠(yuǎn)程倉庫根據(jù) ID,拉下某一狀態(tài),到本地分支
詳細(xì)顯示一行中的更改
清除 .gitignore 文件中記錄的文件
顯示所有 alias 和 configs
顯示忽略的文件
commit 歷史中顯示 Branch1 有的,但是 Branch2 沒有 commit
在 commit log 中顯示 GPG 簽名
移除全局設(shè)置
新建并切換到新分支上,同時(shí)這個(gè)分支沒有任何 commit
顯示任意分支某一文件的內(nèi)容
clone 下來指定的單一分支
忽略某個(gè)文件的改動(dòng)
忽略文件的權(quán)限變化
以最后提交的順序舉出所有 Git 分支
在 commit log 中查找相關(guān)內(nèi)容
把暫存區(qū)的指定 file 放到工作區(qū)中
強(qiáng)制Push
詳解 Git 奇技淫巧
顯示幫助信息
輸出如下:
'git help -a' and 'git help -g' list available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept.
回到遠(yuǎn)程倉庫的狀態(tài)
拋棄本地所有的更改,回到遠(yuǎn)程倉庫的狀態(tài)。
重設(shè)第一個(gè) commit
也就是把所有的改動(dòng)都重新放回工作區(qū),并清空所有的 commit,這樣就可以重新提交第一個(gè) commit 了。
顯示工作區(qū)和暫存區(qū)的不同
輸出工作區(qū)和暫存區(qū)的 different (不同)。
還可以顯示本地倉庫中任意兩個(gè) commit 之間的文件變動(dòng):
顯示暫存區(qū)和最近版本的不同
輸出暫存區(qū)和本地最近的版本 (commit) 的 different(不同)。
顯示暫存區(qū)、工作區(qū)和最近版本的不同
輸出工作區(qū)、暫存區(qū) 和本地最近的版本 (commit) 的 different (不同)。
快速切換到上一個(gè)分支
移除已經(jīng)合并到 master 的分支
顯示本地分支關(guān)聯(lián)遠(yuǎn)程倉庫的情況
關(guān)聯(lián)遠(yuǎn)程分支
關(guān)聯(lián)之后,git branch -vv 就可以顯示關(guān)聯(lián)的遠(yuǎn)程分支名了,同時(shí)?Push 到遠(yuǎn)程倉庫直接:git push,不需要指定遠(yuǎn)程倉庫了。
或者在 push 時(shí)加上 -u 參數(shù)
舉出所有遠(yuǎn)程分支
-r 參數(shù)相當(dāng)于:remote
舉出本地和遠(yuǎn)程分支
-a 參數(shù)相當(dāng)于:all
構(gòu)建并切換到本地分支
從遠(yuǎn)程分支中構(gòu)建并切換到本地分支
移除本地分支
移除遠(yuǎn)程分支
或者
重命名本地分支
查看標(biāo)簽
顯示當(dāng)前分支的最近的 tag
查看標(biāo)簽詳細(xì)信息
本地構(gòu)建標(biāo)簽
默認(rèn) tag 是打在最近的一次 commit 上,如果需要指定 commit 打 tag:
Push?標(biāo)簽到遠(yuǎn)程倉庫
首先要保證本地構(gòu)建好了標(biāo)簽才可以?Push?標(biāo)簽到遠(yuǎn)程倉庫:
一次性?Push 所有標(biāo)簽,同步到遠(yuǎn)程倉庫:
移除本地標(biāo)簽
移除遠(yuǎn)程標(biāo)簽
移除遠(yuǎn)程標(biāo)簽需要先移除本地標(biāo)簽,再執(zhí)行下面的命令:
切回到某個(gè)標(biāo)簽
一般上線之前都會打 tag,就是為了防止上線后出現(xiàn)問題,方便快速回退到上一版本。下面的命令是回到某一標(biāo)簽下的狀態(tài):
放棄工作區(qū)的更改
放棄所有更改:
恢復(fù)移除的文件
以新增一個(gè) commit 的方式還原某一個(gè) commit 的更改
回到某個(gè) commit 的狀態(tài),并移除后面的 commit
和 revert 的區(qū)別:reset 命令會抹去某個(gè) commit id 之后的所有 commit
更改上一個(gè) commit 的描述
如果暫存區(qū)有改動(dòng),同時(shí)也會將暫存區(qū)的改動(dòng)提交到上一個(gè) commit
查看 commit 歷史
查看某段代碼的貢獻(xiàn)者
blame 的意思為『責(zé)怪』,你懂的。
顯示本地更新過 HEAD 的 git 命令記錄
每次更新了 HEAD 的 git 命令比如 commint、amend、cherry-pick、reset、revert 等都會被記錄下來(不限分支),就像 shell 的 history 一樣。這樣你可以 reset 到任何一次更新了 HEAD 的操作之后,而不僅僅是回到當(dāng)前分支下的某個(gè) commit 之后的狀態(tài)。
更改作者名
更改遠(yuǎn)程倉庫的 url
增加遠(yuǎn)程倉庫
舉出所有遠(yuǎn)程倉庫
查看兩個(gè)星期內(nèi)的改動(dòng)
把 A 分支的某一個(gè) commit,放到 B 分支上
這個(gè)過程需要 cherry-pick 命令,參考:http://sg552.iteye.com/blog/1300713#bc2367928
給 git 命令起別名
簡化命令
保存當(dāng)前的更改,但不用提交 commit
詳解可以參考廖雪峰老師的 git 教程 (http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000)
儲存當(dāng)前狀態(tài),包括 untracked 的文件
untracked 文件:新建的文件
顯示所有 stashes
回到某個(gè) stash 的狀態(tài)
回到最后一個(gè) stash 的狀態(tài),并移除這個(gè) stash
移除所有的 stash
從 stash 中拿出某個(gè)文件的更改
顯示所有 tracked 的文件
顯示所有 untracked 的文件
顯示所有忽略的文件
強(qiáng)制移除 untracked 的文件
可以用來移除新建的文件。如果不指定文件文件名,則清空所有工作的 untracked 文件。clean 命令,注意兩點(diǎn):
1. clean 后,移除的文件無法找回
2. 不會影響 tracked 的文件的改動(dòng),只會移除 untracked 的文件
強(qiáng)制移除 untracked 的目錄
可以用來移除新建的目錄,注意:這個(gè)命令也可以用來移除 untracked 的文件。詳情見上一條。
顯示簡化的 commit 歷史
把某一個(gè)分支導(dǎo)出成一個(gè)文件
從包中導(dǎo)入分支
新建一個(gè)分支,分支內(nèi)容就是上面 git bundle create 命令導(dǎo)出的內(nèi)容
執(zhí)行 rebase 之前自動(dòng) stash
從遠(yuǎn)程倉庫根據(jù) ID,拉下某一狀態(tài),到本地分支
詳細(xì)顯示一行中的更改
清除 gitignore 文件中記錄的文件
顯示所有 alias 和 configs
注意:config 分為:當(dāng)前目錄(local)和全局(golbal)的 config,默認(rèn)為當(dāng)前目錄的 config
顯示忽略的文件
commit 歷史中顯示 Branch1 有的,但是 Branch2 沒有 commit
在 commit log 中顯示 GPG 簽名
移除全局設(shè)置
新建并切換到新分支上,同時(shí)這個(gè)分支沒有任何 commit
相當(dāng)于儲存更改,但是重寫 commit 歷史
顯示任意分支某一文件的內(nèi)容
clone 下來指定的單一分支
忽略某個(gè)文件的改動(dòng)
關(guān)閉 track 指定文件的改動(dòng),也就是 Git 將不會在記錄這個(gè)文件的改動(dòng)
恢復(fù) track 指定文件的改動(dòng)
忽略文件的權(quán)限變化
不再將文件的權(quán)限變化視作改動(dòng)
以最后提交的順序舉出所有 Git 分支
最新的放在最上面
在 commit log 中查找相關(guān)內(nèi)容
通過 grep 查找,given-text:所需要查找的字段
把暫存區(qū)的指定 file 放到工作區(qū)中
不添加參數(shù),默認(rèn)是 -mixed
強(qiáng)制?Push
總結(jié)
以上是生活随笔為你收集整理的走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python入门,从19个语法开始!
- 下一篇: 基于梯度下降法的——线性回归拟合