常用Git命令手冊
此文只是對Git有一定基礎的人當記憶使用,比較簡略,初級學員強烈推薦廖雪峰老師的Git系列教程,通俗易懂,戳此處即可開始學習
1.安裝Git
- Linux
sudo apt-get install git
- Window:到Git官網下載安裝:https://git-scm.com/downloads
2.配置全局用戶Name和E-mail
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
3.初始化倉庫
git init
4.添加文件到Git倉庫
git add <file>
提示:可反復多次使用,添加多個文件;
5.提交添加的文件到Git倉庫
git commit
然后會彈出一個Vim編輯器輸入本次提交的內容;
或者
git commit -m "提交說明"
6.查看倉庫當前的狀態
git status
7.比較當前文件的修改
$ git diff <file>
8.查看歷史提交記錄
git log
或者加上參數查看就比較清晰了
$ git log --pretty=oneline
9.回退版本
$ git reset --hard HEAD^
說明:在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,以此類推,如果需要回退幾十個版本,寫幾十個^容易數不過來,所以可以寫,例如回退30個版本為:HEAD~30。
如果你回退完版本又后悔了,想回來,一般情況下是回不來的,但是如果你可以找到你之前的commit id的話,也是可以的,使用如下即可:
$ git reset --hard + commit id
提示:commit id不需要寫全,Git會自動查找;
補充說明:Git中,commit id是一個使用SHA1計算出來的一個非常大的數字,用十六進制表示,你提交時看到的一大串類似3628164...882e1e0的就是commit id(版本號);
在Git中,版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向回退的版本,然后順便刷新工作區文件;
10.查看操作的歷史命令記錄
$ git reflog
結果會將你之前的操作的commit id和具體的操作類型及相關的信息打印出來,這個命令還有一個作用就是,當你過了幾天,你想回退之前的某次提交,但是你不知道commit id了,通過這個你可查找出commit id,就可以輕松回退了,用一句話總結:穿越未來,回到過去,so easy!
11.diff文件
git diff HEAD -- <file>
說明:查看工作區和版本庫里面最新版本文件的區別,也可以不加HEAD參數;
12.丟棄工作區的修改
$ git checkout -- <file>
說明:適用於工作區修改沒有add的文件
13.丟棄暫存區的文件
$ git reset HEAD <file>
說明:適用於暫存區已經add的文件,注意執行完此命令,他會將暫存區的修改放回到工作區中,如果要想工作區的修改也丟棄,就執行第12條命令即可;
14.刪除文件
$ rm <file>
然后提交即可;
如果不小心刪錯了,如果還沒有提交的話使用下面命令即可恢復刪除,注意的是它只能恢復最近版本提交的修改,你工作區的修改是不能被恢復的!
$ git checkout -- <file>
15.創建SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
一般本地Git倉庫和遠程Git倉庫之間的傳輸是通過SSH加密的,所以我們可以將其生成的公鑰添加到Git服務端的設置中即可,這樣Git就可以知道是你提交的了;
16.與遠程倉庫協作
$ git remote add origin git@github.com:xinpengfei520/IM.git
刪除本地庫與遠程庫的關聯:
$ git remote rm origin
作用:有時候我們需要關聯其他遠程庫,需要先刪除舊的關聯,再添加新的關聯,因為如果你已經關聯過了就不能在關聯了,不過想關聯多個遠程庫也是可以的,前提是你的本地庫沒有關聯任何遠程庫,操作如下:
先關聯Github遠程庫:
$ git remote add github git@github.com:xinpengfei520/IM.git
接着關聯碼雲遠程庫:
$ git remote add gitee git@gitee.com:xinpengfei521/IM.git
現在,我們用git remote -v
查看遠程庫的關聯信息,如果看到兩組關聯信息就說明關聯成功了;
ok,現在我們的本地庫可以和多個遠程庫協作了
如果要推送到GitHub,使用命令:
$ git push github master
如果要推送到碼雲,使用命令:
$ git push gitee master
17.推送到遠程倉庫
$ git push -u origin master
注意:第一次提交需要加一個參數-u,以后不需要
18.克隆一個遠程庫
$ git clone git@github.com:xinpengfei520/IM.git
19.Git分支管理
創建一個分支branch1
$ git branch branch1
切換到branch1分支:
$ git checkout branch1
創建並切換到branch1分支:
$ git checkout -b branch1
查看分支:
$ git branch
提示:顯示的結果中,其中有一個分支前有個*號,表示的是當前所在的分支;
合並branch1分支到master:
$ git merge branch1
刪除分支:
$ git branch -d branch1
20.查看提交的歷史記錄
$ git log
命令可以看到分支合並圖
git log --graph
21.合並分支
禁用Fast forward模式合並分支
$ git merge --no-ff -m "merge" branch1
說明:默認Git合並分支時使用的是Fast forward模式,這種模式合並,刪除分支后,會丟掉分支信息,所以我們需要強制禁用此模式來合並;
補充內容:實際開發中分支管理的策略
- master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面提交;
- 我們可以新開一個dev分支,也就是說dev分支是不穩定的,到版本發布時,再把dev分支合並到master上,在master分支發布新版本;
- 你和你的協作者平時都在dev分支上提交,每個人都有自己的分支,時不時地往dev分支上合並就可以了;
22.保存工作現場
$ git stash
作用:當你需要去修改其他內容時,這時候你的工作還沒有做完,先臨時保存起來,等干完其他事之后,再回來回復現場,再繼續干活;為什么?因為暫存區是公用的,如果不通過stash命令隱藏,會帶到其它分支去;
查看已經保存的工作現場列表:
$ git stash list
恢復工作現場(恢復並從stash list刪除):
$ git stash pop
或者:
git stash apply
恢復工作現場,但stash內容並不刪除,如果你需要刪除執行如下命令:
$ git stash drop
恢復指定的stash:
$ git stash apply stash@{0}
說明:其中stash@{0}為git stash list
中的一種編號
23.丟棄一個沒有被合並過的分支
強行刪除即可:
$ git branch -D <name>
作用:實際開發中,添加一個新feature,最好新建一個分支,如果要丟棄這個沒有被合並過的分支,可以通過上面的命令強行刪除;
24.查看遠程庫的信息
$ git remote
顯示更詳細的信息:
$ git remote -v
25.推送分支
推送master到遠程庫
$ git push origin master
推送branch1到遠程庫
$ git push origin branch1
26.創建本地分支
$ git checkout -b branch1 origin/branch1
說明:如果遠程庫中有分支,clone之后默認只有master分支的,所以需要執行如上命令來創建本地分支才能與遠程的分支關聯起來;
27.指定本地branch1分支與遠程origin/branch1分支的鏈接
$ git branch --set-upstream branch1 origin/branch1
作用:如果你本地新建的branch1分支,遠程庫中也有一個branch1分支(別人創建的),而剛好你也沒有提交過到這個分支,即沒有關聯過,會報一個no tracking information
信息,通過上面命令關聯即可;
28.創建標簽
$ git tag <name>
例如:git tag v1.0
查看所有標簽:
$ git tag
對歷史提交打tag
先使用$ git log --pretty=oneline --abbrev-commit
命令找到歷史提交的commit id
例如對commit id 為123456的提交打一個tag:
$ git tag v0.9 123456
查看標簽信息:
$ git show <tagname>
eg:git show v1.0
創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字,123456為commit id:
$ git tag -a v1.0 -m "V1.0 released" 123456
用私鑰簽名一個標簽:
$ git tag -s v2.0 -m "signed V2.0 released" 345678
說明:簽名采用PGP簽名,因此,必須先要安裝gpg(GnuPG),如果沒有找到gpg,或者沒有gpg密鑰對,就會報錯,具體請參考GnuPG幫助文檔配置Key;
作用:用PGP簽名的標簽是不可偽造的,因為可以驗證PGP簽名;
刪除標簽:
$ git tag -d <tagname>
刪除遠程庫中的標簽:
比如要刪除遠程庫中的 V1.0 標簽,分兩步:
[1] 先刪除本地標簽:$ git tag -d V1.0
[2] 再推送刪除即可:$ git push origin :refs/tags/V1.0
推送標簽到遠程庫:
$ git push origin <tagname>
推送所有標簽到遠程庫:
$ git push origin --tags
29.自定義Git設置
Git顯示顏色,會讓命令輸出看起來更清晰、醒目:
$ git config --global color.ui true
設置命令別名:
$ git config --global alias.st status
說明:--global表示全局,即設置完之后全局生效,st表示別名,status表示原始名
好了,現在敲git st
就相當於是git status
命令了,是不是方便?
當然還有其他命令可以簡寫,這里舉幾個:很多人都用co表示checkout,ci表示commit,br表示branch...
根據自己的喜好可以設置即可,個人覺得不是很推薦使用別名的方式;
推薦一個比較喪心病狂的別名設置:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
效果自己去體會...
其他說明:配置的時候加上--global是針對當前用戶起作用的,如果不加只對當前的倉庫起作用;每個倉庫的Git配置文件都放在 .git/config 文件中,我們可以打開對其中的配置作修改,可以刪除設置的別名;而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中,我們也可以對其進行配置和修改。
30.忽略文件規則
原則:
- 忽略系統自動生成的文件等;
- 忽略編譯生成的中間文件、可執行文件等,比如Java編譯產生的.class文件,自動生成的文件就沒必要提交;
- 忽略你自己的帶有敏感信息的配置文件,個人相關配置文件;
- 忽略與自己相關開發環境相關的配置文件;
- ...
使用:在Git工作區的根目錄下創建一個特殊的 .gitignore 文件,然后把要忽略的文件名或者相關規則填進去,Git就會自動忽略這些文件,不知道怎么寫的可參考:https://github.com/github/gitignore,這里提供了一些忽略的規則,可供參考;
如果你想添加一個被 .gitignore 忽略的文件到Git中,但發現是添加不了的,所以我們可以使用強制添加$ git add -f <file>
或者我們可以檢查及修改 .gitignore 文件的忽略規則:
$ git check-ignore -v <file>
Git會告訴我們具體的 .gitignore 文件中的第幾行規則忽略了該文件,這樣我們就知道應該修改哪個規則了;
如何忽略已經提交到遠程庫中的文件?
如果你已經將一些文件提交到遠程庫中了,然后你想忽略掉此文件,然后在 .gitignore 文件中添加忽略,然而你會發現並沒有生效,因為Git添加忽略時只有對沒有跟蹤的文件才生效,也就是說你沒有add過和提交過的文件才生效,按如下命令:
比如說:我們要忽略.idea目錄,先刪除已經提交到本地庫的文件目錄
git rm --cached .idea
格式:git rm --cached + 路徑
如果提示:fatal: not removing '.idea' recursively without -r
加個參數 -r 即可強制刪除
$ git rm -r --cached .idea
然后,執行git status
會提示你已經刪除.idea目錄了,然后執行commit再push就可以了,此時的.idea目錄是沒有被跟蹤的,將.idea目錄添加到 .gitignore 文件中就可以忽略了。
附圖:
好了,基本差不多了,其實常用的命令也就那么幾個,如果使用多了,就熟練了,相信git給我們工作效率及工作上的提升...
聲明:附圖來自CSDN知識庫,僅作為學習交流用;