Git 常用命令集合

初始化一個倉庫

//創(chuàng)建版本庫(倉庫,其實(shí)就是一個目錄)
mkdir fileName
cd fileName 
//把這個目錄變成 git 可管理的目錄 (文件夾下多了 .git 文件被隱藏了 < ls -ah 可見 >)
git init 
//操作 往fileName文件夾添加文件,添加了file1.txt , file2.txt 
//把修改添加到倉庫
git add * / git add . / git add file1.txt /git add file1.txt file2.txt
//提交到倉庫
git commit -m "說明這次提交做了什么操作!"

命令解釋(官方)

git  init   ---Create an empty Git repository or reinitiallize existing one
git add  ---Add file contents to the index

一、GIT配置

git config --global user.name "your name"
git config --global user.email "mail@xx.com"
Git會按照你需要自動為大部分的輸出加上顏色,你能明確地規(guī)定哪些需要著色以及怎樣著色,設(shè)置color.ui為true來打開所有的默認(rèn)終端著色。
git config --global color.ui true
Git默認(rèn)會調(diào)用你的環(huán)境變量editor定義的值作為文本編輯器,如果沒有定義的話,會調(diào)用Vi來創(chuàng)建和編輯提交以及標(biāo)簽信息, 你可以使用core.editor改變默認(rèn)編輯器
git config --global core.editor vi
git config --global alias.別名 "指定代碼"    設(shè)置alias,這樣"別名"就是自己新的命令了
eg git config --global alias.mypuh "pull gitlab my_branch"  git mypush === git pull gitlab my_branch
git config -list   //列出所有g(shù)it配置

二、命令

前言:
cd /path/to/my/codebase
git init      (1)  //Create a /path/to/my/codebase/.git directory.
git add .     (2)  //Add all existing files to the index.
git commit    (3)  //Record the pristine state as the first commit in the history.

** git add 詳解
** git commit -m / -sm / -am 詳解

- git status   //時刻掌握倉庫當(dāng)前的狀態(tài),告訴你有什么文件做了修改,是提交了還是未提交等信息
- git diff filename1   //查看filename1具體做了什么修改
  git diff *index.js   //查看以index.js結(jié)束的文件修改情況(路徑)
  git diff || git diff . || git diff * //查看所有文件具體修改

- git log  命令顯示從最近到最遠(yuǎn)的提交日志
  如下所示:
  commit cb926e7ea50ad11b8f9e909c05226233bf755030   //版本號
  Author: Michael Liao <askxuefeng@gmail.com>       //作者,就是config里設(shè)置的
  Date:   Mon Aug 19 17:51:55 2013 +0800            //該版本提交的時間
  
      wrote a readme file                           //每次commit的內(nèi)容
  
  
  git log --pretty=oneline  
  3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
  ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
  cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

版本回退
HEAD 表示當(dāng)前版本,也就是最新提交的版本
HEAD^
HEAD^^
HEAD^^^.....以此類推
HEAD~98 簡單寫法

- git reset --hard HEAD^  執(zhí)行后,順便把工作區(qū)的文件更新了
  回退之后,使用 git log 查看,HEAD 版本信息看不到了,如果后悔了怎么辦?記得之前版本的Commit ID(不用全部記住,一部分就OK)就可以了,必須要知道COMMITID
  git reset --hard commitID
- git reflog 記錄你的每一次命令,關(guān)機(jī)也可以記錄COMMITID,所以關(guān)機(jī)之后也可以往前走一個版本

git reflog是從建庫對這個版本的所有操作記錄(一定是本地從clone之后開始記錄)
git log 是這個版本的保留的操作記錄,這樣理解沒錯吧 (包括線上的原始記錄)

概念:工作區(qū) & 暫存區(qū) & 版本庫

工作區(qū):就是一個目錄,我們工作,都是在工作區(qū)內(nèi)
工作區(qū)里面有個.git文件,這個不算工作區(qū),這個是Git的版本庫!
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD。
第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本庫時,Git自動為我們創(chuàng)建了唯一一個master分支,所以,現(xiàn)在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。

git diff    #是工作區(qū)(work dict)和暫存區(qū)(stage)的比較
git diff --cached    #是暫存區(qū)(stage)和分支(master)的比較

試驗(yàn)了一下才理解,stage或cache與雖說是暫存區(qū),緩沖區(qū),但commit并不是像想像那樣把這個區(qū)清空,估計(jì)只是打個同步的標(biāo)志,內(nèi)容還在,就能理解了。

add 是 把工作區(qū)的更新到暫存區(qū),commit是把緩沖區(qū)更新到倉庫。所以經(jīng)過add, commit,修改再add,再修改,就會出現(xiàn)工作區(qū)、緩沖區(qū)、和倉庫三者都不同。

就可以下面的比較了:
git diff 是工作區(qū)和 中間區(qū)比較,git diff --cached是中間區(qū)和倉庫比較。

為什么Git比其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it跟蹤并管理的是修改,而非文件
git diff HEAD -- readme.txt 命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別

撤銷修改
git checkout -- file(指的是相對路徑)  : 工作區(qū)的修改全部撤銷,回到修改之前的狀態(tài)
一種是 file 已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

那么如何把暫存區(qū)的修改撤銷掉呢?
git reset HEAD file 暫存區(qū)修改撤銷,重新放回工作區(qū)  
接著 git checkout -- file  就可以回到修改之前

場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file。

場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。

場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節(jié),不過前提是沒有推送到遠(yuǎn)程庫。

刪除文件:
工作區(qū)   ------>  暫存區(qū) ------>  版本庫
rm test.txt  刪除了工作區(qū)的文件,與版本庫不一致了怎么辦?
git status
兩種情況:
  1、把版本庫中的文件也刪除
      git rm test.txt
      git commit -m "remove test.txt"
  2、誤刪文件,找回來
      git checkout -- file  (git checkout 讓暫存區(qū)和工作區(qū)同步,修改刪除,都可以還原)

遠(yuǎn)程倉庫:
遠(yuǎn)程新建一個倉庫和本地已有倉庫關(guān)聯(lián)起來!
git remote add origin git@server-name:path/repo-name.git
//我們第一次推送master分支時,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令。
git push -u origin master

git clone git地址

branch control
git checkout -b dev   ====  ( git branch dev(創(chuàng)建) , git checkout dev(切換) )
-b 創(chuàng)建并切換

git branch  查看當(dāng)前分支(當(dāng)前分支會標(biāo)上*號)


在dev分支修改之后,git checkout master , git merge dev 切換到master分支,再合并指定分支到當(dāng)前分支

刪除分支  git branch -d dev   git branch

解決矛盾:新建一個分支dev 做了修改并commit 切回到master分支,也做了修改并commit 
此時 git merge dev就會產(chǎn)生矛盾
修改之后
git add & git commit 

git log --graph 以看到分支合并圖。
git log --graph --pretty=oneline --abbrev-commit  

no-ff參數(shù)代表合并的時候,保留記錄,沒有該參數(shù),刪除dev 后 ,則沒有 dev 記錄
git merge --no-ff -m "merge with no-ff" dev

git stash 存儲現(xiàn)場 

    save working derectory and index state WIP on dev:6224973 add merge
    HEAD is now at 622437 add merge

技術(shù)總是跟隨場景變化的!
總存在這樣的情況,你的工作完成到一半沒有add,沒有commit,未完成的工作一般是不允許commit 否則容易出問題。保持原來可行版本永遠(yuǎn)是最優(yōu)選擇
忽然要修一個BUG ,很緊迫,怎么辦?工作了那么多可不能丟啊   git stash保存現(xiàn)場吧
在主分支上開一個新分支 git checkout -b bug-01
修復(fù)bug 提交
合并 git merge --no-ff -m "xxx" bug-01
刪除新開分支 git branch -d bug-01
回到以前的工作分區(qū) git checkout dev
查看有多少現(xiàn)場 git stash list
只有一個現(xiàn)場 有兩個選擇:
git stash apply && git stash drop (刪除現(xiàn)場,避免影響后面的工作)
git stash pop (恢復(fù)現(xiàn)場并且刪除現(xiàn)場)
若有很多現(xiàn)場
stash@{0}:xxxxx
stash@{1}:xxxxx
stash@{2}:xxxxx
stash@{3}:xxxxx

git stash apply stash@{0}
git stash drop stash@{0}


git branch -D <name> 新分支沒有合并時候,強(qiáng)行刪除分支
刪除遠(yuǎn)程關(guān)聯(lián)
git remote remove origin || origin/dev || ...

查看遠(yuǎn)程庫信息
git remote 
git remote -v(詳細(xì))

完整的操作
1/
git remote add origin git地址
git push origin(遠(yuǎn)程倉庫)  dev(本地的dev分支)/anybranch
遠(yuǎn)程版本比你本地版本高
先pull,在push
git pull 提示no tracking information ,要先 git branch --set-upstream branch-name origin/branch-name
2/
git clone ssh_adress
git checkout -b <branch_name> origin/<branch_name>


標(biāo)簽一般記錄版本(每升一個版本,可以打個標(biāo)簽,下次要看這個版本的時候,不用記住commitID,只要記住你打的標(biāo)簽即可!)
標(biāo)簽一打,不能修改(說的是不能再次修改標(biāo)簽指定的版本!)

打標(biāo)簽?。?1、切換到需要打標(biāo)簽的分支上
git branch
git checkout master
git tag v1.0
OK啦

2、查看所有標(biāo)簽
git tag
v1.0
v1.2
v2.0
v2.1
v2.2
.....

注意,標(biāo)簽不是按時間順序列出,而是按字母排序的??梢杂胓it show <tagname>查看標(biāo)簽信息(其實(shí)也滿足了語義化,標(biāo)簽不就是把一個版本進(jìn)行語義化記錄嗎?)

git show v1.0
commitID
author
Date
  -m   
      information
....

-a 表示指定標(biāo)簽名 ,-m說明文字
git tag -a v0.1 -m "version 0.1 released" 3628164
git show v0.1

Tagger: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 26 07:28:11 2013 +0800

version 0.1 released

commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800

    append GPL

還可以通過-s用私鑰簽名一個標(biāo)簽:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
簽名采用PGP簽名,因此,必須首先安裝gpg(GnuPG),如果沒有找到gpg,或者沒有g(shù)pg密鑰對,就會報錯:
如果報錯,請參考GnuPG幫助文檔配置Key。

how to handle tag?
刪除標(biāo)簽
本地刪除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>
推送遠(yuǎn)程
git push origin <tag_name>
一次性推送所有tag
git push origin --tags

pull request *
忽略特殊文件

有些時候,你必須把某些文件放到Git工作目錄中,但又不能提交它們,比如保存了數(shù)據(jù)庫密碼的配置文件啦,等等,每次git status都會顯示Untracked files ...,有強(qiáng)迫癥的童鞋心里肯定不爽。

好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件,然后把要忽略的文件名填進(jìn)去,Git就會自動忽略這些文件。

配置別名
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容