Git 常用命令集合

初始化一個倉庫

//創(chuàng)建版本庫(倉庫胧砰,其實就是一個目錄)
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來打開所有的默認終端著色唆迁。
git config --global color.ui true
Git默認會調(diào)用你的環(huán)境變量editor定義的值作為文本編輯器鸭丛,如果沒有定義的話,會調(diào)用Vi來創(chuàng)建和編輯提交以及標簽信息唐责, 你可以使用core.editor改變默認編輯器
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   //時刻掌握倉庫當前的狀態(tài)鼠哥,告訴你有什么文件做了修改熟菲,是提交了還是未提交等信息
- git diff filename1   //查看filename1具體做了什么修改
  git diff *index.js   //查看以index.js結(jié)束的文件修改情況(路徑)
  git diff || git diff . || git diff * //查看所有文件具體修改

- git log  命令顯示從最近到最遠的提交日志
  如下所示:
  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 表示當前版本,也就是最新提交的版本
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)機也可以記錄COMMITID,所以關(guān)機之后也可以往前走一個版本

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把文件添加進去,實際上就是把文件修改添加到暫存區(qū)询枚;
第二步是用git commit提交更改违帆,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。
因為我們創(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)的比較

試驗了一下才理解二庵,stage或cache與雖說是暫存區(qū)贪染,緩沖區(qū),但commit并不是像想像那樣把這個區(qū)清空催享,估計只是打個同步的標志杭隙,內(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è)計得優(yōu)秀,因為Git跟蹤并管理的是修改鳄乏,而非文件
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:當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時蜗元,用命令git checkout -- file或渤。

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

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

刪除文件:
工作區(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ū)同步,修改刪除棋弥,都可以還原)

遠程倉庫:
遠程新建一個倉庫和本地已有倉庫關(guān)聯(lián)起來核偿!
git remote add origin git@server-name:path/repo-name.git
//我們第一次推送master分支時,加上了-u參數(shù)顽染,Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支漾岳,還會把本地的master分支和遠程的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  查看當前分支(當前分支會標上*號)


在dev分支修改之后尼荆,git checkout master 左腔, git merge dev 切換到master分支,再合并指定分支到當前分支

刪除分支  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 否則容易出問題摇锋。保持原來可行版本永遠是最優(yōu)選擇
忽然要修一個BUG 丹拯,很緊迫,怎么辦?工作了那么多可不能丟啊   git stash保存現(xiàn)場吧
在主分支上開一個新分支 git checkout -b bug-01
修復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 (恢復現(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> 新分支沒有合并時候,強行刪除分支
刪除遠程關(guān)聯(lián)
git remote remove origin || origin/dev || ...

查看遠程庫信息
git remote 
git remote -v(詳細)

完整的操作
1/
git remote add origin git地址
git push origin(遠程倉庫)  dev(本地的dev分支)/anybranch
遠程版本比你本地版本高
先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>


標簽一般記錄版本(每升一個版本融求,可以打個標簽,下次要看這個版本的時候算撮,不用記住commitID,只要記住你打的標簽即可I稹)
標簽一打,不能修改(說的是不能再次修改標簽指定的版本0构瘛)

打標簽O菥恕:
1、切換到需要打標簽的分支上
git branch
git checkout master
git tag v1.0
OK啦

2审洞、查看所有標簽
git tag
v1.0
v1.2
v2.0
v2.1
v2.2
.....

注意莱睁,標簽不是按時間順序列出,而是按字母排序的芒澜⊙鼋耍可以用git show <tagname>查看標簽信息(其實也滿足了語義化,標簽不就是把一個版本進行語義化記錄嗎痴晦?)

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

-a 表示指定標簽名 南吮,-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用私鑰簽名一個標簽:
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?
刪除標簽
本地刪除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>
推送遠程
git push origin <tag_name>
一次性推送所有tag
git push origin --tags

pull request *
忽略特殊文件

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

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

配置別名
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市践樱,隨后出現(xiàn)的幾起案子厂画,更是在濱河造成了極大的恐慌,老刑警劉巖拷邢,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袱院,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞭稼,警方通過查閱死者的電腦和手機忽洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來环肘,“玉大人欲虚,你說我怎么就攤上這事』诒ⅲ” “怎么了复哆?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荠商。 經(jīng)常有香客問我寂恬,道長,這世上最難降的妖魔是什么莱没? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任初肉,我火速辦了婚禮,結(jié)果婚禮上饰躲,老公的妹妹穿的比我還像新娘牙咏。我一直安慰自己臼隔,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布妄壶。 她就那樣靜靜地躺著摔握,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丁寄。 梳的紋絲不亂的頭發(fā)上氨淌,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音伊磺,去河邊找鬼盛正。 笑死,一個胖子當著我的面吹牛屑埋,可吹牛的內(nèi)容都是我干的豪筝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼摘能,長吁一口氣:“原來是場噩夢啊……” “哼续崖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起团搞,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤严望,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莺丑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體著蟹,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年梢莽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸披。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡昏名,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阵面,到底是詐尸還是另有隱情轻局,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布样刷,位于F島的核電站仑扑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏置鼻。R本人自食惡果不足惜镇饮,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箕母。 院中可真熱鬧储藐,春花似錦俱济、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辖源,卻和暖如春蔚携,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背克饶。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工酝蜒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彤路。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓秕硝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洲尊。 傳聞我的和親對象是個殘疾皇子远豺,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容