史上最全Git学习教程
?
?
Git是世界上最先進(jìn)的分布式版本控制系統(tǒng),沒(méi)有之一。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——?Git愛(ài)好者
Git 是一個(gè)「分布式版本管理工具」,其具備太多的優(yōu)點(diǎn):更方便的 Merge、更方便的管理、更健壯的系統(tǒng)、對(duì)網(wǎng)絡(luò)的依賴性更低、更少的“倉(cāng)庫(kù)污染”?等等,這使得Git成為協(xié)作開(kāi)發(fā)代碼的最優(yōu)方法。
本文將介紹七十多種常用的 Git 命令與技巧,下面就讓我們一起來(lái)領(lǐng)略一下作為一個(gè)超過(guò)1.1W?Stars的Github項(xiàng)目的魅力吧。
開(kāi)卷必讀
如果之前未使用過(guò) Git,可以學(xué)習(xí) Git 小白教程[1]入門:
一定要先測(cè)試命令的效果后,再用于工作環(huán)境中,以防造成不能彌補(bǔ)的后果!到時(shí)候別拿著砍刀來(lái)找我
所有的命令都在git version 2.7.4 (Apple Git-66)下測(cè)試通過(guò)
統(tǒng)一概念:
-
工作區(qū):改動(dòng)(增刪文件和內(nèi)容)
-
暫存區(qū):輸入命令:git add 改動(dòng)的文件名,此次改動(dòng)就放到了 ‘暫存區(qū)’
-
本地倉(cāng)庫(kù)(簡(jiǎn)稱:本地):輸入命令:git commit 此次修改的描述,此次改動(dòng)就放到了 ’本地倉(cāng)庫(kù)’,每個(gè) commit,我叫它為一個(gè) ‘版本’。
-
遠(yuǎn)程倉(cāng)庫(kù)(簡(jiǎn)稱:遠(yuǎn)程):輸入命令:git push 遠(yuǎn)程倉(cāng)庫(kù),此次改動(dòng)就放到了 ‘遠(yuǎn)程倉(cāng)庫(kù)’(GitHub 等)
-
commit-id:輸出命令:git log,最上面那行 commit xxxxxx,后面的字符串就是 commit-id
?
目錄
-
展示幫助信息
-
回到遠(yuǎn)程倉(cāng)庫(kù)的狀態(tài)
-
重設(shè)第一個(gè)commit
-
查看沖突文件列表
-
展示工作區(qū)和暫存區(qū)的不同
-
展示暫存區(qū)和最近版本的不同
-
展示暫存區(qū)、工作區(qū)和最近版本的不同
-
快速切換到上一個(gè)分支
-
刪除已經(jīng)合并到 master 的分支
-
展示本地分支關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)的情況
-
關(guān)聯(lián)遠(yuǎn)程分支
-
列出所有遠(yuǎn)程分支
-
列出本地和遠(yuǎn)程分支
-
查看遠(yuǎn)程分支和本地分支的對(duì)應(yīng)關(guān)系
-
遠(yuǎn)程刪除了分支本地也想刪除
-
創(chuàng)建并切換到本地分支
-
從遠(yuǎn)程分支中創(chuàng)建并切換到本地分支
-
刪除本地分支
-
刪除遠(yuǎn)程分支
-
重命名本地分支
-
查看標(biāo)簽
-
查看標(biāo)簽詳細(xì)信息
-
本地創(chuàng)建標(biāo)簽
-
推送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)
-
刪除本地標(biāo)簽
-
刪除遠(yuǎn)程標(biāo)簽
-
切回到某個(gè)標(biāo)簽
-
放棄工作區(qū)的修改
-
恢復(fù)刪除的文件
-
以新增一個(gè) commit 的方式還原某一個(gè) commit 的修改
-
回到某個(gè) commit 的狀態(tài),并刪除后面的 commit
-
修改上一個(gè) commit 的描述
-
查看 commit 歷史
-
顯示本地更新過(guò) HEAD 的 git 命令記錄
-
修改作者名
-
修改遠(yuǎn)程倉(cāng)庫(kù)的 url
-
增加遠(yuǎn)程倉(cāng)庫(kù)
-
列出所有遠(yuǎn)程倉(cāng)庫(kù)
-
查看兩個(gè)星期內(nèi)的改動(dòng)
-
把 A 分支的某一個(gè) commit,放到 B 分支上
-
給 git 命令起別名
-
存儲(chǔ)當(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 的目錄
-
展示簡(jiǎn)化的 commit 歷史
-
查看某段代碼是誰(shuí)寫(xiě)的
-
把某一個(gè)分支到導(dǎo)出成一個(gè)文件
-
從包中導(dǎo)入分支
-
執(zhí)行 rebase 之前自動(dòng) stash
-
從遠(yuǎn)程倉(cāng)庫(kù)根據(jù) ID,拉下某一狀態(tài),到本地分支
-
詳細(xì)展示一行中的修改
-
清除 .gitignore 文件中記錄的文件
-
展示所有 alias 和 configs
-
展示忽略的文件
-
commit 歷史中顯示 Branch1 有的,但是 Branch2 沒(méi)有 commit
-
在 commit log 中顯示 GPG 簽名
-
刪除全局設(shè)置
-
新建并切換到新分支上,同時(shí)這個(gè)分支沒(méi)有任何 commit
-
展示任意分支某一文件的內(nèi)容
-
clone 下來(lái)指定的單一分支
-
clone 最新一次提交
-
忽略某個(gè)文件的改動(dòng)
-
忽略文件的權(quán)限變化
-
以最后提交的順序列出所有 Git 分支
-
在 commit log 中查找相關(guān)內(nèi)容
-
把暫存區(qū)的指定 file 放到工作區(qū)中
-
強(qiáng)制推送
-
git 配置 http 和 socks 代理
-
git 配置 ssh 代理
-
一圖詳解
-
優(yōu)雅的提交Commit信息
-
聯(lián)系我
命令用法
展示幫助信息
git help -gThe command output as below:
The common Git guides are:attributes Defining attributes per pathcli Git command-line interface and conventionscore-tutorial A Git core tutorial for developerscvs-migration Git for CVS usersdiffcore Tweaking diff outputeveryday A useful minimum set of commands for Everyday Gitglossary A Git Glossaryhooks Hooks used by Gitignore Specifies intentionally untracked files to ignoremodules Defining submodule propertiesnamespaces Git namespacesrepository-layout Git Repository Layoutrevisions Specifying revisions and ranges for Gittutorial A tutorial introduction to Gittutorial-2 A tutorial introduction to Git: part twoworkflows An overview of recommended workflows with 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)程倉(cāng)庫(kù)的狀態(tài)
拋棄本地所有的更改,回到遠(yuǎn)程倉(cāng)庫(kù)的狀態(tài)。
git?fetch?--all?&&?git?reset?--hard?origin/master重設(shè)第一個(gè) commit
也就是把所有的改動(dòng)都重新放回工作區(qū),并清空所有的 commit,這樣就可以重新提交第一個(gè) commit 了。
git update-ref -d HEAD顯示工作區(qū)和暫存區(qū)的不同
輸出工作區(qū)和暫存區(qū)的 different (不同)。
git diff還可以顯示本地倉(cāng)庫(kù)中任意兩個(gè) commit 之間的文件變動(dòng):
git diff <commit-id> <commit-id>顯示暫存區(qū)和最近版本的不同
輸出暫存區(qū)和本地最近的版本 (commit) 的 different(不同)。
git diff --cached顯示暫存區(qū)、工作區(qū)和最近版本的不同
輸出工作區(qū)、暫存區(qū) 和本地最近的版本 (commit) 的 different (不同)。
git?diff?HEAD快速切換到上一個(gè)分支
git?checkout?-移除已經(jīng)合并到 master 的分支
git?branch?--merged?master?|?grep?-v?'^\*\|?master'?|?xargs?-n?1?git?branch?-d顯示本地分支關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)的情況
git?branch?-vv關(guān)聯(lián)遠(yuǎn)程分支
關(guān)聯(lián)之后,git branch -vv 就可以顯示關(guān)聯(lián)的遠(yuǎn)程分支名了,同時(shí) Push 到遠(yuǎn)程倉(cāng)庫(kù)直接:git push,不需要指定遠(yuǎn)程倉(cāng)庫(kù)了。
git?branch?-u?origin/mybranch或者在 push 時(shí)加上 -u 參數(shù)
git?push?origin/mybranch?-u舉出所有遠(yuǎn)程分支
-r 參數(shù)相當(dāng)于:remote
git?branch?-r舉出本地和遠(yuǎn)程分支
-a 參數(shù)相當(dāng)于:all
git?branch?-a構(gòu)建并切換到本地分支
git?checkout?-b?<branch-name>從遠(yuǎn)程分支中構(gòu)建并切換到本地分支
git?checkout?-b?<branch-name>?origin/<branch-name>移除本地分支
git?branch?-d?<local-branchname>移除遠(yuǎn)程分支
git?push?origin?--delete?<remote-branchname>或者
git?push?origin?:<remote-branchname>重命名本地分支
git?branch?-m?<new-branch-name>查看標(biāo)簽
git?tag顯示當(dāng)前分支的最近的 tag
git?describe?--tags?--abbrev=0查看標(biāo)簽詳細(xì)信息
git?tag?-ln本地構(gòu)建標(biāo)簽
git?tag?<version-number>默認(rèn) tag 是打在最近的一次 commit 上,如果需要指定 commit 打 tag:
$?git?tag?-a?<version-number>?-m?"v1.0?發(fā)布?(描述)"?<commit-id>Push?標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)
首先要保證本地構(gòu)建好了標(biāo)簽才可以 Push 標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù):
git?push?origin?<local-version-number>一次性 Push 所有標(biāo)簽,同步到遠(yuǎn)程倉(cāng)庫(kù):
git?push?origin?--tags移除本地標(biāo)簽
git?tag?-d?<tag-name>移除遠(yuǎn)程標(biāo)簽
移除遠(yuǎn)程標(biāo)簽需要先移除本地標(biāo)簽,再執(zhí)行下面的命令:
git?push?origin?:refs/tags/<tag-name>切回到某個(gè)標(biāo)簽
一般上線之前都會(huì)打 tag,就是為了防止上線后出現(xiàn)問(wèn)題,方便快速回退到上一版本。下面的命令是回到某一標(biāo)簽下的狀態(tài):
git?checkout?-b?branch_name?tag_name放棄工作區(qū)的更改
git?checkout?<file-name>放棄所有更改:
git?checkout?.恢復(fù)移除的文件
git?rev-list?-n?1?HEAD?--?<file_path>?#?得到?deleting_commit git checkout <deleting_commit>^ -- <file_path> # 回到移除文件 deleting_commit 之前的狀態(tài)以新增一個(gè) commit 的方式還原某一個(gè) commit 的更改
git revert <commit-id>回到某個(gè) commit 的狀態(tài),并移除后面的 commit
和 revert 的區(qū)別:reset 命令會(huì)抹去某個(gè) commit id 之后的所有 commit
git?reset?<commit-id>?# 默認(rèn)就是-mixed 參數(shù)。 git?reset?–mixed?HEAD^?# 回退至上個(gè)版本,它將重置 HEAD 到另外一個(gè) commit, 并且重置暫存區(qū)以便和 HEAD 相匹配,但是也到此為止。工作區(qū)不會(huì)被更改。 git?reset?–soft?HEAD~3?# 回退至三個(gè)版本之前,只回退了 commit 的信息,暫存區(qū)和工作區(qū)與回退之前保持一致。如果還要提交,直接 commit 即可 git reset –hard <commit-id> # 徹底回退到指定 commit-id 的狀態(tài),暫存區(qū)和工作區(qū)也會(huì)變?yōu)橹付?commit-id 版本的內(nèi)容更改上一個(gè) commit 的描述
如果暫存區(qū)有改動(dòng),同時(shí)也會(huì)將暫存區(qū)的改動(dòng)提交到上一個(gè) commit
git commit --amend查看 commit 歷史
git log查看某段代碼的貢獻(xiàn)者
blame 的意思為『責(zé)怪』,你懂的。
git blame <file-name>顯示本地更新過(guò) HEAD 的 git 命令記錄
每次更新了 HEAD 的 git 命令比如 commint、amend、cherry-pick、reset、revert 等都會(huì)被記錄下來(lái)(不限分支),就像 shell 的 history 一樣。這樣你可以 reset 到任何一次更新了 HEAD 的操作之后,而不僅僅是回到當(dāng)前分支下的某個(gè) commit 之后的狀態(tài)。
git reflog更改作者名
git?commit?--amend?--author='Author?Name?<email@address.com>'更改遠(yuǎn)程倉(cāng)庫(kù)的 url
git remote set-url origin <URL>增加遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin <remote-url>舉出所有遠(yuǎn)程倉(cāng)庫(kù)
git remote查看兩個(gè)星期內(nèi)的改動(dòng)
git whatchanged --since='2 weeks ago'把 A 分支的某一個(gè) commit,放到 B 分支上
這個(gè)過(guò)程需要 cherry-pick 命令,參考[2]
git?checkout?<branch-name>?&&?git?cherry-pick?<commit-id>給 git 命令起別名
簡(jiǎn)化命令
git?config?--global?alias.<handle>?<command> 比如:git status 改成 git st,這樣可以簡(jiǎn)化命令 git config --global alias.st status保存當(dāng)前的更改,但不用提交 commit
詳解可以參考廖雪峰老師的 git 教程
git stash儲(chǔ)存當(dāng)前狀態(tài),包括 untracked 的文件
untracked 文件:新建的文件
git stash -u顯示所有 stashes
git stash list回到某個(gè) stash 的狀態(tài)
git stash apply <stash@{n}>回到最后一個(gè) stash 的狀態(tài),并移除這個(gè) stash
git stash pop移除所有的 stash
git stash clear從 stash 中拿出某個(gè)文件的更改
git checkout <stash@{n}> -- <file-path>顯示所有 tracked 的文件
git ls-files -t顯示所有 untracked 的文件
git ls-files --others顯示所有忽略的文件
git?ls-files?--others?-i?--exclude-standard強(qiáng)制移除 untracked 的文件
可以用來(lái)移除新建的文件。如果不指定文件文件名,則清空所有工作的 untracked 文件。clean 命令,注意兩點(diǎn):
1. clean 后,移除的文件無(wú)法找回
2. 不會(huì)影響 tracked 的文件的改動(dòng),只會(huì)移除 untracked 的文件
git?clean?<file-name>?-f強(qiáng)制移除 untracked 的目錄
可以用來(lái)移除新建的目錄,注意:這個(gè)命令也可以用來(lái)移除 untracked 的文件。詳情見(jiàn)上一條。
git clean <directory-name> -df顯示簡(jiǎn)化的 commit 歷史
git?log?--pretty=oneline?--graph?--decorate?--all把某一個(gè)分支導(dǎo)出成一個(gè)文件
git?bundle?create?<file>?<branch-name>從包中導(dǎo)入分支
新建一個(gè)分支,分支內(nèi)容就是上面 git bundle create 命令導(dǎo)出的內(nèi)容
git?clone?repo.bundle?<repo-dir>?-b?<branch-name>執(zhí)行 rebase 之前自動(dòng) stash
git?rebase?--autostash從遠(yuǎn)程倉(cāng)庫(kù)根據(jù) ID,拉下某一狀態(tài),到本地分支
git?fetch?origin?pull/<id>/head:<branch-name>詳細(xì)顯示一行中的更改
git?diff?--word-diff清除 gitignore 文件中記錄的文件
git?clean?-X?-f顯示所有 alias 和 configs
注意:config 分為:當(dāng)前目錄(local)和全局(golbal)的 config,默認(rèn)為當(dāng)前目錄的 config
git config --local --list (當(dāng)前目錄) git config --global --list (全局)顯示忽略的文件
git?status?--ignoredcommit 歷史中顯示 Branch1 有的,但是 Branch2 沒(méi)有 commit
git?log?Branch1?^Branch2在 commit log 中顯示 GPG 簽名
git?log?--show-signature移除全局設(shè)置
git?config?--global?--unset?<entry-name>新建并切換到新分支上,同時(shí)這個(gè)分支沒(méi)有任何 commit
相當(dāng)于儲(chǔ)存更改,但是重寫(xiě) commit 歷史
git?checkout?--orphan?<branch-name>顯示任意分支某一文件的內(nèi)容
git?show?<branch-name>:<file-name>clone 下來(lái)指定的單一分支
git?clone?-b?<branch-name>?--single-branch?https://github.com/user/repo.git忽略某個(gè)文件的改動(dòng)
關(guān)閉 track 指定文件的改動(dòng),也就是 Git 將不會(huì)在記錄這個(gè)文件的改動(dòng)
git?update-index?--assume-unchanged?path/to/file恢復(fù) track 指定文件的改動(dòng)
git?update-index?--no-assume-unchanged?path/to/file忽略文件的權(quán)限變化
不再將文件的權(quán)限變化視作改動(dòng)
git?config?core.fileMode?false以最后提交的順序舉出所有 Git 分支
最新的放在最上面
git?for-each-ref?--sort=-committerdate?--format='%(refname:short)'?refs/heads/在 commit log 中查找相關(guān)內(nèi)容
通過(guò) grep 查找,given-text:所需要查找的字段
git?log?--all?--grep='<given-text>'把暫存區(qū)的指定 file 放到工作區(qū)中
不添加參數(shù),默認(rèn)是 -mixed
git?reset?<file-name>強(qiáng)制?Push
git?push?-f?<remote-name>?<branch-name>?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的史上最全Git学习教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: YouTube深度学习推荐系统的十大工程
- 下一篇: 拒绝无脑吹!从ACL20看预训练缺陷