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